b2evolution

Multilingual multiuser multiblog engine

b2evolution Technical Documentation (0.9.x) [ class tree: install ] [ index: install ] [ all elements ]

Source for file _functions_evoupgrade.php

Documentation is available at _functions_evoupgrade.php

  1. <?php
  2. /**
  3.  * This file implements upgrading of DB tables
  4.  *
  5.  * b2evolution - {@link http://b2evolution.net/}
  6.  * Released under GNU GPL License - {@link http://b2evolution.net/about/license.html}
  7.  * @copyright (c)2003-2005 by Francois PLANQUE - {@link http://fplanque.net/}
  8.  *
  9.  * @package install
  10.  */
  11. if!defined('DB_USER') ) die'Please, do not access this page directly.' );
  12.  
  13. /**
  14.  * Create a DB version checkpoint
  15.  *
  16.  * This is useful when the next operation might timeout or fail!
  17.  * The checkpoint will allow to restart the script and continue where it stopped
  18.  *
  19.  * @param string version of DB at checkpoint
  20.  */
  21. function set_upgrade_checkpoint$version )
  22. {
  23.     global $DB;
  24.  
  25.     echo "Creating DB schema version checkpoint at $version... ";
  26.  
  27.     if$version 8060 )
  28.     {
  29.         $query 'UPDATE T_settings SET db_version = '.$version;
  30.     }
  31.     else
  32.     {
  33.         $query "UPDATE T_settings
  34.                                 SET set_value = '$version'
  35.                                 WHERE set_name = 'db_version'";
  36.     }
  37.     $DB->query$query );
  38.  
  39.     echo "OK.<br />\n";
  40. }
  41.  
  42. /**
  43.  * converts languages in a given table into according locales
  44.  *
  45.  * @author blueyed
  46.  * @param string name of the table
  47.  * @param string name of the column where lang is stored
  48.  * @param string name of the table's ID column
  49.  */
  50. function convert_lang_to_locale$table$columnlang$columnID )
  51. {
  52.     global $DB$locales$default_locale;
  53.  
  54.     if!preg_match('/[a-z]{2}-[A-Z]{2}(-.{1,14})?/'$default_locale) )
  55.     // we want a valid locale
  56.         $default_locale 'en-EU';
  57.     }
  58.  
  59.     echo 'Converting langs to locales for '$table'...<br />';
  60.  
  61.     // query given languages in $table
  62.     $query "SELECT $columnID$columnlang FROM $table";
  63.     $rows $DB->get_results$queryARRAY_A );
  64.     $languagestoconvert array();
  65.     ifcount$rows ) ) foreach$rows as $row )
  66.     {
  67.         // remember the ID for that locale
  68.         $languagestoconvert$row$columnlang ] ][$row$columnID ];
  69.     }
  70.  
  71.     foreach$languagestoconvert as $lkey => $lIDs)
  72.     // converting the languages we've found
  73.         $converted false;
  74.         echo '&nbsp; Converting lang \''$lkey'\' '// (with IDs: '. implode( ', ', $lIDs ). ').. ';
  75.  
  76.         ifpreg_match('/[a-z]{2}-[A-Z]{2}(-.{1,14})?/'$lkey) )
  77.         // Already valid
  78.             echo 'nothing to update, already valid!<br />';
  79.             continue;
  80.         }
  81.  
  82.         if( (strlen($lkey== 2&& substr$default_locale0!= $lkey ) )
  83.         // we have an old two letter lang code to convert
  84.             // and it doesn't match the default locale
  85.             foreach$locales as $newlkey => $v )
  86.             {  // loop given locales
  87.                 ifsubstr($newlkey02== strtolower($lkey) ) # TODO: check if valid/suitable
  88.                 {  // if language matches, update
  89.                     $converted $DB->query"UPDATE $table
  90.                                                                         SET $columnlang = '$newlkey'
  91.                                                                         WHERE $columnlang = '$lkey');
  92.                     echo 'to locale \''$newlkey'\'<br />';
  93.                     break;
  94.                 }
  95.             }
  96.         }
  97.  
  98.         if!$converted )
  99.         // we have nothing converted yet, setting default:
  100.             $DB->query"UPDATE $table
  101.                                             SET $columnlang = '$default_locale'
  102.                                         WHERE $columnlang = '$lkey');
  103.             echo 'forced to default locale \''$default_locale'\'<br />';
  104.         }
  105.     }
  106.     echo "\n";
  107. }  // convert_lang_to_locale(-)
  108.  
  109.  
  110. /**
  111.  * upgrade_b2evo_tables(-)
  112.  */
  113. {
  114.     global $tableposts$tableusers$tablesettings$tablecategories$tablecomments,
  115.                     $tableblogs$tablepostcats$tablehitlog$tableantispam$tablegroups$tableblogusers;
  116.     global $baseurl$old_db_version$new_db_version;
  117.     global $Group_Admins$Group_Priviledged$Group_Bloggers$Group_Users;
  118.     global $locales$default_locale;
  119.     global $DB;
  120.     global $admin_url;
  121.  
  122.     // Check DB version:
  123.     check_db_version();
  124.     if$old_db_version == $new_db_version )
  125.     {
  126.         echo '<p>'.T_('The database schema is already up to date. There is nothing to do.').'</p>';
  127.         printf'<p>'.T_('Now you can <a %s>log in</a> with your usual %s username and password.').'</p>''href="'.$admin_url.'/"''b2evolution' );
  128.         return false;
  129.     }
  130.  
  131.  
  132.     if$old_db_version 8010 )
  133.     {
  134.         echo 'Upgrading users table... ';
  135.         $query "ALTER TABLE $tableusers
  136.                             MODIFY COLUMN user_pass CHAR(32) NOT NULL";
  137.         $DB->query$query );
  138.         echo "OK.<br />\n";
  139.  
  140.         echo 'Upgrading blogs table... ';
  141.         $query "ALTER TABLE $tableblogs
  142.                             MODIFY COLUMN blog_lang VARCHAR(20) NOT NULL DEFAULT 'en_US',
  143.                             MODIFY COLUMN blog_longdesc TEXT NULL DEFAULT NULL";
  144.         $DB->query$query );
  145.         echo "OK.<br />\n";
  146.  
  147.         echo 'Upgrading categories table... ';
  148.         $query "ALTER TABLE $tablecategories
  149.                             ADD COLUMN cat_description VARCHAR(250) NULL DEFAULT NULL,
  150.                             ADD COLUMN cat_longdesc TEXT NULL DEFAULT NULL,
  151.                             ADD COLUMN cat_icon VARCHAR(30) NULL DEFAULT NULL";
  152.         $DB->query$query );
  153.         echo "OK.<br />\n";
  154.  
  155.         echo 'Upgrading posts table... ';
  156.         $query "ALTER TABLE $tableposts
  157.                             MODIFY COLUMN post_lang VARCHAR(20) NOT NULL DEFAULT 'en_US',
  158.                             ADD COLUMN post_urltitle VARCHAR(50) NULL DEFAULT NULL AFTER post_title,
  159.                             ADD COLUMN post_url VARCHAR(250) NULL DEFAULT NULL AFTER post_urltitle,
  160.                             ADD COLUMN post_comments ENUM('disabled', 'open', 'closed') NOT NULL DEFAULT 'open' AFTER post_wordcount";
  161.         $DB->query$query );
  162.         echo "OK.<br />\n";
  163.  
  164.         echo 'Generating wordcounts... ';
  165.         $query "SELECT ID, post_content FROM $tableposts WHERE post_wordcount IS NULL";
  166.         $q $DB->get_results$queryARRAY_A );
  167.         ifcount$q ) ) foreach$q as $row )
  168.         {
  169.             $query_update_wordcount "UPDATE $tableposts
  170.                                                                 SET post_wordcount = bpost_count_words($row['post_content']"
  171.                                                                 WHERE ID = " $row['ID'];
  172.             $DB->query($query_update_wordcount);
  173.         }
  174.         echo "OK. (".count($q)." rows updated)<br />\n";
  175.     }
  176.  
  177.  
  178.     if$old_db_version 8020 )
  179.     {
  180.         echo 'Encoding passwords... ';
  181.         $query "UPDATE $tableusers
  182.                             SET user_pass = MD5(user_pass)";
  183.         $DB->query$query );
  184.         echo "OK.<br />\n";
  185.     }
  186.  
  187.  
  188.     if$old_db_version 8030 )
  189.     {
  190.         echo 'Deleting unecessary logs... ';
  191.         $query "DELETE FROM $tablehitlog
  192.                             WHERE hit_ignore IN ('badchar', 'blacklist')";
  193.         $DB->query$query );
  194.         echo "OK.<br />\n";
  195.  
  196.         echo 'Updating blog urls... ';
  197.         $query "SELECT blog_ID, blog_siteurl FROM $tableblogs";
  198.         $q $DB->get_results$queryARRAY_A );
  199.         ifcount$q ) ) foreach$q as $row )
  200.         {
  201.             $blog_ID $row['blog_ID'];
  202.             $blog_siteurl $row['blog_siteurl'];
  203.             // echo $blog_ID.':'.$blog_siteurl;
  204.             ifstrpos$blog_siteurl$baseurl !== )
  205.             {    // If not found at position 0
  206.                 echo ' <strong>WARNING: please check blog #'$blog_ID' manually.</strong><br /> ';
  207.                 continue;
  208.             }
  209.             // crop off the baseurl:
  210.             $blog_siteurl substr$blog_siteurlstrlen($baseurl) );
  211.             // echo ' -> ', $blog_siteurl,'<br />';
  212.  
  213.             $query_update_blog "UPDATE $tableblogs SET blog_siteurl = '$blog_siteurl' WHERE blog_ID = $blog_ID";
  214.             // echo $query_update_blog, '<br />';
  215.             $DB->query$query_update_blog );
  216.         }
  217.         echo "OK. (".count($q)." rows updated)<br />\n";
  218.     }
  219.  
  220.  
  221.     if$old_db_version 8040 )
  222.     // upgrade to 0.8.7
  223.         create_antispam();
  224.  
  225.         echo 'Upgrading Settings table... ';
  226.         $query "ALTER TABLE $tablesettings
  227.                             ADD COLUMN last_antispam_update datetime NOT NULL default '2000-01-01 00:00:00'";
  228.         $DB->query$query );
  229.         echo "OK.<br />\n";
  230.     }
  231.  
  232.  
  233.     if$old_db_version 8050 )
  234.     // upgrade to 0.8.9
  235.         echo 'Upgrading blogs table... ';
  236.         $query "ALTER TABLE $tableblogs
  237.                             ADD COLUMN blog_allowtrackbacks tinyint(1) NOT NULL default 1,
  238.                             ADD COLUMN blog_allowpingbacks tinyint(1) NOT NULL default 0,
  239.                             ADD COLUMN blog_pingb2evonet tinyint(1) NOT NULL default 0,
  240.                             ADD COLUMN blog_pingtechnorati tinyint(1) NOT NULL default 0,
  241.                             ADD COLUMN blog_pingweblogs tinyint(1) NOT NULL default 0,
  242.                             ADD COLUMN blog_pingblodotgs tinyint(1) NOT NULL default 0,
  243.                             ADD COLUMN blog_disp_bloglist tinyint NOT NULL DEFAULT 1";
  244.         $DB->query$query );
  245.         echo "OK.<br />\n";
  246.  
  247.         // Create User Groups
  248.         create_groups();
  249.         $tablegroups_isuptodate true;
  250.         $tableblogusers_isuptodate true;
  251.  
  252.         echo 'Creating user blog permissions... ';
  253.         // Admin: full rights for all blogs (look 'ma, doing a natural join! :>)
  254.         $query "INSERT INTO $tableblogusers( bloguser_blog_ID, bloguser_user_ID, bloguser_ismember,
  255.                                 bloguser_perm_poststatuses, bloguser_perm_delpost, bloguser_perm_comments,
  256.                                 bloguser_perm_cats, bloguser_perm_properties)
  257.                             SELECT blog_ID, ID, 1, 'published,deprecated,protected,private,draft', 1, 1, 1, 1
  258.                             FROM $tableusers$tableblogs
  259.                             WHERE user_level = 10";
  260.         $DB->query$query );
  261.  
  262.         // Normal users: basic rights for all blogs (can't stop doing joins :P)
  263.         $query "INSERT INTO $tableblogusers( bloguser_blog_ID, bloguser_user_ID, bloguser_ismember,
  264.                                 bloguser_perm_poststatuses, bloguser_perm_delpost, bloguser_perm_comments,
  265.                                 bloguser_perm_cats, bloguser_perm_properties)
  266.                             SELECT blog_ID, ID, 1, 'published,protected,private,draft', 0, 1, 0, 0
  267.                             FROM $tableusers$tableblogs
  268.                             WHERE user_level > 0 AND user_level < 10";
  269.         $DB->query$query );
  270.         echo "OK.<br />\n";
  271.  
  272.         echo 'Upgrading users table... ';
  273.         $query "ALTER TABLE $tableusers
  274.                             ADD COLUMN user_notify tinyint(1) NOT NULL default 1,
  275.                             ADD COLUMN user_grp_ID int(4) NOT NULL default 1,
  276.                             MODIFY COLUMN user_idmode varchar(20) NOT NULL DEFAULT 'login',
  277.                             ADD KEY user_grp_ID (user_grp_ID)";
  278.         $DB->query$query );
  279.         echo "OK.<br />\n";
  280.  
  281.         echo 'Assigning user groups... ';
  282.  
  283.         // Default is 1, so admins are already set.
  284.  
  285.         // Basic Users:
  286.         $query "UPDATE $tableusers
  287.                             SET user_grp_ID = $Group_Users->ID
  288.                             WHERE user_level = 0";
  289.         $DB->query$query );
  290.  
  291.         // Bloggers:
  292.         $query "UPDATE $tableusers
  293.                             SET user_grp_ID = $Group_Bloggers->ID
  294.                             WHERE user_level > 0 AND user_level < 10";
  295.         $DB->query$query );
  296.  
  297.         echo "OK.<br />\n";
  298.  
  299.         echo 'Upgrading settings table... ';
  300.         $query "ALTER TABLE $tablesettings
  301.                             DROP COLUMN time_format,
  302.                             DROP COLUMN date_format,
  303.                             ADD COLUMN pref_newusers_grp_ID int unsigned DEFAULT 4 NOT NULL,
  304.                             ADD COLUMN pref_newusers_level tinyint unsigned DEFAULT 1 NOT NULL,
  305.                             ADD COLUMN pref_newusers_canregister tinyint unsigned DEFAULT 0 NOT NULL";
  306.         $DB->query$query );
  307.         echo "OK.<br />\n";
  308.  
  309.         set_upgrade_checkpoint'8050' );
  310.     }
  311.  
  312.  
  313.     if$old_db_version 8060 )
  314.     {    // --------------------------------------------
  315.         // upgrade to 0.9
  316.         // --------------------------------------------
  317.  
  318.         // Important check:
  319.         $stub_list $DB->get_col"SELECT blog_stub
  320.                                                                     FROM $tableblogs
  321.                                                                     GROUP BY blog_stub
  322.                                                                     HAVING COUNT(*) > 1);
  323.         if!empty($stub_list) )
  324.         {
  325.             echo '<div class="error"><p class="error">';
  326.             printfT_("It appears that the following blog stub names are used more than once: ['%s']" )implode"','"$stub_list ) );
  327.             echo '</p><p>';
  328.             printfT_("I can't upgrade until you make them unique. DB field: [%s]" )$tableblogs.'.blog_stub' );
  329.             echo '</p></div>';
  330.             return false;
  331.         }
  332.  
  333.         // Create locales
  334.         create_locales();
  335.  
  336.  
  337.         echo 'Upgrading posts table... ';
  338.         $query "UPDATE $tableposts
  339.                             SET post_urltitle = NULL";
  340.         $DB->query$query );
  341.  
  342.         $query "ALTER TABLE $tableposts
  343.                             CHANGE COLUMN post_date post_issue_date datetime NOT NULL default '0000-00-00 00:00:00',
  344.                             ADD COLUMN post_mod_date datetime NOT NULL default '0000-00-00 00:00:00'
  345.                                         AFTER post_issue_date,
  346.                             CHANGE COLUMN post_lang post_locale varchar(20) NOT NULL default 'en-EU',
  347.                             DROP COLUMN post_url,
  348.                             CHANGE COLUMN post_trackbacks post_url varchar(250) NULL default NULL,
  349.                             MODIFY COLUMN post_flags SET( 'pingsdone', 'imported'),
  350.                             ADD COLUMN post_renderers VARCHAR(179) NOT NULL default 'default',
  351.                             DROP INDEX post_date,
  352.                             ADD INDEX post_issue_date( post_issue_date ),
  353.                             ADD UNIQUE post_urltitle( post_urltitle )";
  354.         $DB->query$query );
  355.  
  356.         $query "UPDATE $tableposts
  357.                             SET post_mod_date = post_issue_date";
  358.         $DB->query$query );
  359.         echo "OK.<br />\n";
  360.  
  361.         // convert given languages to locales
  362.         convert_lang_to_locale$tableposts'post_locale''ID' );
  363.  
  364.         echo 'Upgrading blogs table... ';
  365.         $query "ALTER TABLE $tableblogs
  366.                             CHANGE blog_lang blog_locale varchar(20) NOT NULL default 'en-EU',
  367.                             CHANGE blog_roll blog_notes TEXT NULL,
  368.                             MODIFY COLUMN blog_default_skin VARCHAR(30) NOT NULL DEFAULT 'custom',
  369.                             DROP COLUMN blog_filename,
  370.                             ADD COLUMN blog_access_type VARCHAR(10) NOT NULL DEFAULT 'index.php' AFTER blog_locale,
  371.                             ADD COLUMN blog_force_skin tinyint(1) NOT NULL default 0 AFTER blog_default_skin,
  372.                             ADD COLUMN blog_in_bloglist tinyint(1) NOT NULL DEFAULT 1 AFTER blog_disp_bloglist,
  373.                             ADD COLUMN blog_links_blog_ID INT(4) NOT NULL DEFAULT 0,
  374.                             ADD UNIQUE KEY blog_stub (blog_stub)";
  375.         $DB->query$query );
  376.  
  377.         $query "UPDATE $tableblogs
  378.                             SET blog_access_type = 'stub',
  379.                                     blog_default_skin = 'custom'";
  380.         $DB->query$query );
  381.  
  382.         echo "OK.<br />\n";
  383.  
  384.         // convert given languages to locales
  385.         convert_lang_to_locale$tableblogs'blog_locale''blog_ID' );
  386.  
  387.         echo 'Converting settings table... ';
  388.  
  389.         // get old settings
  390.         $query "SELECT * FROM $tablesettings";
  391.         $row $DB->get_row$queryARRAY_A );
  392.  
  393.         #pre_dump($row, 'oldrow');
  394.         $transform array(
  395.             'posts_per_page' => array(7),
  396.             'what_to_show' => array('days'),
  397.             'archive_mode' => array('weekly'),
  398.             'time_difference' => array(0),
  399.             'AutoBR' => array(1),
  400.             'last_antispam_update' => array('2000-01-01 00:00:00''antispam_last_update'),
  401.             'pref_newusers_grp_ID' => array(4'newusers_grp_ID'),
  402.             'pref_newusers_level'  => array(1'newusers_level'),
  403.             'pref_newusers_canregister' => array(0'newusers_canregister'),
  404.         );
  405.  
  406.         $query "INSERT INTO $tablesettings (set_name, set_value) VALUES ";
  407.  
  408.         foreach$transform as $oldkey => $newarr )
  409.         {
  410.             $newname (isset($newarr[1])) $newarr[1$oldkey;
  411.             if!isset$row[$oldkey) )
  412.             {
  413.                 echo '&nbsp;&middot;Setting '.$oldkey.' not found, using defaults.<br />';
  414.                 $trans$newname $newarr[0];
  415.             }
  416.             else
  417.             {
  418.                 $trans$newname $row[$oldkey];
  419.             }
  420.         }
  421.  
  422.         $query .= "
  423.             ( 'db_version', '$new_db_version' ),
  424.             ( 'default_locale', 'en-EU' ),
  425.             ( 'links_extrapath', '0' ),
  426.             ( 'permalink_type', 'urltitle' ),
  427.             ( 'user_minpwdlen', '5' )
  428.             ";
  429.  
  430.         foreach$trans as $name => $value )
  431.         {
  432.             $query .= ", ('$name', '".$DB->escape($value)."')";
  433.         }
  434.  
  435.         // drop old table
  436.         $DB->query"DROP TABLE IF EXISTS $tablesettings");
  437.  
  438.         // create new table
  439.         $DB->query"CREATE TABLE $tablesettings (
  440.                                 set_name VARCHAR( 30 ) NOT NULL ,
  441.                                 set_value VARCHAR( 255 ) NULL ,
  442.                                 PRIMARY KEY ( set_name )
  443.                                 )");
  444.  
  445.         // write new settings
  446.         #echo $query;
  447.         $DB->query$query );
  448.         echo "OK.<br />\n";
  449.  
  450.         if!isset$tableblogusers_isuptodate ) )
  451.         {
  452.             echo 'Upgrading Blog-User permissions table... ';
  453.             $query "ALTER TABLE $tableblogusers
  454.                                 ADD COLUMN bloguser_ismember tinyint NOT NULL default 0 AFTER bloguser_user_ID";
  455.             $DB->query$query );
  456.  
  457.             // Any row that is created holds at least one permission,
  458.             // minimum permsission is to be a member, so we add that one too, to all existing rows.
  459.             $DB->query"UPDATE $tableblogusers
  460.                                             SET bloguser_ismember = 1);
  461.             echo "OK.<br />\n";
  462.         }
  463.  
  464.         echo 'Upgrading Comments table... ';
  465.         $query "ALTER TABLE $tablecomments
  466.                             ADD COLUMN comment_author_ID int unsigned NULL default NULL AFTER comment_status,
  467.                             MODIFY COLUMN comment_author varchar(100) NULL,
  468.                             MODIFY COLUMN comment_author_email varchar(100) NULL,
  469.                             MODIFY COLUMN comment_author_url varchar(100) NULL,
  470.                             MODIFY COLUMN comment_author_IP varchar(23) NOT NULL default ''";
  471.         $DB->query$query );
  472.         echo "OK.<br />\n";
  473.  
  474.         echo 'Upgrading Users table... ';
  475.         $query "ALTER TABLE $tableusers ADD user_locale VARCHAR( 20 ) DEFAULT 'en-EU' NOT NULL AFTER user_yim";
  476.         $DB->query$query );
  477.         echo "OK.<br />\n";
  478.  
  479.         set_upgrade_checkpoint'8060' );
  480.     }
  481.  
  482.     if$old_db_version 8062 )
  483.     // --------------------------------------------
  484.         // upgrade to 0.9.0.4
  485.         // --------------------------------------------
  486.         cleanup_post_quotes();
  487.  
  488.         set_upgrade_checkpoint'8062' );
  489.     }
  490.  
  491.     if$old_db_version 8064 )
  492.     // --------------------------------------------
  493.         // upgrade to 0.9.0.6
  494.         // --------------------------------------------
  495.         cleanup_comment_quotes();
  496.     }
  497.  
  498.     if$old_db_version 8066 )
  499.     // --------------------------------------------
  500.         // upgrade to 0.9.1
  501.         // --------------------------------------------
  502.         echo 'Adding catpost index... ';
  503.         $DB->query"ALTER TABLE $tablepostcats ADD UNIQUE catpost ( postcat_cat_ID, postcat_post_ID ));
  504.         echo "OK.<br />\n";
  505.  
  506.         echo 'Adding visitTime index... ';
  507.         $DB->query"ALTER TABLE $tablehitlog ADD INDEX visitTime ( visitTime ));
  508.         echo "OK.<br />\n";
  509.     }
  510.  
  511.     if$old_db_version 8070 )
  512.     {
  513.         /*
  514.          * CONTRIBUTORS: If you need some more changes, put them here!
  515.          * Then create a new extension block, and increase db version numbers
  516.          * everywhere where needed in this file.
  517.          */
  518.     }
  519.  
  520.     // Update DB schema version to $new_db_version
  521.     set_upgrade_checkpoint$new_db_version );
  522.  
  523.     return true;
  524. }
  525.  
  526.  
  527. ?>

Documentation generated on Tue, 20 May 2008 01:54:53 +0200 by phpDocumentor 1.4.2