diff --git a/.gitignore b/.gitignore index d95e4b9..0901d3e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /config.ini /.debug /vendor +/.migrating diff --git a/database/2023_10_31_192440_initial_structure.php b/database/2023_10_31_192440_initial_structure.php new file mode 100644 index 0000000..62ae693 --- /dev/null +++ b/database/2023_10_31_192440_initial_structure.php @@ -0,0 +1,81 @@ +query('SHOW TABLES'); + while($result->next()) + $existingTables[] = $result->getString(0); + + if(!in_array('prm_applications', $existingTables)) + $conn->execute(' + CREATE TABLE prm_applications ( + app_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + app_name VARCHAR(50) NOT NULL COLLATE "utf8mb4_unicode_ci", + app_created TIMESTAMP NOT NULL DEFAULT current_timestamp(), + app_size_limit INT(11) NOT NULL, + app_allow_size_multiplier TINYINT(4) NOT NULL DEFAULT "0", + app_expiry INT(11) NOT NULL, + PRIMARY KEY (app_id), + UNIQUE KEY prm_applications_name_unique (app_name), + KEY prm_applications_created_index (app_created) + ) ENGINE=InnoDB COLLATE="utf8mb4_bin"; + '); + + if(!in_array('prm_users', $existingTables)) + $conn->execute(' + CREATE TABLE prm_users ( + user_id INT(10) UNSIGNED NOT NULL, + user_created TIMESTAMP NOT NULL DEFAULT current_timestamp(), + user_restricted TIMESTAMP NULL DEFAULT NULL, + user_size_multiplier TINYINT(3) UNSIGNED NOT NULL DEFAULT "1", + PRIMARY KEY (user_id), + KEY prm_users_created_index (user_created), + KEY prm_users_restricted_index (user_restricted) + ) ENGINE=InnoDB COLLATE="latin1_swedish_ci"; + '); + + if(!in_array('prm_uploads', $existingTables)) + $conn->execute(' + CREATE TABLE prm_uploads ( + upload_id BINARY(32) NOT NULL, + user_id INT(10) UNSIGNED NULL DEFAULT NULL, + app_id INT(10) UNSIGNED NULL DEFAULT NULL, + upload_hash BINARY(32) NOT NULL, + upload_ip VARBINARY(16) NOT NULL, + upload_created TIMESTAMP NOT NULL DEFAULT current_timestamp(), + upload_accessed TIMESTAMP NULL DEFAULT NULL, + upload_expires TIMESTAMP NULL DEFAULT NULL, + upload_deleted TIMESTAMP NULL DEFAULT NULL, + upload_dmca TIMESTAMP NULL DEFAULT NULL, + upload_bump INT(10) UNSIGNED NOT NULL DEFAULT "0", + upload_name VARCHAR(255) NOT NULL COLLATE "utf8mb4_bin", + upload_type VARCHAR(255) NOT NULL COLLATE "utf8mb4_bin", + upload_size INT(11) UNSIGNED NOT NULL, + PRIMARY KEY (upload_id), + UNIQUE KEY prm_uploads_unique (user_id, upload_hash, app_id), + KEY prm_uploads_user_foreign (user_id), + KEY prm_uploads_ip_index (upload_ip), + KEY prm_uploads_created_index (upload_created), + KEY prm_uploads_expires_index (upload_expires), + KEY prm_uploads_deleted_index (upload_deleted), + KEY prm_uploads_dmca_index (upload_dmca), + KEY prm_uploads_accessed_index (upload_accessed), + KEY prm_uploads_application_foreign (app_id), + KEY prm_uploads_hash_index (upload_hash), + CONSTRAINT prm_uploads_application_foreign + FOREIGN KEY (app_id) + REFERENCES prm_applications (app_id) + ON UPDATE CASCADE + ON DELETE SET NULL, + CONSTRAINT prm_uploads_user_foreign + FOREIGN KEY (user_id) + REFERENCES prm_users (user_id) + ON UPDATE CASCADE + ON DELETE SET NULL + ) ENGINE=InnoDB COLLATE="utf8mb4_bin"; + '); + } +} diff --git a/eeprom.php b/eeprom.php index 8fc303a..e084def 100644 --- a/eeprom.php +++ b/eeprom.php @@ -11,6 +11,7 @@ define('PRM_CLI', PHP_SAPI === 'cli'); define('PRM_DEBUG', is_file(PRM_ROOT . '/.debug')); define('PRM_PUBLIC', PRM_ROOT . '/public'); define('PRM_SOURCE', PRM_ROOT . '/src'); +define('PRM_MIGRATIONS', PRM_ROOT . '/database'); define('PRM_DEBUG_PAGES', PRM_ROOT . '/debug-pages'); define('PRM_UPLOADS', PRM_PUBLIC . '/data'); define('PRM_THUMBS', PRM_PUBLIC . '/thumb'); diff --git a/tools/migrate b/tools/migrate new file mode 100755 index 0000000..85c8914 --- /dev/null +++ b/tools/migrate @@ -0,0 +1,35 @@ +#!/usr/bin/env php +init(); + + echo 'Creating migration repository...' . PHP_EOL; + $repo = new FsDbMigrationRepo(PRM_MIGRATIONS); + + echo 'Running migrations...' . PHP_EOL; + $completed = $manager->processMigrations($repo); + + if(empty($completed)) { + echo 'There were no migrations to run!' . PHP_EOL; + } else { + echo 'The following migrations have been completed:' . PHP_EOL; + foreach($completed as $migration) + echo ' - ' . $migration . PHP_EOL; + } + + echo PHP_EOL; +} finally { + unlink(PRM_ROOT . '/.migrating'); +} diff --git a/tools/new-migration b/tools/new-migration new file mode 100755 index 0000000..ca34377 --- /dev/null +++ b/tools/new-migration @@ -0,0 +1,26 @@ +#!/usr/bin/env php +createNames($baseName); +} catch(InvalidArgumentException $ex) { + echo $ex->getMessage() . PHP_EOL; + return; +} + +$repo->saveMigrationTemplate($names->name, $manager->template($names->className)); + +echo "Template for '{$names->className}' has been saved to {$names->name}.php." . PHP_EOL;