2007-07-06 04:02:24 +00:00
< ? php
2010-01-05 10:11:53 +00:00
/*
* Name : Database Upgrader
2012-02-07 21:52:11 -05:00
* Author : Shish < webmaster @ shishnet . org >
* Link : http :// code . shishnet . org / shimmie2 /
2010-01-05 10:11:53 +00:00
* Description : Keeps things happy behind the scenes
2010-01-05 13:13:11 +00:00
* Visibility : admin
2010-01-05 10:11:53 +00:00
*/
2007-07-06 04:02:24 +00:00
2019-05-28 17:59:38 +01:00
class Upgrade extends Extension
{
public function onInitExt ( InitExtEvent $event )
{
global $config , $database ;
2019-06-25 16:09:31 -05:00
2019-05-28 17:59:38 +01:00
if ( $config -> get_bool ( " in_upgrade " )) {
return ;
}
if ( ! is_numeric ( $config -> get_string ( " db_version " ))) {
$config -> set_int ( " db_version " , 2 );
}
if ( $config -> get_int ( " db_version " ) < 6 ) {
// cry :S
}
// v7 is convert to innodb with adodb
// now done again as v9 with PDO
if ( $config -> get_int ( " db_version " ) < 8 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 8 );
$database -> execute ( $database -> scoreql_to_sql (
" ALTER TABLE images ADD COLUMN locked SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N "
));
log_info ( " upgrade " , " Database at version 8 " );
$config -> set_bool ( " in_upgrade " , false );
}
if ( $config -> get_int ( " db_version " ) < 9 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 9 );
2019-06-20 10:42:32 -05:00
if ( $database -> get_driver_name () == DatabaseDriver :: MYSQL ) {
2019-05-28 17:59:38 +01:00
$tables = $database -> get_col ( " SHOW TABLES " );
foreach ( $tables as $table ) {
log_info ( " upgrade " , " converting $table to innodb " );
$database -> execute ( " ALTER TABLE $table ENGINE=INNODB " );
}
}
log_info ( " upgrade " , " Database at version 9 " );
$config -> set_bool ( " in_upgrade " , false );
}
if ( $config -> get_int ( " db_version " ) < 10 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 10 );
log_info ( " upgrade " , " Adding foreign keys to images " );
$database -> Execute ( " ALTER TABLE images ADD FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT " );
log_info ( " upgrade " , " Database at version 10 " );
$config -> set_bool ( " in_upgrade " , false );
}
if ( $config -> get_int ( " db_version " ) < 11 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 11 );
log_info ( " upgrade " , " Converting user flags to classes " );
$database -> execute ( " ALTER TABLE users ADD COLUMN class VARCHAR(32) NOT NULL default :user " , [ " user " => " user " ]);
$database -> execute ( " UPDATE users SET class = :name WHERE id=:id " , [ " name " => " anonymous " , " id " => $config -> get_int ( 'anon_id' )]);
$database -> execute ( " UPDATE users SET class = :name WHERE admin=:admin " , [ " name " => " admin " , " admin " => 'Y' ]);
log_info ( " upgrade " , " Database at version 11 " );
$config -> set_bool ( " in_upgrade " , false );
}
if ( $config -> get_int ( " db_version " ) < 12 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 12 );
2019-06-20 10:42:32 -05:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-05-28 17:59:38 +01:00
log_info ( " upgrade " , " Changing ext column to VARCHAR " );
$database -> execute ( " ALTER TABLE images ALTER COLUMN ext SET DATA TYPE VARCHAR(4) " );
}
log_info ( " upgrade " , " Lowering case of all exts " );
$database -> execute ( " UPDATE images SET ext = LOWER(ext) " );
log_info ( " upgrade " , " Database at version 12 " );
$config -> set_bool ( " in_upgrade " , false );
}
if ( $config -> get_int ( " db_version " ) < 13 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 13 );
log_info ( " upgrade " , " Changing password column to VARCHAR(250) " );
2019-06-20 10:42:32 -05:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-05-28 17:59:38 +01:00
$database -> execute ( " ALTER TABLE users ALTER COLUMN pass SET DATA TYPE VARCHAR(250) " );
2019-06-20 10:42:32 -05:00
} elseif ( $database -> get_driver_name () == DatabaseDriver :: MYSQL ) {
2019-05-28 17:59:38 +01:00
$database -> execute ( " ALTER TABLE users CHANGE pass pass VARCHAR(250) " );
}
log_info ( " upgrade " , " Database at version 13 " );
$config -> set_bool ( " in_upgrade " , false );
}
if ( $config -> get_int ( " db_version " ) < 14 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 14 );
log_info ( " upgrade " , " Changing tag column to VARCHAR(255) " );
2019-06-20 10:42:32 -05:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-05-28 17:59:38 +01:00
$database -> execute ( 'ALTER TABLE tags ALTER COLUMN tag SET DATA TYPE VARCHAR(255)' );
$database -> execute ( 'ALTER TABLE aliases ALTER COLUMN oldtag SET DATA TYPE VARCHAR(255)' );
$database -> execute ( 'ALTER TABLE aliases ALTER COLUMN newtag SET DATA TYPE VARCHAR(255)' );
2019-06-20 10:42:32 -05:00
} elseif ( $database -> get_driver_name () == DatabaseDriver :: MYSQL ) {
2019-05-28 17:59:38 +01:00
$database -> execute ( 'ALTER TABLE tags MODIFY COLUMN tag VARCHAR(255) NOT NULL' );
$database -> execute ( 'ALTER TABLE aliases MODIFY COLUMN oldtag VARCHAR(255) NOT NULL' );
$database -> execute ( 'ALTER TABLE aliases MODIFY COLUMN newtag VARCHAR(255) NOT NULL' );
}
log_info ( " upgrade " , " Database at version 14 " );
$config -> set_bool ( " in_upgrade " , false );
}
2019-06-20 10:05:53 -05:00
if ( $config -> get_int ( " db_version " ) < 15 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 15 );
log_info ( " upgrade " , " Adding lower indexes for postgresql use " );
2019-06-20 10:42:32 -05:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-06-20 10:05:53 -05:00
$database -> execute ( 'CREATE INDEX tags_lower_tag_idx ON tags ((lower(tag)))' );
$database -> execute ( 'CREATE INDEX users_lower_name_idx ON users ((lower(name)))' );
}
log_info ( " upgrade " , " Database at version 15 " );
$config -> set_bool ( " in_upgrade " , false );
}
2019-06-24 17:14:53 -05:00
if ( $config -> get_int ( " db_version " ) < 16 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 16 );
log_info ( " upgrade " , " Adding tag_id, image_id index to image_tags " );
$database -> execute ( 'CREATE UNIQUE INDEX image_tags_tag_id_image_id_idx ON image_tags(tag_id,image_id) ' );
log_info ( " upgrade " , " Changing filename column to VARCHAR(255) " );
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
$database -> execute ( 'ALTER TABLE images ALTER COLUMN filename SET DATA TYPE VARCHAR(255)' );
2019-06-25 10:05:36 -05:00
// Postgresql creates a unique index for unique columns, not just a constraint,
// so we don't need two indexes on the same column
$database -> execute ( 'DROP INDEX IF EXISTS images_hash_idx' );
$database -> execute ( 'DROP INDEX IF EXISTS users_name_idx' );
2019-06-24 17:14:53 -05:00
} elseif ( $database -> get_driver_name () == DatabaseDriver :: MYSQL ) {
$database -> execute ( 'ALTER TABLE images MODIFY COLUMN filename VARCHAR(255) NOT NULL' );
}
// SQLite doesn't support altering existing columns? This seems like a problem?
2019-06-25 16:09:31 -05:00
2019-06-24 17:14:53 -05:00
log_info ( " upgrade " , " Database at version 16 " );
$config -> set_bool ( " in_upgrade " , false );
}
2019-06-25 15:17:13 -05:00
if ( $config -> get_int ( " db_version " ) < 17 ) {
$config -> set_bool ( " in_upgrade " , true );
$config -> set_int ( " db_version " , 17 );
log_info ( " upgrade " , " Adding media information columns to images table " );
$database -> execute ( $database -> scoreql_to_sql (
" ALTER TABLE images ADD COLUMN lossless SCORE_BOOL NULL "
));
$database -> execute ( $database -> scoreql_to_sql (
" ALTER TABLE images ADD COLUMN video SCORE_BOOL NULL "
));
$database -> execute ( $database -> scoreql_to_sql (
" ALTER TABLE images ADD COLUMN audio SCORE_BOOL NULL "
));
$database -> execute ( " ALTER TABLE images ADD COLUMN length INTEGER NULL " );
log_info ( " upgrade " , " Setting indexes for media columns " );
switch ( $database -> get_driver_name ()) {
case DatabaseDriver :: PGSQL :
case DatabaseDriver :: SQLITE :
$database -> execute ( 'CREATE INDEX images_video_idx ON images(video) WHERE video IS NOT NULL' );
$database -> execute ( 'CREATE INDEX images_audio_idx ON images(audio) WHERE audio IS NOT NULL' );
$database -> execute ( 'CREATE INDEX images_length_idx ON images(length) WHERE length IS NOT NULL' );
break ;
default :
$database -> execute ( 'CREATE INDEX images_video_idx ON images(video)' );
$database -> execute ( 'CREATE INDEX images_audio_idx ON images(audio)' );
$database -> execute ( 'CREATE INDEX images_length_idx ON images(length)' );
break ;
}
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) { // These updates can take a little bit
$database -> execute ( " SET statement_timeout TO 300000; " );
}
log_info ( " upgrade " , " Setting index for ext column " );
$database -> execute ( 'CREATE INDEX images_ext_idx ON images(ext)' );
$database -> commit (); // Each of these commands could hit a lot of data, combining them into one big transaction would not be a good idea.
log_info ( " upgrade " , " Setting predictable media values for known file types " );
2019-06-25 16:09:31 -05:00
$database -> execute ( $database -> scoreql_to_sql ( " UPDATE images SET lossless = SCORE_BOOL_Y, video = SCORE_BOOL_Y WHERE ext IN ('swf') " ));
$database -> execute ( $database -> scoreql_to_sql ( " UPDATE images SET lossless = SCORE_BOOL_N, video = SCORE_BOOL_N, audio = SCORE_BOOL_Y WHERE ext IN ('mp3') " ));
$database -> execute ( $database -> scoreql_to_sql ( " UPDATE images SET lossless = SCORE_BOOL_N, video = SCORE_BOOL_N, audio = SCORE_BOOL_N WHERE ext IN ('jpg','jpeg') " ));
$database -> execute ( $database -> scoreql_to_sql ( " UPDATE images SET lossless = SCORE_BOOL_Y, video = SCORE_BOOL_N, audio = SCORE_BOOL_N WHERE ext IN ('ico','ani','cur','png','svg') " ));
$database -> execute ( $database -> scoreql_to_sql ( " UPDATE images SET lossless = SCORE_BOOL_Y, audio = SCORE_BOOL_N WHERE ext IN ('gif') " ));
$database -> execute ( $database -> scoreql_to_sql ( " UPDATE images SET audio = SCORE_BOOL_N WHERE ext IN ('webp') " ));
$database -> execute ( $database -> scoreql_to_sql ( " UPDATE images SET lossless = SCORE_BOOL_N, video = SCORE_BOOL_Y WHERE ext IN ('flv','mp4','m4v','ogv','webm') " ));
2019-06-25 15:17:13 -05:00
log_info ( " upgrade " , " Database at version 17 " );
$config -> set_bool ( " in_upgrade " , false );
}
2019-05-28 17:59:38 +01:00
}
public function get_priority () : int
{
return 5 ;
}
2007-07-06 04:02:24 +00:00
}