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; }
/** * 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); }
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(); }
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); }
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); }
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(); }
/** * 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); }
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(); }
/** * 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(); }
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')); } }
// 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); }
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)); } }
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(); }
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(); }
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; }