private function _GenerateConfContent($Template)
 {
     $SQLSock = '';
     if ('' != trim(ini_get('mysql.default_socket'))) {
         $SQLSock = 'sql_sock = ' . ini_get('mysql.default_socket');
     }
     //Check to see if grabing any of the tags
     ///@todo fix this stopgap solution with something more robust
     //Get list of tags
     $SQL = Gdn::SQL();
     if (Gdn::Structure()->TableExists('TagDiscussion')) {
         $Tags = TRUE;
     } else {
         $Tags = FALSE;
     }
     $DBPrefix = C('Database.Name') . '.' . C('Database.DatabasePrefix', 'GDN_');
     //join these 2
     $Search = array('{sql_sock}' => $SQLSock, '{sql_host}' => $this->Settings['Install']->Host, '{sql_user}' => C('Database.User'), '{sql_pass}' => C('Database.Password'), '{sql_db}' => C('Database.Name'), '{charset_type}' => C('Garden.Charset', 'utf-8'), '{charset_type_mysql}' => C('Database.CharacterEncoding', 'utf8'), '{install_path}' => $this->Settings['Install']->InstallPath, '{assests_path}' => PATH_PLUGINS . DS . 'SphinxSearchLite' . DS . 'assests' . DS, '{searchd_port}' => $this->Settings['Install']->Port, '{log_path}' => $this->Settings['Install']->LogPath, '{query_path}' => $this->Settings['Install']->QueryPath, '{PID_path}' => $this->Settings['Install']->PIDPath, '{data_path}' => $this->Settings['Install']->DataPath, '{db_prefix}' => $DBPrefix, '{ss_prefix}' => $this->Settings['Install']->Prefix);
     /* '{tag_select}' => $Tags == TRUE ? '(SELECT td.TagID as TagName\
        FROM '.$DBPrefix.'TagDiscussion td\
        WHERE pic.GDN_Comment.DiscussionID = td.DiscussionID),\\' : '\\',*/
     $ReWritedContent = str_replace(array_keys($Search), $Search, $Template);
     //echo nl2br($ReWritedContent); die;
     return $ReWritedContent;
 }
Example #2
0
 /**
  * First time setup of CountriesOnline plugin.
  */
 public function Setup()
 {
     // Time threshold, in seconds, for signed in users grouped by country.
     SaveToConfig('Plugin.CountriesOnline.TimeThreshold', $this->default_time_threshold);
     $Structure = Gdn::Structure();
     $Structure->Table('CountriesOnline')->Column('UserID', 'int(11)', false, 'primary')->Column('CountryCode', 'char(2)', 'VF')->Column('Timestamp', 'int(10)', false, 'key')->Set(false, false);
 }
Example #3
0
 public function DefineTables()
 {
     $St = Gdn::Structure();
     foreach ($this->Structures as $Table => $Columns) {
         $St->Table(self::TABLE_PREFIX . $Table);
         foreach ($Columns as $Name => $Type) {
             $St->Column($Name, $Type, NULL);
         }
         $St->Set();
     }
 }
 /**
  * Database changes needed for this plugin.
  */
 public function Structure()
 {
     $Structure = Gdn::Structure();
     $Structure->Table('Flag')->Column('DiscussionID', 'int(11)', TRUE)->Column('InsertUserID', 'int(11)', FALSE, 'key')->Column('InsertName', 'varchar(64)')->Column('AuthorID', 'int(11)')->Column('AuthorName', 'varchar(64)')->Column('ForeignURL', 'varchar(255)', FALSE, 'key')->Column('ForeignID', 'int(11)')->Column('ForeignType', 'varchar(32)')->Column('Comment', 'text')->Column('DateInserted', 'datetime')->Set(FALSE, FALSE);
 }
 /**
  * Define all of the structure releated to reactions.
  * @return type
  */
 public function StructureReactions()
 {
     // Define 'Accept' reaction
     if (!$this->Reactions) {
         return;
     }
     $Rm = new ReactionModel();
     if (Gdn::Structure()->Table('ReactionType')->ColumnExists('Hidden')) {
         // AcceptAnswer
         $Rm->DefineReactionType(array('UrlCode' => 'AcceptAnswer', 'Name' => 'Accept Answer', 'Sort' => 0, 'Class' => 'Good', 'IncrementColumn' => 'Score', 'IncrementValue' => 5, 'Points' => 3, 'Permission' => 'Garden.Curation.Manage', 'Hidden' => 1, 'Description' => "When someone correctly answers a question, they are rewarded with this reaction."));
     }
     Gdn::Structure()->Reset();
 }
Example #6
0
 public function RunStructure($AddonCode = NULL, $Explicit = FALSE, $Drop = FALSE)
 {
     // Get the structure files for all of the enabled applications.
     $ApplicationManager = new Gdn_ApplicationManager();
     $Apps = $ApplicationManager->EnabledApplications();
     $AppNames = ConsolidateArrayValuesByKey($Apps, 'Folder');
     $Paths = array();
     foreach ($Apps as $Key => $AppInfo) {
         $Path = PATH_APPLICATIONS . "/{$AppInfo['Folder']}/settings/structure.php";
         if (file_exists($Path)) {
             $Paths[] = $Path;
         }
         Gdn::ApplicationManager()->RegisterPermissions($Key, $this->Validation);
     }
     // Execute the structures.
     $Database = Gdn::Database();
     $SQL = Gdn::SQL();
     $Structure = Gdn::Structure();
     foreach ($Paths as $Path) {
         include $Path;
     }
     // Execute the structures for all of the plugins.
     $PluginManager = Gdn::PluginManager();
     $Registered = $PluginManager->RegisteredPlugins();
     foreach ($Registered as $ClassName => $Enabled) {
         if (!$Enabled) {
             continue;
         }
         try {
             $Plugin = $PluginManager->GetPluginInstance($ClassName, Gdn_PluginManager::ACCESS_CLASSNAME);
             if (method_exists($Plugin, 'Structure')) {
                 Trace("{$ClassName}->Structure()");
                 $Plugin->Structure();
             }
         } catch (Exception $Ex) {
             // Do nothing, plugin wouldn't load/structure.
             if (Debug()) {
                 throw $Ex;
             }
         }
     }
 }
 public function UpdateCounts()
 {
     // This option could take a while so set the timeout.
     set_time_limit(60 * 5);
     // Define the necessary SQL.
     $Sqls = array();
     if (!$this->ImportExists('Discussion', 'LastCommentID')) {
         $Sqls['Discussion.LastCommentID'] = $this->GetCountSQL('max', 'Discussion', 'Comment');
     }
     if (!$this->ImportExists('Discussion', 'DateLastComment')) {
         $Sqls['Discussion.DateLastComment'] = "update :_Discussion d\r\n         left join :_Comment c\r\n            on d.LastCommentID = c.CommentID\r\n         set d.DateLastComment = coalesce(c.DateInserted, d.DateInserted)";
     }
     if (!$this->ImportExists('Discussion', 'CountBookmarks')) {
         $Sqls['Discussion.CountBookmarks'] = "update :_Discussion d\r\n            set CountBookmarks = (\r\n               select count(ud.DiscussionID)\r\n               from :_UserDiscussion ud\r\n               where ud.Bookmarked = 1\r\n                  and ud.DiscussionID = d.DiscussionID\r\n            )";
     }
     if (!$this->ImportExists('Discussion', 'LastCommentUserID')) {
         $Sqls['Discussion.LastCommentUseID'] = "update :_Discussion d\r\n         join :_Comment c\r\n            on d.LastCommentID = c.CommentID\r\n         set d.LastCommentUserID = c.InsertUserID";
     }
     if (!$this->ImportExists('Discussion', 'Body')) {
         // Update the body of the discussion if it isn't there.
         if (!$this->ImportExists('Discussion', 'FirstCommentID')) {
             $Sqls['Discussion.FirstCommentID'] = $this->GetCountSQL('min', 'Discussion', 'Comment', 'FirstCommentID', 'CommentID');
         }
         $Sqls['Discussion.Body'] = "update :_Discussion d\r\n         join :_Comment c\r\n            on d.FirstCommentID = c.CommentID\r\n         set d.Body = c.Body, d.Format = c.Format";
         if ($this->ImportExists('Media') && Gdn::Structure()->TableExists('Media')) {
             // Comment Media has to go onto the discussion.
             $Sqls['Media.Foreign'] = "update :_Media m\r\n            join :_Discussion d\r\n               on d.FirstCommentID = m.ForeignID and m.ForeignTable = 'comment'\r\n            set m.ForeignID = d.DiscussionID, m.ForeignTable = 'discussion'";
         }
         $Sqls['Comment.FirstComment.Delete'] = "delete c.*\r\n         from :_Comment c\r\n         inner join :_Discussion d\r\n           on d.FirstCommentID = c.CommentID";
     }
     if (!$this->ImportExists('Discussion', 'CountComments')) {
         $Sqls['Discussion.CountComments'] = $this->GetCountSQL('count', 'Discussion', 'Comment');
     }
     if ($this->ImportExists('UserDiscussion') && !$this->ImportExists('UserDiscussion', 'CountComments') && $this->ImportExists('UserDiscussion', 'DateLastViewed')) {
         $Sqls['UserDiscussuion.CountComments'] = "update :_UserDiscussion ud\r\n         set CountComments = (\r\n           select count(c.CommentID)\r\n           from :_Comment c\r\n           where c.DiscussionID = ud.DiscussionID\r\n             and c.DateInserted <= ud.DateLastViewed)";
     }
     if ($this->ImportExists('Tag') && $this->ImportExists('TagDiscussion')) {
         $Sqls['Tag.CoundDiscussions'] = $this->GetCountSQL('count', 'Tag', 'TagDiscussion', 'CountDiscussions', 'TagID');
     }
     if ($this->ImportExists('Poll') && Gdn::Structure()->TableExists('Poll')) {
         $Sqls['PollOption.CountVotes'] = $this->GetCountSQL('count', 'PollOption', 'PollVote', 'CountVotes', 'PollOptionID');
         $Sqls['Poll.CountOptions'] = $this->GetCountSQL('count', 'Poll', 'PollOption', 'CountOptions', 'PollID');
         $Sqls['Poll.CountVotes'] = $this->GetCountSQL('sum', 'Poll', 'PollOption', 'CountVotes', 'CountVotes', 'PollID');
     }
     if ($this->ImportExists('Activity', 'ActivityType')) {
         $Sqls['Activity.ActivityTypeID'] = "\r\n            update :_Activity a\r\n            join :_ActivityType t\r\n               on a.ActivityType = t.Name\r\n            set a.ActivityTypeID = t.ActivityTypeID";
     }
     if ($this->ImportExists('Tag') && $this->ImportExists('TagDiscussion')) {
         $Sqls['Tag.CoundDiscussions'] = $this->GetCountSQL('count', 'Tag', 'TagDiscussion', 'CountDiscussions', 'TagID');
     }
     $Sqls['Category.CountDiscussions'] = $this->GetCountSQL('count', 'Category', 'Discussion');
     $Sqls['Category.CountComments'] = $this->GetCountSQL('sum', 'Category', 'Discussion', 'CountComments', 'CountComments');
     if (!$this->ImportExists('Category', 'PermissionCategoryID')) {
         $Sqls['Category.PermissionCategoryID'] = "update :_Category set PermissionCategoryID = -1";
     }
     if ($this->ImportExists('Conversation') && $this->ImportExists('ConversationMessage')) {
         $Sqls['Conversation.FirstMessageID'] = $this->GetCountSQL('min', 'Conversation', 'ConversationMessage', 'FirstMessageID', 'MessageID');
         if (!$this->ImportExists('Conversation', 'CountMessages')) {
             $Sqls['Conversation.CountMessages'] = $this->GetCountSQL('count', 'Conversation', 'ConversationMessage', 'CountMessages', 'MessageID');
         }
         if (!$this->ImportExists('Conversation', 'LastMessageID')) {
             $Sqls['Conversation.LastMessageID'] = $this->GetCountSQL('max', 'Conversation', 'ConversationMessage', 'LastMessageID', 'MessageID');
         }
         if (!$this->ImportExists('Conversation', 'DateUpdated')) {
             $Sqls['Converstation.DateUpdated'] = "update :_Conversation c join :_ConversationMessage m on c.LastMessageID = m.MessageID set c.DateUpdated = m.DateInserted";
         }
         if ($this->ImportExists('UserConversation')) {
             if (!$this->ImportExists('UserConversation', 'LastMessageID')) {
                 if ($this->ImportExists('UserConversation', 'DateLastViewed')) {
                     // Get the value from the DateLastViewed.
                     $Sqls['UserConversation.LastMessageID'] = "update :_UserConversation uc\r\n                     set LastMessageID = (\r\n                       select max(MessageID)\r\n                       from :_ConversationMessage m\r\n                       where m.ConversationID = uc.ConversationID\r\n                         and m.DateInserted >= uc.DateLastViewed)";
                 } else {
                     // Get the value from the conversation.
                     // In this case just mark all of the messages read.
                     $Sqls['UserConversation.LastMessageID'] = "update :_UserConversation uc\r\n                     join :_Conversation c\r\n                       on c.ConversationID = uc.ConversationID\r\n                     set uc.CountReadMessages = c.CountMessages,\r\n                       uc.LastMessageID = c.LastMessageID";
                 }
             } elseif (!$this->ImportExists('UserConversation', 'DateLastViewed')) {
                 // We have the last message so grab the date from that.
                 $Sqls['UserConversation.DateLastViewed'] = "update :_UserConversation uc\r\n                     join :_ConversationMessage m\r\n                       on m.ConversationID = uc.ConversationID\r\n                         and m.MessageID = uc.LastMessageID\r\n                     set uc.DateLastViewed = m.DateInserted";
             }
         }
     }
     // User counts.
     if (!$this->ImportExists('User', 'DateFirstVisit')) {
         $Sqls['User.DateFirstVisit'] = 'update :_User set DateFirstVisit = DateInserted';
     }
     if (!$this->ImportExists('User', 'CountDiscussions')) {
         $Sqls['User.CountDiscussions'] = $this->GetCountSQL('count', 'User', 'Discussion', 'CountDiscussions', 'DiscussionID', 'UserID', 'InsertUserID');
     }
     if (!$this->ImportExists('User', 'CountComments')) {
         $Sqls['User.CountComments'] = $this->GetCountSQL('count', 'User', 'Comment', 'CountComments', 'CommentID', 'UserID', 'InsertUserID');
     }
     if (!$this->ImportExists('User', 'CountBookmarks')) {
         $Sqls['User.CountBookmarks'] = "update :_User u\r\n            set CountBookmarks = (\r\n               select count(ud.DiscussionID)\r\n               from :_UserDiscussion ud\r\n               where ud.Bookmarked = 1\r\n                  and ud.UserID = u.UserID\r\n            )";
     }
     //      if (!$this->ImportExists('User', 'CountUnreadConversations')) {
     //         $Sqls['User.CountUnreadConversations'] =
     //            'update :_User u
     //            set u.CountUnreadConversations = (
     //              select count(c.ConversationID)
     //              from :_Conversation c
     //              inner join :_UserConversation uc
     //                on c.ConversationID = uc.ConversationID
     //              where uc.UserID = u.UserID
     //                and uc.CountReadMessages < c.CountMessages
     //            )';
     //      }
     // The updates start here.
     $CurrentSubstep = GetValue('CurrentSubstep', $this->Data, 0);
     //      $Sqls2 = array();
     //      $i = 1;
     //      foreach ($Sqls as $Name => $Sql) {
     //         $Sqls2[] = "/* $i. $Name */\n"
     //            .str_replace(':_', $this->Database->DatabasePrefix, $Sql)
     //            .";\n";
     //         $i++;
     //      }
     //      throw new Exception(implode("\n", $Sqls2));
     // Execute the SQL.
     $Keys = array_keys($Sqls);
     for ($i = $CurrentSubstep; $i < count($Keys); $i++) {
         $this->Data['CurrentStepMessage'] = sprintf(T('%s of %s'), $CurrentSubstep + 1, count($Keys));
         $Sql = $Sqls[$Keys[$i]];
         $this->Query($Sql);
         if ($this->Timer->ElapsedTime() > $this->MaxStepTime) {
             $this->Data['CurrentSubstep'] = $i + 1;
             return FALSE;
         }
     }
     if (isset($this->Data['CurrentSubstep'])) {
         unset($this->Data['CurrentSubstep']);
     }
     $this->Data['CurrentStepMessage'] = '';
     // Update the url codes of categories.
     if (!$this->ImportExists('Category', 'UrlCode')) {
         $Categories = CategoryModel::Categories();
         $TakenCodes = array();
         foreach ($Categories as $Category) {
             $UrlCode = urldecode(Gdn_Format::Url($Category['Name']));
             if (strlen($UrlCode) > 50) {
                 $UrlCode = $Category['CategoryID'];
             }
             if (in_array($UrlCode, $TakenCodes)) {
                 $ParentCategory = CategoryModel::Categories($Category['ParentCategoryID']);
                 if ($ParentCategory && $ParentCategory['CategoryID'] != -1) {
                     $UrlCode = Gdn_Format::Url($ParentCategory['Name']) . '-' . $UrlCode;
                 }
                 if (in_array($UrlCode, $TakenCodes)) {
                     $UrlCode = $Category['CategoryID'];
                 }
             }
             $TakenCodes[] = $UrlCode;
             Gdn::SQL()->Put('Category', array('UrlCode' => $UrlCode), array('CategoryID' => $Category['CategoryID']));
         }
     }
     // Rebuild the category tree.
     $CategoryModel = new CategoryModel();
     $CategoryModel->RebuildTree();
     $this->SetCategoryPermissionIDs();
     return TRUE;
 }
 public function Setup()
 {
     $Structure = Gdn::Structure();
     // Construct the user comment table.
     $Structure->Table('UserComment')->Column('CommentID', 'int', 4, FALSE, NULL, 'primary', FALSE)->Column('UserID', 'int', 4, FALSE, NULL, 'primary', FALSE)->Column('Score', 'int', 4, TRUE)->Column('InsertUserID', 'int', 10, FALSE, NULL, 'key')->Column('UpdateUserID', 'int', 10, TRUE)->Column('DateInserted', 'datetime')->Column('DateUpdated', 'datetime')->Set(FALSE, FALSE);
     // Add the total score to the comment table.
     $Structure->Table('Comment')->Column('SumScore', 'int', 4, TRUE)->Set(FALSE, FALSE);
 }
 /**
  * Commits the required updates to the structure of the database
  */
 public function Structure()
 {
     // Loading up our structure object to enable the ability to modify the database
     $Structure = Gdn::Structure();
     // Adding a table to cache all of the retrieved Steam profile information
     $Structure->Table('SteamProfileCache')->PrimaryKey('ProfileCacheID')->Column('SteamID64', 'varchar(20)', FALSE)->Column('ProfileXML', 'text', FALSE)->Column('DateRetrieved', 'datetime', FALSE)->Set(FALSE, FALSE);
 }
Example #10
0
 public function Setup()
 {
     if (!file_exists(PATH_CACHE . DS . 'css')) {
         mkdir(PATH_CACHE . DS . 'css');
     }
     // Setup the theme table.
     $St = Gdn::Structure();
     $St->Table('ThemeSetting')->Column('Name', 'varchar', '50', FALSE, NULL, 'primary')->Column('Setting', 'varchar', '50')->Set(FALSE, FALSE);
 }
Example #11
0
 public function Setup()
 {
     $Structure = Gdn::Structure();
     $Structure->Table('Whosonline')->Column('UserID', 'int(11)', FALSE, 'primary')->Column('Timestamp', 'datetime')->Column('Invisible', 'int(1)', 0)->Set(FALSE, FALSE);
 }
 public function Structure()
 {
     /*		Gdn::Structure()
     			->Table('Comment')
     			->Column('ThankCount', 'usmallint', 0)
     			->Set();
     		
     		Gdn::Structure()
     			->Table('Discussion')
     			->Column('ThankCount', 'usmallint', 0)
     			->Set();*/
     Gdn::Structure()->Table('User')->Column('ReceivedThankCount', 'usmallint', 0)->Set();
     Gdn::Structure()->Table('ThanksLog')->Column('UserID', 'umediumint', False, 'key')->Column('CommentID', 'umediumint', 0)->Column('DiscussionID', 'umediumint', 0)->Column('DateInserted', 'datetime')->Column('InsertUserID', 'umediumint', False, 'key')->Engine('MyISAM')->Set();
     $RequestArgs = Gdn::Controller()->RequestArgs;
     if (ArrayHasValue($RequestArgs, 'vanilla')) {
         ThanksLogModel::RecalculateUserReceivedThankCount();
     }
     //ThanksLogModel::RecalculateCommentThankCount();
     //ThanksLogModel::RecalculateDiscussionThankCount();
 }
Example #13
0
 /**
  * Add a field to the db for storing the "State" of a question.
  */
 public function Setup()
 {
     // Add some fields to the database
     $Structure = Gdn::Structure();
     // "Unanswered" or "Answered"
     $Structure->Table('Discussion')->Column('State', 'varchar(30)', TRUE)->Set(FALSE, FALSE);
     //    SaveToConfig('Vanilla.Categories.Use', FALSE);
     //      SaveToConfig('Vanilla.Comments.AutoOffset', FALSE);
 }
 /**
  * Database changes needed for this plugin.
  */
 public function Structure()
 {
     $Structure = Gdn::Structure();
     $Structure->Table('Flag')->Column('DiscussionID', 'int(11)', TRUE)->Column('InsertUserID', 'int(11)', FALSE, 'key')->Column('InsertName', 'varchar(64)')->Column('AuthorID', 'int(11)')->Column('AuthorName', 'varchar(64)')->Column('ForeignURL', 'varchar(255)', FALSE, 'key')->Column('ForeignID', 'int(11)')->Column('ForeignType', 'varchar(32)')->Column('Comment', 'text')->Column('DateInserted', 'datetime')->Set(FALSE, FALSE);
     // Turn off disabled Flagging plugin (deprecated)
     if (C('Plugins.Flagging.Enabled', NULL) === FALSE) {
         RemoveFromConfig('EnabledPlugins.Flagging');
     }
 }
 private function Search($Sanitized)
 {
     $this->SphinxClient->ResetFilters();
     $this->SphinxClient->ResetGroupBy();
     $MainSearch = "";
     $Limit = $this->Settings['Admin']->LimitResultsPage;
     $Offset = ($Sanitized['Offset'] - 1) * $Limit;
     //limit per page
     if ($Offset < 0) {
         $Offset = 0;
     }
     //Make sure results respect category permissions depending on user performing search
     $Permissions = Gdn::Session()->GetPermissions();
     // Get user permissions
     $Permissions = $Permissions['Vanilla.Discussions.View'];
     // Only care about 'viewing' permissions
     $this->SphinxClient->SetFilter(SS_ATTR_CATPERMID, $Permissions);
     if (!empty($Sanitized['ForumList'])) {
         //filter Forum categories
         $Categories = $Sanitized['ForumList'];
         if (!in_array(0, $Categories)) {
             //If this is TRUE, than user selected to search in "All" categories...no filtering then requried
             if ($Sanitized['SearchChildren']) {
                 $Categories = $this->GetCategories($Categories);
             }
             //get children IDs
             $this->SphinxClient->SetFilter(SS_ATTR_CATID, $Categories);
             //no children required, just get whatever was posted
         }
     }
     if (!empty($Sanitized['TagList'])) {
         if (Gdn::Structure()->TableExists('TagDiscussion')) {
             //check to see if tagging plugin is enabled
             $TagIDs = $this->GetTagIDs($Sanitized['TagList']);
             if (sizeof($TagIDs) > 0) {
                 //maybe someone input an invalid tag string that does not match any in the database...
                 $this->SphinxClient->SetFilter('TagID', $TagIDs);
             }
         }
     }
     if (!empty($Sanitized['User'])) {
         // Place quotes around user to support usernames with spaces
         $MainSearch .= $this->FieldSearch('"' . $Sanitized['User'] . '"', array(SS_FIELD_USERNAME)) . " ";
         // Return documents with this user
     }
     if (!empty($Sanitized['MemberList'])) {
         //filter by member
         // $String = $this->OperatorOrSearch($Sanitized['MemberList']);
         // $SubQuery .= $this->FieldSearch($String, array(SS_FIELD_USERNAME));
     }
     if (!empty($Sanitized['WithReplies'])) {
         //only return threads that have comments
         $this->SphinxClient->SetFilterRange(SS_ATTR_COUNTCOMENTS, 1, 1, TRUE);
         //exclude documents with exactly 0 comments (the first topic post counts as 1)
     }
     if (isset($Sanitized['Date']) && $Sanitized['Date'] != 'All') {
         //don't filter by date if the whole query string is gone
         $Time = $this->SetTime($Sanitized['Date']);
         $this->SphinxClient->SetFilterRange(SS_ATTR_DOCDATEINSERTED, $Time, now());
     }
     $Query = $this->SetRankAndQuery($Sanitized['Match'], $Sanitized['Query']);
     //depending on selected match, need to format the query string to comply with the extended syntax
     $this->SetSortMode($Sanitized['Order']);
     $this->SphinxClient->SetLimits($Offset, $this->Settings['Admin']->LimitResultsPage, $MaxMatches = 0);
     //limit the results pageination
     // if ($Sanitized['Match'] != 'Extended') { //extended query do not add these
     if (true) {
         //extended query DO ADD THESE FOR EXTENDED!
         if ($Sanitized['TitlesOnly'] == 1) {
             // If this is checked, user is NOT manually constructing query (with @ symbol)
             $Query = $this->SphinxClient->EscapeString($Query);
             //Escapes characters that are treated as special operators by the query language parser (i.e @title => /@/title). Returns an escaped string.
             $MainSearch .= $this->FieldSearch($Query, array(SS_FIELD_TITLE));
             // Search only titles
         } else {
             if (strpos($Sanitized['Query'], "@") === false) {
                 // If the query DOES contain an '@' symbol, then do not construct the query since user is doing manually
                 $MainSearch .= $this->FieldSearch($Query, array(SS_FIELD_TITLE, SS_FIELD_BODY));
             } else {
                 $MainSearch .= $Sanitized['Query'];
             }
             // User is manually constructing the query (i.e query = @title DVD)
         }
     } else {
         $MainSearch = $Query;
     }
     $Query = ' ' . $MainSearch;
     $QueryIndex = $this->SphinxClient->AddQuery($Query . ' ', SS_INDEX_DIST, $this->Name);
     $this->Queries[] = array('Name' => $this->Name, 'Index' => $QueryIndex);
 }
Example #16
0
 public function Structure($AppName = 'garden', $CaptureOnly = '1', $Drop = '0', $Explicit = '0')
 {
     $this->Permission('Garden.AdminUser.Only');
     $File = CombinePaths(array(PATH_APPLICATIONS, $AppName, 'settings', 'structure.php'), DS);
     if (file_exists($File)) {
         $Validation = new Gdn_Validation();
         $Database = Gdn::Database();
         $Drop = $Drop == '0' ? FALSE : TRUE;
         $Explicit = $Explicit == '0' ? FALSE : TRUE;
         $CaptureOnly = !($CaptureOnly == '0');
         $Structure = Gdn::Structure();
         $Structure->CaptureOnly = $CaptureOnly;
         $this->SetData('CaptureOnly', $Structure->CaptureOnly);
         $this->SetData('Drop', $Drop);
         $this->SetData('Explicit', $Explicit);
         $this->SetData('ApplicationName', $AppName);
         $this->SetData('Status', '');
         try {
             include $File;
         } catch (Exception $ex) {
             $this->Form->AddError(strip_tags($ex->getMessage()));
         }
         if (property_exists($Structure, 'CapturedSql')) {
             $this->SetData('CapturedSql', (array) $Structure->CapturedSql);
         } else {
             $this->SetData('CapturedSql', array());
         }
         if ($this->Form->ErrorCount() == 0 && !$CaptureOnly) {
             $this->SetData('Status', 'The structure was successfully executed.');
         }
     }
     //$this->ControllerName = 'home';
     //$this->View = 'filenotfound';
     $this->AddCssFile('admin.css');
     $this->Render();
 }
Example #17
0
 /**
  * This creates the database structure for the plugin.
  * 
  * @return void
  */
 public function Structure()
 {
     GDN::Structure()->Table('AllLikes')->PrimaryKey('ID')->Column('CommentID', 'int(11)', TRUE)->Column('DiscussionID', 'int(11)', TRUE)->Column('UserID', 'int(11)', FALSE)->Set(TRUE);
     Gdn::Structure()->Table('User')->Column('Liked', 'int(11)', 0)->Column('DisLiked', 'int(11)', 0)->Column('ILiked', 'int(11)', 0)->Set();
 }
 public function CleanUp()
 {
     Gdn::Structure()->Table('ThemeSetting')->Drop();
 }
Example #19
0
 public function Setup()
 {
     $Structure = Gdn::Structure();
     // Make sure to add the ReplyCommentID field if it is not there already.
     $Structure->Table('Discussion')->Column('CountReplies', 'int', '0')->Set(FALSE, FALSE);
     $Structure->Table('Comment')->Column('ReplyCommentID', 'int', TRUE, 'key')->Column('CountReplies', 'int', '0')->Set(FALSE, FALSE);
     $Structure->Table('CommentWatch')->Column('CountReplies', 'int', '0')->Set(FALSE, FALSE);
     // Add the activities & activity types for replies
     $SQL = Gdn::SQL();
     if ($SQL->GetWhere('ActivityType', array('Name' => 'CommentReply'))->NumRows() == 0) {
         $SQL->Insert('ActivityType', array('AllowComments' => '0', 'Name' => 'CommentReply', 'FullHeadline' => '%1$s replied to %4$s %8$s.', 'ProfileHeadline' => '%1$s replied to %4$s %8$s.', 'RouteCode' => 'comment', 'Notify' => '1', 'Public' => '0'));
     }
 }
Example #20
0
// To run queries.
$Construct = $Database->Structure();
// To modify and add database tables.
$Validation = new Gdn_Validation();
// To validate permissions (if necessary).
include_once PATH_APPLICATIONS . '/candy/models/class.sectionmodel.php';
include_once PATH_APPLICATIONS . '/candy/settings/bootstrap.php';
Gdn::Structure()->Table('Chunk')->PrimaryKey('ChunkID', 'usmallint')->Column('Name', 'varchar(80)')->Column('Body', 'text', True)->Column('Format', 'varchar(20)', True)->Column('Url', 'varchar(80)', True)->Column('InsertUserID', 'int', False)->Column('DateInserted', 'datetime')->Column('UpdateUserID', 'int', True)->Column('DateUpdated', 'datetime', True)->Engine('MyISAM')->Set($Explicit, $Drop);
Gdn::Structure()->Table('Route')->Column('URI', 'char(80)', False, 'primary')->Column('RequestUri', 'char(120)')->Engine('MyISAM')->Set($Explicit, $Drop);
$SectionModel = Gdn::Factory('SectionModel');
$HasRoot = False;
Gdn::Structure()->Table($SectionModel->Name)->PrimaryKey('SectionID', 'usmallint')->Column('TreeLeft', 'usmallint', 0)->Column('TreeRight', 'usmallint', 0)->Column('Depth', 'utinyint', 0)->Column('ParentID', 'usmallint', 0)->Column('Name', 'varchar(120)')->Column('InTopMenu', 'tinyint(1)', 0)->Column('Url', 'varchar(80)', True)->Column('URI', 'varchar(80)', True)->Column('RequestUri', 'char(120)', True)->Column('Mask', 'uint', True)->Engine('InnoDB')->Set($Explicit, $Drop);
try {
    $HasRoot = $SQL->GetCount($SectionModel->Name, array('SectionID' => 1)) > 0;
} catch (Exception $Ex) {
}
if (!$HasRoot) {
    $SQL->Insert($SectionModel->Name, array('SectionID' => 1, 'TreeLeft' => 1, 'TreeRight' => 2, 'Depth' => 0, 'Name' => T('Home')));
}
Gdn::Structure()->Table('Page')->PrimaryKey('PageID', 'usmallint')->Column('SectionID', 'usmallint', True, 'index')->Column('Title', 'varchar(200)')->Column('Body', 'text', True)->Column('Format', 'varchar(20)', 'xHtml')->Column('Visible', 'tinyint(1)', 0)->Column('URI', 'varchar(80)', True)->Column('Tags', 'varchar(250)', True)->Column('MasterView', 'varchar(30)', True)->Column('View', 'varchar(30)', True)->Column('Sort', 'smallint', 0)->Column('InsertUserID', 'int')->Column('DateInserted', 'datetime')->Column('UpdateUserID', 'int', True)->Column('DateUpdated', 'datetime', True)->Column('MetaDescription', 'varchar(500)', True)->Column('MetaKeywords', 'varchar(250)', True)->Column('MetaRobots', 'varchar(150)', True)->Column('MetaTitle', 'varchar(255)', True)->Column('CustomCss', 'text', True)->Column('CustomJs', 'text', True)->Engine('MyISAM')->Set($Explicit, $Drop);
// Set route
if (!Gdn::Router()->GetRoute('map')) {
    Gdn::Router()->SetRoute('map', 'candy/content/map', 'Internal');
}
$PermissionModel = Gdn::PermissionModel();
$PermissionModel->Define(array('Candy.Settings.View', 'Candy.Sections.Edit', 'Candy.Sections.Add', 'Candy.Sections.Delete', 'Candy.Sections.Move', 'Candy.Sections.Swap', 'Candy.Pages.Add', 'Candy.Pages.Edit', 'Candy.Pages.Delete', 'Candy.Pages.Raw', 'Candy.Pages.Meta', 'Candy.Chunks.Edit', 'Candy.Chunks.Delete', 'Candy.Routes.Manage'));
$PermissionModel->Save(array('RoleID' => 16, 'Candy.Settings.View' => 1));
if (!isset($CaptureOnly) || $CaptureOnly == False) {
    $Version = Gdn::ApplicationManager()->GetApplicationInfo('Candy', 'Version');
    SaveToConfig('Candy.Version', $Version);
}
Example #21
0
 function K($Name, $Value = Null)
 {
     static $SQL, $Cache, $DataTableCreated;
     if (is_null($DataTableCreated)) {
         $DataTableCreated = C('Plugins.UsefulFunctions.DataTableCreated');
         if ($DataTableCreated === False) {
             Gdn::Structure()->Table('Data')->Column('Name', 'varchar(200)', False, 'unique')->Column('Value', 'text')->Set(False, False);
             $DataTableCreated = True;
             SaveToConfig('Plugins.UsefulFunctions.DataTableCreated', $DataTableCreated);
         }
     }
     // Select
     if ($SQL === Null) {
         $SQL = Gdn::SQL();
     }
     if (is_string($Name) && $Value === Null) {
         $Modificator = $Name[0];
         if (in_array($Modificator, array('#', '%', '@'))) {
             $Name = substr($Name, 1);
         }
         if (!isset($Cache[$Name])) {
             switch ($Modificator) {
                 case '#':
                     $SQL->Where('Name', $Name);
                     break;
                 case '%':
                 case '@':
                 default:
                     $SQL->Like('Name', $Name, 'right');
             }
             $Result = Null;
             $ResultSet = $SQL->Select('Name, Value')->From('Data')->Get();
             if ($ResultSet->NumRows() == 0) {
                 return False;
             } elseif ($Modificator == '%') {
                 foreach ($ResultSet as $Data) {
                     $S = "['" . str_replace('.', "']['", $Data->Name) . "']";
                     eval("\$Value =& \$Result{$S};");
                     // eval is evil
                     if (is_null($Value) || $Value === '' || is_array($Value)) {
                         $Value = $Cache[$Data->Name] = Gdn_Format::Unserialize($Data->Value);
                     } else {
                         // TODO: FIX ME
                         // Lost value. What should we do? Delete? Throw Exception?
                     }
                 }
             } elseif ($Modificator == '@' || $ResultSet->NumRows() > 1) {
                 foreach ($ResultSet as $Data) {
                     $K = array_pop(explode('.', $Data->Name));
                     $Result[$K] = $Cache[$Data->Name] = Gdn_Format::Unserialize($Data->Value);
                 }
                 // reduce result array
                 //if ($Modificator == '@') while(count($Result) == 1) $Result = array_shift($Result);
             } else {
                 $Result = $ResultSet->FirstRow()->Value;
                 $Result = Gdn_Format::Unserialize($Result);
             }
             $Cache[$Name] = $Result;
         }
         return $Cache[$Name];
     }
     // Delete
     if ($Value === False) {
         if (is_array($Name)) {
             return $SQL->WhereIn('Name', $Name)->Delete('Data');
         }
         if (is_string($Name)) {
             return $SQL->Like('Name', $Name, 'right')->Delete('Data');
         }
         trigger_error(sprintf('Incorrect type of Key (%s)', gettype($Name)));
     }
     // Insert/Update
     if (!is_array($Name)) {
         $Name = array($Name => $Value);
     }
     foreach ($Name as $Key => $Value) {
         $Value = Gdn_Format::Serialize($Value);
         $SQL->Replace('Data', array('Value' => $Value), array('Name' => $Key));
     }
 }
Example #22
0
 public function Setup()
 {
     if (!file_exists(PATH_CACHE . DS . 'css')) {
         mkdir(PATH_CACHE . DS . 'css');
     }
     // Setup the theme table.
     $St = Gdn::Structure();
     $St->Table('ThemeSetting')->Column('Name', 'varchar', '50', FALSE, NULL, 'primary')->Column('Setting', 'varchar', '50')->Set(FALSE, FALSE);
     // Insert default values.
     $St->Database->Query('insert ' . $St->Database->DatabasePrefix . 'ThemeSetting (Name, Setting) values ' . "('Banner Background Color', '#44c7f4'),\n\t\t('Banner Font Color', '#fff'),\n\t\t('Banner Font Shadow Color', '#30ACD6'),\n\t\t('Banner Hover Font Color', '#f3fcff'),\n\t\t('Body Alt Background Color', '#f8f8f8'),\n\t\t('Body Background Color', '#ffffff'),\n\t\t('Body Default Font Color', '#000'),\n\t\t('Body Heading Font Color', '#000'),\n\t\t('Body Hover Font Color', '#ff0084'),\n\t\t('Body Line Color', '#eee'),\n\t\t('Body Link Font Color', '#2786c2'),\n\t\t('Body Subheading Font Color', '#6C6C6C'),\n\t\t('Body Text Font Color', '#555'),\n\t\t('Discussion My Background Color', '#F5FCFF'),\n\t\t('Discussion New Background Color', '#ffd'),\n\t\t('Menu Background Color', '#44c7f4'),\n\t\t('Menu Font Color', '#fff'),\n\t\t('Menu Hover Background Color', '#28bcef'),\n\t\t('Menu Hover Font Color', '#fff'),\n\t\t('Meta Font Color', '#2b2d33'),\n\t\t('Meta Label Font Color', '#80828c'),\n\t\t('Panel Background Color', '#E9F9FF'),\n\t\t('Panel Font Color', '#2786C2'),\n\t\t('Panel Hover Font Color', '#e9f9ff'),\n\t\t('Panel Inlay Background Color', '#f0fbff'),\n\t\t('Panel Inlay Border Color', '#caf0fe'),\n\t\t('Panel Inlay Font Color', '#0766a2'),\n\t\t('Panel Selected Background Color', '#fff'),\n\t\t('Panel Selected Font Color', '#ff0084')");
 }
 public function Structure()
 {
     Gdn::Structure()->Table('Category')->Column('AutoExpirePeriod', 'varchar(150)', NULL)->Set();
     Gdn::Structure()->Table('Discussion')->Column('AutoExpire', 'int(4)', 0)->Column('DateReOpened', 'datetime', NULL)->Set();
     //Save Version for hot update
     SaveToConfig('Plugins.AutoExpireDiscussions.Version', $this->PluginInfo['Version']);
 }
 public function RunStructure($AddonCode = NULL, $Explicit = FALSE, $Drop = FALSE)
 {
     // Get the structure files for all of the enabled applications.
     $ApplicationManager = new Gdn_ApplicationManager();
     $Apps = $ApplicationManager->EnabledApplications();
     $AppNames = ConsolidateArrayValuesByKey($Apps, 'Folder');
     $Paths = array();
     foreach ($Apps as $AppInfo) {
         $Path = PATH_APPLICATIONS . "/{$AppInfo['Folder']}/settings/structure.php";
         if (file_exists($Path)) {
             $Paths[] = $Path;
         }
     }
     // Execute the structures.
     $Database = Gdn::Database();
     $SQL = Gdn::SQL();
     $Structure = Gdn::Structure();
     foreach ($Paths as $Path) {
         include $Path;
     }
     // Execute the structures for all of the plugins.
     $PluginManager = Gdn::PluginManager();
     $Plugins = $PluginManager->EnabledPlugins();
     foreach ($Plugins as $Key => $PluginInfo) {
         $PluginName = GetValue('Index', $PluginInfo);
         $Plugin = $PluginManager->GetPluginInstance($PluginName, Gdn_PluginManager::ACCESS_PLUGINNAME);
         if (method_exists($Plugin, 'Structure')) {
             $Plugin->Structure();
         }
     }
 }
   public function Structure($AppName = 'all', $CaptureOnly = '1', $Drop = '0', $Explicit = '0') {
      $this->Permission('Garden.Settings.Manage');
      $Files = array();
      $AppName = $AppName == '' ? 'all': $AppName;
      if ($AppName == 'all') {
			// Load all application structure files.
			$ApplicationManager = new Gdn_ApplicationManager();
			$Apps = $ApplicationManager->EnabledApplications();
			$AppNames = ConsolidateArrayValuesByKey($Apps, 'Folder');
			foreach ($AppNames as $AppName) {
				$Files[] = CombinePaths(array(PATH_APPLICATIONS, $AppName, 'settings', 'structure.php'), DS);
			}
			$AppName = 'all';
      } else {
			 // Load that specific application structure file.
         $Files[] = CombinePaths(array(PATH_APPLICATIONS, $AppName, 'settings', 'structure.php'), DS);
      }
      $Validation = new Gdn_Validation();
      $Database = Gdn::Database();
      $Drop = $Drop == '0' ? FALSE : TRUE;
      $Explicit = $Explicit == '0' ? FALSE : TRUE;
      $CaptureOnly = !($CaptureOnly == '0');
      $Structure = Gdn::Structure();
      $Structure->CaptureOnly = $CaptureOnly;
      $SQL = Gdn::SQL();
      $SQL->CaptureModifications = $CaptureOnly;
      $this->SetData('CaptureOnly', $Structure->CaptureOnly);
      $this->SetData('Drop', $Drop);
      $this->SetData('Explicit', $Explicit);
      $this->SetData('ApplicationName', $AppName);
      $this->SetData('Status', '');
      $FoundStructureFile = FALSE;
      foreach ($Files as $File) {
         if (file_exists($File)) {
			   $FoundStructureFile = TRUE;
			   try {
			      include($File);
			   } catch (Exception $Ex) {
			      $this->Form->AddError($Ex);
			   }
			}
      }

      // Run the structure of all of the plugins.
      $Plugins = Gdn::PluginManager()->EnabledPlugins();
      foreach ($Plugins as $PluginKey => $Plugin) {
         $PluginInstance = Gdn::PluginManager()->GetPluginInstance($PluginKey, Gdn_PluginManager::ACCESS_PLUGINNAME);
         if (method_exists($PluginInstance, 'Structure'))
            $PluginInstance->Structure();
      }

      if (property_exists($Structure->Database, 'CapturedSql'))
         $this->SetData('CapturedSql', (array)$Structure->Database->CapturedSql);
      else
         $this->SetData('CapturedSql', array());

      if ($this->Form->ErrorCount() == 0 && !$CaptureOnly && $FoundStructureFile)
         $this->SetData('Status', 'The structure was successfully executed.');

		$this->AddSideMenu('dashboard/settings/configure');
      $this->AddCssFile('admin.css');
      $this->SetData('Title', T('Database Structure Upgrades'));
      $this->Render();
   }
Example #26
0
 public function Setup()
 {
     $Construct = Gdn::Structure();
     $Construct->Table('Poll')->PrimaryKey('id')->Column('discussion_id', 'int', TRUE)->Column('title', 'varchar(255)')->Set($Explicit, $Drop);
     $Construct->Table('PollAnswers')->PrimaryKey('id')->Column('poll_id', 'int', TRUE)->Column('title', 'varchar(255)')->Column('votes', 'int')->Set($Explicit, $Drop);
     $Construct->Table('PollRecords')->PrimaryKey('id')->Column('poll_id', 'int', TRUE)->Column('user_id', 'int')->Set($Explicit, $Drop);
 }
 /**
  * Database changes.
  *
  * @since 1.0
  * @access public
  */
 public function Structure()
 {
     $Structure = Gdn::Structure();
     $Structure->Table('User')->Column('DateAllViewed', 'datetime', NULL)->Set();
 }
 /**
  * Plugin setup
  *
  * This method is fired only once, immediately after the plugin has been enabled in the /plugins/ screen,
  * and is a great place to perform one-time setup tasks, such as database structure changes,
  * addition/modification ofconfig file settings, filesystem changes, etc.
  */
 public function Setup()
 {
     // Set up the plugin's default values
     //        SaveToConfig('Plugin.OurHideComments.TrimSize', 100);
     //        SaveToConfig('Plugin.OurHideComments.RenderCondition', "all");
     Gdn::Structure()->Table('HiddenComment')->primaryKey('CommentID')->Set(FALSE, FALSE);
     /*
     // Create table GDN_Example, if it doesn't already exist
     Gdn::Structure()
        ->Table('Example')
        ->PrimaryKey('ExampleID')
        ->Column('Name', 'varchar(255)')
        ->Column('Type', 'varchar(128)')
        ->Column('Size', 'int(11)')
        ->Column('InsertUserID', 'int(11)')
        ->Column('DateInserted', 'datetime')
        ->Column('ForeignID', 'int(11)', TRUE)
        ->Column('ForeignTable', 'varchar(24)', TRUE)
        ->Set(FALSE, FALSE);
     */
 }
 public function Structure()
 {
     Gdn::Structure()->Table('Conversation')->Column('DiscussionID', 'int', NULL, 'index')->Set();
 }
Example #30
0
 public function UpdateCounts()
 {
     // Define the necessary SQL.
     $Sqls = array();
     if (!$this->ImportExists('Discussion', 'CountComments')) {
         $Sqls['Discussion.CountComments'] = $this->GetCountSQL('count', 'Discussion', 'Comment');
     }
     if (!$this->ImportExists('Discussion', 'LastCommentID')) {
         $Sqls['Discussion.LastCommentID'] = $this->GetCountSQL('max', 'Discussion', 'Comment');
     }
     if (!$this->ImportExists('Discussion', 'DateLastComment')) {
         $Sqls['Discussion.DateLastComment'] = "update :_Discussion d\r\n         join :_Comment c\r\n            on d.LastCommentID = c.CommentID\r\n         set d.DateLastComment = c.DateInserted";
     }
     if (!$this->ImportExists('Discussion', 'CountBookmarks')) {
         $Sqls['Discussion.CountBookmarks'] = "update :_Discussion d\r\n            set CountBookmarks = (\r\n               select count(ud.DiscussionID)\r\n               from :_UserDiscussion ud\r\n               where ud.Bookmarked = 1\r\n                  and ud.DiscussionID = d.DiscussionID\r\n            )";
     }
     if (!$this->ImportExists('Discussion', 'LastCommentUserID')) {
         $Sqls['Discussion.LastCommentUseID'] = "update :_Discussion d\r\n         join :_Comment c\r\n            on d.LastCommentID = c.CommentID\r\n         set d.LastCommentUserID = c.InsertUserID";
     }
     if (!$this->ImportExists('Discussion', 'Body')) {
         // Update the body of the discussion if it isn't there.
         if (!$this->ImportExists('Discussion', 'FirstCommentID')) {
             $Sqls['Discussion.FirstCommentID'] = $this->GetCountSQL('min', 'Discussion', 'Comment', 'FirstCommentID', 'CommentID');
         }
         $Sqls['Discussion.Body'] = "update :_Discussion d\r\n         join :_Comment c\r\n            on d.FirstCommentID = c.CommentID\r\n         set d.Body = c.Body, d.Format = c.Format";
         $Sqls['Comment.FirstComment.Delete'] = "delete :_Comment c\r\n         from :_Comment c\r\n         inner join :_Discussion d\r\n           on d.FirstCommentID = c.CommentID";
     }
     if ($this->ImportExists('UserDiscussion') && !$this->ImportExists('UserDiscussion', 'CountComments') && $this->ImportExists('UserDiscussion', 'DateLastViewed')) {
         $Sqls['UserDiscussuion.CountComments'] = "update :_UserDiscussion ud\r\n         set CountComments = (\r\n           select count(c.CommentID)\r\n           from :_Comment c\r\n           where c.DiscussionID = ud.DiscussionID\r\n             and c.DateInserted <= ud.DateLastViewed)";
     }
     $Sqls['Category.CountDiscussions'] = $this->GetCountSQL('count', 'Category', 'Discussion');
     if ($this->ImportExists('Conversation') && $this->ImportExists('ConversationMessage')) {
         $Sqls['Conversation.FirstMessageID'] = $this->GetCountSQL('min', 'Conversation', 'ConversationMessage', 'FirstMessageID', 'MessageID');
         if (!$this->ImportExists('Conversation', 'CountMessages')) {
             $Sqls['Conversation.CountMessages'] = $this->GetCountSQL('count', 'Conversation', 'ConversationMessage', 'CountMessages', 'MessageID');
         }
         if (!$this->ImportExists('Conversation', 'LastMessageID')) {
             $Sqls['Conversation.LastMessageID'] = $this->GetCountSQL('max', 'Conversation', 'ConversationMessage', 'LastMessageID', 'MessageID');
         }
         if ($this->ImportExists('UserConversation')) {
             if (!$this->ImportExists('UserConversation', 'LastMessageID')) {
                 if ($this->ImportExists('UserConversation', 'DateLastViewed')) {
                     // Get the value from the DateLastViewed.
                     $Sqls['UserConversation.LastMessageID'] = "update :_UserConversation uc\r\n                     set LastMessageID = (\r\n                       select max(MessageID)\r\n                       from :_ConversationMessage m\r\n                       where m.ConversationID = uc.ConversationID\r\n                         and m.DateInserted >= uc.DateLastViewed)";
                 } else {
                     // Get the value from the conversation.
                     // In this case just mark all of the messages read.
                     $Sqls['UserConversation.LastMessageID'] = "update :_UserConversation uc\r\n                     join :_Conversation c\r\n                       on c.ConversationID = uc.ConversationID\r\n                     set uc.CountReadMessages = c.CountMessages,\r\n                       uc.LastMessageID = c.LastMessageID";
                 }
             } elseif (!$this->ImportExists('UserConversation', 'DateLastViewed')) {
                 // We have the last message so grab the date from that.
                 $Sqls['UserConversation.DateLastViewed'] = "update :_UserConversation uc\r\n                     join :_ConversationMessage m\r\n                       on m.ConversationID = uc.ConversationID\r\n                         and m.MessageID = uc.LastMessageID\r\n                     set uc.DateLastViewed = m.DateInserted";
             }
         }
     }
     // User counts.
     if (!$this->ImportExists('User', 'CountDiscussions')) {
         $Sqls['User.CountDiscussions'] = $this->GetCountSQL('count', 'User', 'Discussion', 'CountDiscussions', 'DiscussionID', 'UserID', 'InsertUserID');
     }
     if (!$this->ImportExists('User', 'CountComments')) {
         $Sqls['User.CountComments'] = $this->GetCountSQL('count', 'User', 'Comment', 'CountComments', 'CommentID', 'UserID', 'InsertUserID');
     }
     if (!$this->ImportExists('User', 'CountBookmarks')) {
         $Sqls['User.CountBookmarks'] = "update :_User u\r\n            set CountBookmarks = (\r\n               select count(ud.DiscussionID)\r\n               from :_UserDiscussion ud\r\n               where ud.Bookmarked = 1\r\n                  and ud.UserID = u.UserID\r\n            )";
     }
     if (!$this->ImportExists('User', 'CountUnreadConversations')) {
         $Sqls['User.CountUnreadConversations'] = 'update :_User u
         set u.CountUnreadConversations = (
           select count(c.ConversationID)
           from :_Conversation c
           inner join :_UserConversation uc
             on c.ConversationID = uc.ConversationID
           where uc.UserID = u.UserID
             and uc.CountReadMessages < c.CountMessages
         )';
     }
     // The updates start here.
     $CurrentSubstep = GetValue('CurrentSubstep', $this->Data, 0);
     if ($CurrentSubstep == 0) {
         // Add the FirstCommentID to the discussion table.
         Gdn::Structure()->Table('Discussion')->Column('FirstCommentID', 'int', NULL)->Set(FALSE, FALSE);
     }
     // Execute the SQL.
     $Keys = array_keys($Sqls);
     for ($i = $CurrentSubstep; $i < count($Keys); $i++) {
         $this->Data['CurrentStepMessage'] = sprintf(T('%s of %s'), $CurrentSubstep + 1, count($Keys));
         $Sql = $Sqls[$Keys[$i]];
         $this->Query($Sql);
         if ($this->Timer->ElapsedTime() > $this->MaxStepTime) {
             $this->Data['CurrentSubstep'] = $i + 1;
             return FALSE;
         }
     }
     if (isset($this->Data['CurrentSubstep'])) {
         unset($this->Data['CurrentSubstep']);
     }
     // Remove the FirstCommentID from the discussion table.
     Gdn::Structure()->Table('Discussion')->DropColumn('FirstCommentID');
     $this->Data['CurrentStepMessage'] = '';
     // Update the url codes of categories.
     if (!$this->ImportExists('Category', 'UrlCode')) {
         $Categories = Gdn::SQL()->Get('Category')->ResultArray();
         foreach ($Categories as $Category) {
             Gdn::SQL()->Put('Category', array('UrlCode' => Gdn_Format::Url($Category['Name'])), array('CategoryID' => $Category['CategoryID']));
         }
     }
     return TRUE;
 }