Create a migration system to migrate database.
+ Use this system to migrate from 0.8 to 0.9 (WIP)
This commit is contained in:
parent
ca00c4953c
commit
88cae82e71
@ -30,11 +30,23 @@ class FramaDB {
|
||||
$this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
|
||||
}
|
||||
|
||||
function areTablesCreated() {
|
||||
/**
|
||||
* @return \PDO Connection to database
|
||||
*/
|
||||
function getPDO() {
|
||||
return $this->pdo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all tables in database.
|
||||
*
|
||||
* @return array The array of table names
|
||||
*/
|
||||
function allTables() {
|
||||
$result = $this->pdo->query('SHOW TABLES');
|
||||
$schemas = $result->fetchAll(\PDO::FETCH_COLUMN);
|
||||
|
||||
return 0 != count(array_diff($schemas, ['comment', 'poll', 'slot', 'vote']));
|
||||
return $schemas;
|
||||
}
|
||||
|
||||
function prepare($sql) {
|
||||
|
144
app/classes/Framadate/Migration/From_0_8_to_0_9_Migration.php
Normal file
144
app/classes/Framadate/Migration/From_0_8_to_0_9_Migration.php
Normal file
@ -0,0 +1,144 @@
|
||||
<?php
|
||||
namespace Framadate\Migration;
|
||||
|
||||
/**
|
||||
* This class executes the aciton in database to migrate data from version 0.8 to 0.9.
|
||||
*
|
||||
* @package Framadate\Migration
|
||||
*/
|
||||
class From_0_8_to_0_9_Migration implements Migration {
|
||||
|
||||
function __construct() {
|
||||
}
|
||||
|
||||
function execute(\PDO $pdo) {
|
||||
$this->createPollTable($pdo);
|
||||
$this->migrateFromSondageToPoll($pdo);
|
||||
|
||||
$this->createSlotTable($pdo);
|
||||
$this->migrateFromSujetStudsToSlot($pdo);
|
||||
|
||||
$this->createCommentTable($pdo);
|
||||
$this->migrateFromCommentsToComment($pdo);
|
||||
|
||||
$this->createVoteTable($pdo);
|
||||
$this->migrateFromUserStudsToVote($pdo);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function createPollTable(\PDO $pdo) {
|
||||
$pdo->exec('
|
||||
CREATE TABLE IF NOT EXISTS `poll` (
|
||||
`id` CHAR(16) NOT NULL,
|
||||
`admin_id` CHAR(24) NOT NULL,
|
||||
`title` TEXT NOT NULL,
|
||||
`description` TEXT,
|
||||
`admin_name` VARCHAR(64) DEFAULT NULL,
|
||||
`admin_mail` VARCHAR(128) DEFAULT NULL,
|
||||
`creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`end_date` TIMESTAMP NOT NULL DEFAULT \'0000-00-00 00:00:00\',
|
||||
`format` VARCHAR(1) DEFAULT NULL,
|
||||
`editable` TINYINT(1) DEFAULT \'0\',
|
||||
`receiveNewVotes` TINYINT(1) DEFAULT \'0\',
|
||||
`active` TINYINT(1) DEFAULT \'1\',
|
||||
PRIMARY KEY (`id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8');
|
||||
}
|
||||
|
||||
private function migrateFromSondageToPoll(\PDO $pdo) {
|
||||
$pdo->exec('
|
||||
INSERT INTO `poll`
|
||||
(`id`, `admin_id`, `title`, `description`, `admin_name`, `admin_mail`, `creation_date`, `end_date`, `format`, `editable`, `receiveNewVotes`, `active`)
|
||||
SELECT
|
||||
`id_sondage`,
|
||||
`id_sondage_admin`,
|
||||
`titre`,
|
||||
`commentaires`,
|
||||
`nom_admin`,
|
||||
`mail_admin`,
|
||||
`date_creation`,
|
||||
`date_fin`,
|
||||
SUBSTR(`format`, 1, 1) AS `format`,
|
||||
CASE SUBSTR(`format`, 2, 1)
|
||||
WHEN \'+\' THEN 1
|
||||
ELSE 0 END AS `editable`,
|
||||
`mailsonde`,
|
||||
CASE SUBSTR(`format`, 2, 1)
|
||||
WHEN \'-\' THEN 0
|
||||
ELSE 1 END AS `active`
|
||||
FROM sondage');
|
||||
}
|
||||
|
||||
private function createSlotTable(\PDO $pdo) {
|
||||
$pdo->exec('
|
||||
CREATE TABLE IF NOT EXISTS `slot` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` CHAR(16) NOT NULL,
|
||||
`title` TEXT,
|
||||
`moments` TEXT,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `poll_id` (`poll_id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8');
|
||||
}
|
||||
|
||||
private function migrateFromSujetStudsToSlot(\PDO $pdo) {
|
||||
// TODO Implements
|
||||
}
|
||||
|
||||
private function createCommentTable(\PDO $pdo) {
|
||||
$pdo->exec('
|
||||
CREATE TABLE IF NOT EXISTS `comment` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` CHAR(16) NOT NULL,
|
||||
`name` TEXT,
|
||||
`comment` TEXT NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `poll_id` (`poll_id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8');
|
||||
}
|
||||
|
||||
private function migrateFromCommentsToComment(\PDO $pdo) {
|
||||
$pdo->exec('
|
||||
INSERT INTO `comment`
|
||||
(`poll_id`, `name`, `comment`)
|
||||
SELECT
|
||||
`id_sondage`,
|
||||
`usercomment`,
|
||||
`comment`
|
||||
FROM `comments`');
|
||||
}
|
||||
|
||||
private function createVoteTable(\PDO $pdo) {
|
||||
$pdo->exec('
|
||||
CREATE TABLE IF NOT EXISTS `vote` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` CHAR(16) NOT NULL,
|
||||
`name` VARCHAR(64) NOT NULL,
|
||||
`choices` TEXT NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `poll_id` (`poll_id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8');
|
||||
}
|
||||
|
||||
private function migrateFromUserStudsToVote(\PDO $pdo) {
|
||||
$pdo->exec('
|
||||
INSERT INTO `vote`
|
||||
(`poll_id`, `name`, `choices`)
|
||||
SELECT
|
||||
`id_sondage`,
|
||||
`nom`,
|
||||
REPLACE(REPLACE(REPLACE(`reponses`, 1, \'X\'), 2, 1), \'X\', 2)
|
||||
FROM `user_studs`');
|
||||
}
|
||||
|
||||
}
|
||||
|
15
app/classes/Framadate/Migration/Migration.php
Normal file
15
app/classes/Framadate/Migration/Migration.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
namespace Framadate\Migration;
|
||||
|
||||
interface Migration {
|
||||
|
||||
/**
|
||||
* This methode is called only one time in the migration page.
|
||||
*
|
||||
* @param \PDO $pdo The connection to database
|
||||
* @return bool true is the execution succeeded
|
||||
*/
|
||||
function execute(\PDO $pdo);
|
||||
|
||||
}
|
||||
|
@ -41,6 +41,9 @@ const DB_PASSWORD = '<database password>';
|
||||
// Database server name, leave empty to use a socket
|
||||
const DB_CONNECTION_STRING = 'mysql:host=<database host>;dbname=<database name>;port=<database port>';
|
||||
|
||||
// Name of the table that store migration script already executed
|
||||
const MIGRATION_TABLE = 'framadate_migration';
|
||||
|
||||
// Default Language using POSIX variant of BC P47 standard (choose in $ALLOWED_LANGUAGES)
|
||||
const LANGUE = 'fr_FR';
|
||||
|
||||
|
@ -45,7 +45,9 @@ function bandeau_titre($titre)
|
||||
<main role="main">';
|
||||
|
||||
global $connect;
|
||||
if ($connect->areTablesCreated()) {
|
||||
$tables = $connect->allTables();
|
||||
$diff = array_diff($tables, ['comment', 'poll', 'slot', 'vote']);
|
||||
if (0 != count($diff)) {
|
||||
echo '<div class="alert alert-danger">'. _('Framadate is not properly installed, please check the "INSTALL" to setup the database before continuing.') .'</div>';
|
||||
bandeau_pied();
|
||||
die();
|
||||
|
@ -1,136 +0,0 @@
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure `poll`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `poll` (
|
||||
`id` CHAR(16) NOT NULL,
|
||||
`admin_id` CHAR(24) NOT NULL,
|
||||
`title` TEXT NOT NULL,
|
||||
`description` TEXT,
|
||||
`admin_name` VARCHAR(64) DEFAULT NULL,
|
||||
`admin_mail` VARCHAR(128) DEFAULT NULL,
|
||||
`creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`end_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`format` VARCHAR(1) DEFAULT NULL,
|
||||
`editable` TINYINT(1) DEFAULT '0',
|
||||
`receiveNewVotes` TINYINT(1) DEFAULT '0',
|
||||
`active` TINYINT(1) DEFAULT '1',
|
||||
PRIMARY KEY (`id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure `slot`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `slot` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` CHAR(16) NOT NULL,
|
||||
`title` TEXT,
|
||||
`moments` TEXT,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `poll_id` (`poll_id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure `comment`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `comment` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` CHAR(16) NOT NULL,
|
||||
`name` TEXT,
|
||||
`comment` TEXT NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `poll_id` (`poll_id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure `vote`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `vote` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` CHAR(16) NOT NULL,
|
||||
`name` VARCHAR(64) NOT NULL,
|
||||
`choices` TEXT NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `poll_id` (`poll_id`)
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Migrate data from `sondage` to `poll`
|
||||
--
|
||||
|
||||
INSERT INTO `poll`
|
||||
(`id`, `admin_id`, `title`, `description`, `admin_name`, `admin_mail`, `creation_date`, `end_date`, `format`, `editable`, `receiveNewVotes`, `active`)
|
||||
SELECT
|
||||
`id_sondage`,
|
||||
`id_sondage_admin`,
|
||||
`titre`,
|
||||
`commentaires`,
|
||||
`nom_admin`,
|
||||
`mail_admin`,
|
||||
`titre`,
|
||||
`date_creation`,
|
||||
`date_fin`,
|
||||
SUBSTR(`format`, 1, 1) AS `format`,
|
||||
CASE SUBSTR(`format`, 2, 1)
|
||||
WHEN '+' THEN 1
|
||||
ELSE 0 END AS `editable`,
|
||||
`mailsonde`,
|
||||
CASE SUBSTR(`format`, 2, 1)
|
||||
WHEN '-' THEN 0
|
||||
ELSE 1 END AS `active`
|
||||
FROM sondage;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Migrate data from `sujet_studs` to `slot`
|
||||
--
|
||||
|
||||
-- TODO Migrate this, is not so simple
|
||||
/*INSERT INTO `slot`
|
||||
(`poll_id`, `title`, `moments`)
|
||||
SELECT `id_sondage`,
|
||||
FROM `user_studs`;*/
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Migrate data from `comments` to `comment`
|
||||
--
|
||||
|
||||
INSERT INTO `comment`
|
||||
(`poll_id`, `name`, `comment`)
|
||||
SELECT `id_sondage`, `usercomment`, `comment`
|
||||
FROM `comments`;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Migrate data from `user_studs` to `vote`
|
||||
--
|
||||
|
||||
INSERT INTO `vote`
|
||||
(`poll_id`, `name`, `choices`)
|
||||
SELECT `id_sondage`, `nom`, REPLACE(REPLACE(REPLACE(`reponses`, '1', 'X'), '2', '1'), 'X', 2)
|
||||
FROM `user_studs`;
|
60
migration.php
Normal file
60
migration.php
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
use Framadate\Migration\From_0_8_to_0_9_Migration;
|
||||
use Framadate\Migration\Migration;
|
||||
use Framadate\Utils;
|
||||
|
||||
include_once __DIR__ . '/app/inc/init.php';
|
||||
|
||||
function output($msg) {
|
||||
echo $msg . '<br/>';
|
||||
}
|
||||
|
||||
// List a Migration sub classes to execute
|
||||
$migrations = [
|
||||
new From_0_8_to_0_9_Migration(),
|
||||
new From_0_8_to_0_9_Migration()
|
||||
];
|
||||
|
||||
// Check if MIGRATION_TABLE already exists
|
||||
$tables = $connect->allTables();
|
||||
$pdo = $connect->getPDO();
|
||||
|
||||
if (!in_array(MIGRATION_TABLE, $tables)) {
|
||||
$pdo->exec('
|
||||
CREATE TABLE IF NOT EXISTS `' . MIGRATION_TABLE . '` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` TEXT NOT NULL,
|
||||
`execute_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`)
|
||||
)
|
||||
ENGINE = MyISAM
|
||||
DEFAULT CHARSET = utf8;');
|
||||
|
||||
output('Table ' . MIGRATION_TABLE . ' created.');
|
||||
}
|
||||
|
||||
$selectStmt = $pdo->prepare('SELECT id FROM ' . MIGRATION_TABLE . ' WHERE name=?');
|
||||
$insertStmt = $pdo->prepare('INSERT INTO ' . MIGRATION_TABLE . ' (name) VALUES (?)');
|
||||
|
||||
// Loop on every Migration sub classes
|
||||
foreach ($migrations as $migration) {
|
||||
$className = get_class($migration);
|
||||
|
||||
// Check if $className is a Migration sub class
|
||||
if (!$migration instanceof Migration) {
|
||||
output('The class '. $className . ' is not a sub class of Framadate\\Migration\\Migration.');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Check if the Migration is already executed
|
||||
$selectStmt->execute([$className]);
|
||||
$executed = $selectStmt->rowCount();
|
||||
$selectStmt->closeCursor();
|
||||
|
||||
if (!$executed) {
|
||||
$migration->execute($pdo);
|
||||
$insertStmt->execute([$className]);
|
||||
output('Migration done: ' . $className);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user