2020-01-26 13:19:35 +00:00
< ? php declare ( strict_types = 1 );
2007-07-06 04:02:24 +00:00
2019-05-28 16:59:38 +00:00
class Upgrade extends Extension
{
2019-11-03 19:04:57 +00:00
public function onCommand ( CommandEvent $event )
{
if ( $event -> cmd == " help " ) {
print " \t db-upgrade \n " ;
print " \t \t Run DB schema updates, if automatic updates are disabled \n \n " ;
}
if ( $event -> cmd == " db-upgrade " ) {
print ( " Running DB Upgrade \n " );
global $database ;
$database -> set_timeout ( 300000 ); // These updates can take a little bit
send_event ( new DatabaseUpgradeEvent ());
}
}
2019-11-03 17:19:37 +00:00
public function onDatabaseUpgrade ( DatabaseUpgradeEvent $event )
2019-05-28 16:59:38 +00:00
{
global $config , $database ;
2020-03-23 19:56:05 +00:00
if ( ! file_exists ( " data/index.php " )) {
file_put_contents ( " data/index.php " , " <?php \n // Silence is golden... \n " );
}
2020-01-30 21:11:56 +00:00
if ( $config -> get_int ( " db_version " ) < 1 ) {
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 2 );
2019-05-28 16:59:38 +00:00
}
// v7 is convert to innodb with adodb
// now done again as v9 with PDO
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 8 ) {
2019-05-28 16:59:38 +00:00
$database -> execute ( $database -> scoreql_to_sql (
" ALTER TABLE images ADD COLUMN locked SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N "
));
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 8 );
2019-05-28 16:59:38 +00:00
}
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 9 ) {
2019-06-20 15:42:32 +00:00
if ( $database -> get_driver_name () == DatabaseDriver :: MYSQL ) {
2019-05-28 16:59:38 +00: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 " );
}
}
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 9 );
2019-05-28 16:59:38 +00:00
}
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 10 ) {
2019-05-28 16:59:38 +00:00
log_info ( " upgrade " , " Adding foreign keys to images " );
$database -> Execute ( " ALTER TABLE images ADD FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT " );
2019-08-07 19:53:59 +00:00
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 10 );
2019-05-28 16:59:38 +00:00
}
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 11 ) {
2019-05-28 16:59:38 +00:00
log_info ( " upgrade " , " Converting user flags to classes " );
$database -> execute ( " ALTER TABLE users ADD COLUMN class VARCHAR(32) NOT NULL default :user " , [ " user " => " user " ]);
2019-11-03 23:43:35 +00:00
$database -> execute ( " UPDATE users SET class = :name WHERE id=:id " , [ " name " => " anonymous " , " id " => $config -> get_int ( 'anon_id' )]);
2019-05-28 16:59:38 +00:00
$database -> execute ( " UPDATE users SET class = :name WHERE admin=:admin " , [ " name " => " admin " , " admin " => 'Y' ]);
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 11 );
2019-05-28 16:59:38 +00:00
}
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 12 ) {
2019-06-20 15:42:32 +00:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-05-28 16:59:38 +00: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) " );
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 12 );
2019-05-28 16:59:38 +00:00
}
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 13 ) {
2019-05-28 16:59:38 +00:00
log_info ( " upgrade " , " Changing password column to VARCHAR(250) " );
2019-06-20 15:42:32 +00:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-05-28 16:59:38 +00:00
$database -> execute ( " ALTER TABLE users ALTER COLUMN pass SET DATA TYPE VARCHAR(250) " );
2019-06-20 15:42:32 +00:00
} elseif ( $database -> get_driver_name () == DatabaseDriver :: MYSQL ) {
2019-05-28 16:59:38 +00:00
$database -> execute ( " ALTER TABLE users CHANGE pass pass VARCHAR(250) " );
}
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 13 );
2019-05-28 16:59:38 +00:00
}
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 14 ) {
2019-05-28 16:59:38 +00:00
log_info ( " upgrade " , " Changing tag column to VARCHAR(255) " );
2019-06-20 15:42:32 +00:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-05-28 16:59:38 +00: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 15:42:32 +00:00
} elseif ( $database -> get_driver_name () == DatabaseDriver :: MYSQL ) {
2019-05-28 16:59:38 +00: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' );
}
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 14 );
2019-05-28 16:59:38 +00:00
}
2019-06-20 15:05:53 +00:00
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 15 ) {
2019-06-20 15:05:53 +00:00
log_info ( " upgrade " , " Adding lower indexes for postgresql use " );
2019-06-20 15:42:32 +00:00
if ( $database -> get_driver_name () == DatabaseDriver :: PGSQL ) {
2019-06-20 15:05:53 +00: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)))' );
}
2019-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 15 );
2019-06-20 15:05:53 +00:00
}
2019-06-24 22:14:53 +00:00
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 16 ) {
2019-06-24 22:14:53 +00:00
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 15:05:36 +00: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 22:14:53 +00: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-11-03 19:04:57 +00:00
$this -> set_version ( " db_version " , 16 );
2019-06-24 22:14:53 +00:00
}
2019-06-25 20:17:13 +00:00
2019-11-03 19:04:57 +00:00
if ( $this -> get_version ( " db_version " ) < 17 ) {
2019-06-25 20:17:13 +00:00
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 " );
2019-09-29 13:30:55 +00:00
switch ( $database -> get_driver_name ()) {
2019-06-25 20:17:13 +00:00
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 ;
}
2019-10-14 18:31:12 +00:00
$database -> set_timeout ( 300000 ); // These updates can take a little bit
2019-06-25 20:17:13 +00:00
log_info ( " upgrade " , " Setting index for ext column " );
$database -> execute ( 'CREATE INDEX images_ext_idx ON images(ext)' );
2020-01-27 19:27:20 +00:00
$this -> set_version ( " db_version " , 17 );
}
2019-06-25 20:17:13 +00:00
2020-01-27 19:27:20 +00:00
if ( $this -> get_version ( " db_version " ) < 18 ) {
2019-06-25 20:17:13 +00:00
log_info ( " upgrade " , " Setting predictable media values for known file types " );
2020-01-27 19:27:20 +00:00
if ( $database -> transaction ) {
// Each of these commands could hit a lot of data, combining
// them into one big transaction would not be a good idea.
$database -> commit ();
}
2019-06-25 21:09:31 +00: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') " ));
2020-01-27 19:27:20 +00:00
$this -> set_version ( " db_version " , 18 );
2019-06-25 20:17:13 +00:00
}
2020-06-14 16:05:55 +00:00
if ( $this -> get_version ( " db_version " ) < 19 ) {
log_info ( " upgrade " , " Adding MIME type column " );
$database -> execute ( $database -> scoreql_to_sql (
" ALTER TABLE images ADD COLUMN mime varchar(512) NULL "
));
// Column is primed in mime extension
log_info ( " upgrade " , " Setting index for mime column " );
$database -> execute ( 'CREATE INDEX images_mime_idx ON images(mime)' );
$this -> set_version ( " db_version " , 19 );
}
2019-05-28 16:59:38 +00:00
}
public function get_priority () : int
{
return 5 ;
}
2007-07-06 04:02:24 +00:00
}