/** * Forum-specific export format * @todo Project file size / export time and possibly break into multiple files * @param ExportModel $Ex * */ protected function ForumExport($Ex) { // Get the characterset for the comments. $CharacterSet = $Ex->GetCharacterSet('Comment'); if ($CharacterSet) { $Ex->CharacterSet = $CharacterSet; } // Begin $Ex->BeginExport('', 'Vanilla 1.*'); // Users $User_Map = array('UserID' => 'UserID', 'Name' => 'Name', 'Password' => 'Password', 'Email' => 'Email', 'Icon' => 'Photo', 'CountComments' => 'CountComments', 'Discovery' => 'DiscoveryText'); $Ex->ExportTable('User', "SELECT * FROM :_User", $User_Map); // ":_" will be replaced by database prefix // Roles // Since the zero role is a valid role in Vanilla 1 then we'll have to reassign it. $R = $Ex->Query('select max(RoleID) as RoleID from :_Role'); $ZeroRoleID = 0; if (is_resource($R)) { while (($Row = @mysql_fetch_assoc($R)) !== false) { $ZeroRoleID = $Row['RoleID']; } } $ZeroRoleID++; /* 'RoleID' => 'int', 'Name' => 'varchar(100)', 'Description' => 'varchar(200)' */ $Role_Map = array('RoleID' => 'RoleID', 'Name' => 'Name', 'Description' => 'Description'); $Ex->ExportTable('Role', "select RoleID, Name, Description from :_Role union all select {$ZeroRoleID}, 'Applicant', 'Created by the Vanilla Porter'", $Role_Map); // UserRoles /* 'UserID' => 'int', 'RoleID' => 'int' */ $UserRole_Map = array('UserID' => 'UserID', 'RoleID' => 'RoleID'); $Ex->ExportTable('UserRole', "select UserID, case RoleID when 0 then {$ZeroRoleID} else RoleID end as RoleID from :_User", $UserRole_Map); // Categories /* 'CategoryID' => 'int', 'Name' => 'varchar(30)', 'Description' => 'varchar(250)', 'ParentCategoryID' => 'int', 'DateInserted' => 'datetime', 'InsertUserID' => 'int', 'DateUpdated' => 'datetime', 'UpdateUserID' => 'int' */ $Category_Map = array('CategoryID' => 'CategoryID', 'Name' => 'Name', 'Description' => 'Description'); $Ex->ExportTable('Category', "select CategoryID, Name, Description from :_Category", $Category_Map); // Discussions /* 'DiscussionID' => 'int', 'Name' => 'varchar(100)', 'CategoryID' => 'int', 'Body' => 'text', 'Format' => 'varchar(20)', 'DateInserted' => 'datetime', 'InsertUserID' => 'int', 'DateUpdated' => 'datetime', 'UpdateUserID' => 'int', 'Score' => 'float', 'Announce' => 'tinyint', 'Closed' => 'tinyint' */ $Discussion_Map = array('DiscussionID' => 'DiscussionID', 'Name' => 'Name', 'CategoryID' => 'CategoryID', 'DateCreated' => 'DateInserted', 'DateCreated2' => 'DateUpdated', 'AuthUserID' => 'InsertUserID', 'DateLastActive' => 'DateLastComment', 'AuthUserID2' => 'UpdateUserID', 'Closed' => 'Closed', 'Sticky' => 'Announce', 'CountComments' => 'CountComments', 'Sink' => 'Sink', 'LastUserID' => 'LastCommentUserID'); $Ex->ExportTable('Discussion', "SELECT d.*,\n d.LastUserID as LastCommentUserID,\n d.DateCreated as DateCreated2, d.AuthUserID as AuthUserID2\n FROM :_Discussion d\n WHERE coalesce(d.WhisperUserID, 0) = 0 and d.Active = 1", $Discussion_Map); // Comments /* 'CommentID' => 'int', 'DiscussionID' => 'int', 'DateInserted' => 'datetime', 'InsertUserID' => 'int', 'DateUpdated' => 'datetime', 'UpdateUserID' => 'int', 'Format' => 'varchar(20)', 'Body' => 'text', 'Score' => 'float' */ $Comment_Map = array('CommentID' => 'CommentID', 'DiscussionID' => 'DiscussionID', 'AuthUserID' => 'InsertUserID', 'DateCreated' => 'DateInserted', 'EditUserID' => 'UpdateUserID', 'DateEdited' => 'DateUpdated', 'Body' => 'Body', 'FormatType' => 'Format'); $Ex->ExportTable('Comment', "\n SELECT \n c.*\n FROM :_Comment c\n JOIN :_Discussion d\n ON c.DiscussionID = d.DiscussionID\n WHERE coalesce(d.WhisperUserID, 0) = 0\n AND coalesce(c.WhisperUserID, 0) = 0", $Comment_Map); $Ex->ExportTable('UserDiscussion', "\n SELECT\n w.UserID,\n w.DiscussionID,\n w.CountComments,\n w.LastViewed as DateLastViewed,\n case when b.UserID is not null then 1 else 0 end AS Bookmarked\n FROM :_UserDiscussionWatch w\n LEFT JOIN :_UserBookmark b\n ON w.DiscussionID = b.DiscussionID AND w.UserID = b.UserID"); // Conversations // Create a mapping table for conversations. // This cannot be a temporary table because of some of the union selects it is used in below. $Ex->Query("create table :_V1Conversation (ConversationID int auto_increment primary key, DiscussionID int, UserID1 int, UserID2 int, DateCreated datetime, EditUserID int, DateEdited datetime)"); $Ex->Query("insert :_V1Conversation (DiscussionID, UserID1, UserID2, DateCreated, EditUserID, DateEdited)\n select\n DiscussionID,\n AuthUserID as UserID1,\n WhisperUserID as UserID2,\n min(DateCreated),\n max(EditUserID),\n max(DateEdited)\n from :_Comment\n where coalesce(WhisperUserID, 0) <> 0\n group by DiscussionID, AuthUserID, WhisperUserID\n\n union\n\n select\n DiscussionID,\n AuthUserID as UserID1,\n WhisperUserID as UserID2,\n DateCreated,\n WhisperFromLastUserID,\n DateLastWhisper\n from :_Discussion\n where coalesce(WhisperUserID, 0) <> 0"); // Delete redundant conversations. $Ex->Query("create index ix_V1UserID1 on :_V1Conversation (DiscussionID, UserID1)"); // for speed $Ex->Query("delete t.*\n from :_V1Conversation t\n inner join :_Comment c\n on c.DiscussionID = t.DiscussionID\n and c.AuthUserID = t.UserID2\n and c.WhisperUserID = t.UserID1\n and c.AuthUserID < c.WhisperUserID"); $Conversation_Map = array('UserID1' => 'InsertUserID', 'DateCreated' => 'DateInserted', 'EditUserID' => 'UpdateUserID', 'DateEdited' => 'DateUpdated'); $Ex->ExportTable('Conversation', "select * from :_V1Conversation", $Conversation_Map); // ConversationMessage /* 'MessageID' => 'int', 'ConversationID' => 'int', 'Body' => 'text', 'InsertUserID' => 'int', 'DateInserted' => 'datetime' */ $ConversationMessage_Map = array('CommentID' => 'MessageID', 'DiscussionID' => 'ConversationID', 'Body' => 'Body', 'AuthUserID' => 'InsertUserID', 'DateCreated' => 'DateInserted'); $Ex->ExportTable('ConversationMessage', "\n select c.CommentID, t.ConversationID, c.AuthUserID, c.DateCreated, c.Body\n from :_Comment c\n join :_V1Conversation t\n on t.DiscussionID = c.DiscussionID\n and c.WhisperUserID in (t.UserID1, t.UserID2)\n and c.AuthUserID in (t.UserID1, t.UserID2)\n where c.WhisperUserID > 0\n\n union\n\n select c.CommentID, t.ConversationID, c.AuthUserID, c.DateCreated, c.Body\n from :_Comment c\n join :_Discussion d\n on c.DiscussionID = d.DiscussionID\n join :_V1Conversation t\n on t.DiscussionID = d.DiscussionID\n and d.WhisperUserID in (t.UserID1, t.UserID2)\n and d.AuthUserID in (t.UserID1, t.UserID2)\n where d.WhisperUserID > 0", $ConversationMessage_Map); // UserConversation /* 'UserID' => 'int', 'ConversationID' => 'int', 'LastMessageID' => 'int' */ $UserConversation_Map = array('UserID' => 'UserID', 'ConversationID' => 'ConversationID'); $Ex->ExportTable('UserConversation', "select UserID1 as UserID, ConversationID\n from :_V1Conversation\n\n union\n\n select UserID2 as UserID, ConversationID\n from :_V1Conversation", $UserConversation_Map); $Ex->Query("drop table :_V1Conversation"); // Media if ($Ex->Exists('Attachment')) { $Media_Map = array('AttachmentID' => 'MediaID', 'Name' => 'Name', 'MimeType' => 'Type', 'Size' => 'Size', 'Path' => array('Column' => 'Path', 'Filter' => array($this, 'StripMediaPath')), 'UserID' => 'InsertUserID', 'DateCreated' => 'DateInserted', 'CommentID' => 'ForeignID'); $Ex->ExportTable('Media', "select a.*, 'local' as StorageMethod, 'comment' as ForeignTable from :_Attachment a", $Media_Map); } // End $Ex->EndExport(); }
/** * * @param ExportModel $Ex */ public function ForumExport($Ex) { $CharacterSet = $Ex->GetCharacterSet('yaf_Topic'); if ($CharacterSet) { $Ex->CharacterSet = $CharacterSet; } $Ex->BeginExport('', 'YAF.NET (Yet Another Forum)'); $Ex->SourcePrefix = 'yaf_'; // User. $User_Map = array('UserID' => 'UserID', 'Name' => 'Name', 'Email' => 'Email', 'Joined' => 'DateInserted', 'LastVisit' => array('Column' => 'DateLastVisit', 'Type' => 'datetime'), 'IP' => 'InsertIPAddress', 'Avatar' => 'Photo', 'RankID' => array('Column' => 'RankID', 'Type' => 'int'), 'Points' => array('Column' => 'Points', 'Type' => 'int'), 'LastActivity' => 'DateLastActive', 'Password2' => array('Column' => 'Password', 'Filter' => array($this, 'ConvertPassword')), 'HashMethod' => 'HashMethod'); $Ex->ExportTable('User', "\n select\n u.*,\n m.Password as Password2,\n m.PasswordSalt,\n m.PasswordFormat,\n m.LastActivity,\n 'yaf' as HashMethod\n from yaf_User u\n left join yaf_prov_Membership m\n on u.ProviderUserKey = m.UserID;", $User_Map); // Role. $Role_Map = array('GroupID' => 'RoleID', 'Name' => 'Name'); $Ex->ExportTable('Role', "\n select *\n from yaf_Group;", $Role_Map); // UserRole. $UserRole_Map = array('UserID' => 'UserID', 'GroupID' => 'RoleID'); $Ex->ExportTable('UserRole', 'select * from yaf_UserGroup', $UserRole_Map); // Rank. $Rank_Map = array('RankID' => 'RankID', 'Level' => 'Level', 'Name' => 'Name', 'Label' => 'Label'); $Ex->ExportTable('Rank', "\n select\n r.*,\n RankID as Level,\n Name as Label\n from yaf_Rank r;", $Rank_Map); // Signatures. $Ex->ExportTable('UserMeta', "\n select\n UserID,\n 'Plugin.Signatures.Sig' as `Name`,\n Signature as `Value`\n from yaf_User\n where Signature <> ''\n\n union all\n\n select\n UserID,\n 'Plugin.Signatures.Format' as `Name`,\n 'BBCode' as `Value`\n from yaf_User\n where Signature <> '';"); // Category. $Category_Map = array('ForumID' => 'CategoryID', 'ParentID' => 'ParentCategoryID', 'Name' => 'Name', 'Description' => 'Description', 'SortOrder' => 'Sort'); $Ex->ExportTable('Category', "\n select\n f.ForumID,\n case when f.ParentID = 0 then f.CategoryID * 1000 else f.ParentID end as ParentID,\n f.Name,\n f.Description,\n f.SortOrder\n from yaf_Forum f\n\n union all\n\n select\n c.CategoryID * 1000,\n null,\n c.Name,\n null,\n c.SortOrder\n from yaf_Category c;", $Category_Map); // Discussion. $Discussion_Map = array('TopicID' => 'DiscussionID', 'ForumID' => 'CategoryID', 'UserID' => 'InsertUserID', 'Posted' => 'DateInserted', 'Topic' => 'Name', 'Views' => 'CountViews', 'Announce' => 'Announce'); $Ex->ExportTable('Discussion', "\n select\n case when t.Priority > 0 then 1 else 0 end as Announce,\n t.Flags & 1 as Closed,\n t.*\n from yaf_Topic t\n where t.IsDeleted = 0;", $Discussion_Map); // Comment. $Comment_Map = array('MessageID' => 'CommentID', 'TopicID' => 'DiscussionID', 'ReplyTo' => array('Column' => 'ReplyToCommentID', 'Type' => 'int'), 'UserID' => 'InsertUserID', 'Posted' => 'DateInserted', 'Message' => 'Body', 'Format' => 'Format', 'IP' => 'InsertIPAddress', 'Edited' => array('Column' => 'DateUpdated', 'Filter' => array($this, 'CleanDate')), 'EditedBy' => 'UpdateUserID'); $Ex->ExportTable('Comment', "\n select\n case when m.Flags & 1 = 1 then 'Html' else 'BBCode' end as Format,\n m.*\n from yaf_Message m\n where IsDeleted = 0;", $Comment_Map); // Conversation. $this->_ExportConversationTemps(); $Conversation_Map = array('PMessageID' => 'ConversationID', 'FromUserID' => 'InsertUserID', 'Created' => 'DateInserted', 'Title' => array('Column' => 'Subject', 'Type' => 'varchar(512)')); $Ex->ExportTable('Conversation', "\n select\n pm.*,\n g.Title\n from z_pmgroup g\n join yaf_PMessage pm\n on g.Group_ID = pm.PMessageID;", $Conversation_Map); // UserConversation. $UserConversation_Map = array('PM_ID' => 'ConversationID', 'User_ID' => 'UserID', 'Deleted' => 'Deleted'); $Ex->ExportTable('UserConversation', "\n select pto.*\n from z_pmto pto\n join z_pmgroup g\n on pto.PM_ID = g.Group_ID;", $UserConversation_Map); // ConversationMessage. $ConversationMessage_Map = array('PMessageID' => 'MessageID', 'Group_ID' => 'ConversationID', 'FromUserID' => 'InsertUserID', 'Created' => 'DateInserted', 'Body' => 'Body', 'Format' => 'Format'); $Ex->ExportTable('ConversationMessage', "\n select\n pm.*,\n case when pm.Flags & 1 = 1 then 'Html' else 'BBCode' end as Format,\n t.Group_ID\n from yaf_PMessage pm\n join z_pmtext t\n on t.PM_ID = pm.PMessageID;", $ConversationMessage_Map); $Ex->EndExport(); }