support préfixe pour les migrations
This commit is contained in:
parent
b71e879823
commit
4f17d19609
@ -214,8 +214,18 @@ class CapacitorChannel implements ITransactor {
|
||||
|
||||
protected ?array $migration;
|
||||
|
||||
function getMigration(): ?array {
|
||||
return $this->migration;
|
||||
function getMigration(?string $prefix=null): ?array {
|
||||
if ($prefix === null || $this->migration === null) return $this->migration;
|
||||
$migration = null;
|
||||
str::add_suffix($prefix, ":");
|
||||
foreach ($this->migration as $mkey => $mdef) {
|
||||
if (str::starts_with($prefix, $mkey)) {
|
||||
$migration[$mkey] = $mdef;
|
||||
} elseif (strpos($mkey, ":") === false) {
|
||||
$migration[$mkey] = $mdef;
|
||||
}
|
||||
}
|
||||
return $migration;
|
||||
}
|
||||
|
||||
protected ?array $primaryKeys;
|
||||
|
@ -122,7 +122,7 @@ abstract class CapacitorStorage {
|
||||
}
|
||||
|
||||
protected function getMigration(CapacitorChannel $channel): ?array {
|
||||
return $channel->getMigration();
|
||||
return $channel->getMigration($this->db()->getPrefix());
|
||||
}
|
||||
|
||||
/** sérialiser les valeurs qui doivent l'être dans $row */
|
||||
|
@ -2,6 +2,12 @@
|
||||
namespace nulib\db;
|
||||
|
||||
interface IDatabase extends ITransactor {
|
||||
/**
|
||||
* retourner le type de la base de données (mysql, pgsql, sqlite, ...)
|
||||
* ce préfixe peut servir à qualifier les migrations
|
||||
*/
|
||||
function getPrefix(): ?string;
|
||||
|
||||
/** obtenir la requête SQL correspondant à $query */
|
||||
function getSql($query, ?array $params=null): string;
|
||||
|
||||
|
@ -4,6 +4,8 @@ namespace nulib\db\mysql;
|
||||
use nulib\db\pdo\Pdo;
|
||||
|
||||
class Mysql extends Pdo {
|
||||
const PREFIX = "mysql";
|
||||
|
||||
function getDbname(): ?string {
|
||||
$url = $this->dbconn["name"] ?? null;
|
||||
if ($url !== null && preg_match('/^mysql(?::|.*;)dbname=([^;]+)/i', $url, $ms)) {
|
||||
|
@ -39,7 +39,7 @@ class MysqlStorage extends CapacitorStorage {
|
||||
function _getMigration(CapacitorChannel $channel): _mysqlMigration {
|
||||
$migrations = cl::merge([
|
||||
"0init" => [$this->_createSql($channel)],
|
||||
], $channel->getMigration());
|
||||
], $channel->getMigration($this->db->getPrefix()));
|
||||
return new _mysqlMigration($migrations, $channel->getName());
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,12 @@ use nulib\ValueException;
|
||||
class Pdo implements IDatabase {
|
||||
use Tvalues;
|
||||
|
||||
const PREFIX = null;
|
||||
|
||||
function getPrefix(): ?string {
|
||||
return static::PREFIX;
|
||||
}
|
||||
|
||||
static function with($pdo, ?array $params=null): self {
|
||||
if ($pdo instanceof static) {
|
||||
return $pdo;
|
||||
|
@ -12,6 +12,12 @@ use nulib\ValueException;
|
||||
class Pgsql implements IDatabase {
|
||||
use Tvalues;
|
||||
|
||||
const PREFIX = "pgsql";
|
||||
|
||||
function getPrefix(): ?string {
|
||||
return self::PREFIX;
|
||||
}
|
||||
|
||||
static function with($pgsql, ?array $params=null): self {
|
||||
if ($pgsql instanceof static) {
|
||||
return $pgsql;
|
||||
|
@ -44,7 +44,7 @@ class PgsqlStorage extends CapacitorStorage {
|
||||
function _getMigration(CapacitorChannel $channel): _pgsqlMigration {
|
||||
$migrations = cl::merge([
|
||||
"0init" => [$this->_createSql($channel)],
|
||||
], $channel->getMigration());
|
||||
], $channel->getMigration($this->db->getPrefix()));
|
||||
return new _pgsqlMigration($migrations, $channel->getName());
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,12 @@ use SQLite3Stmt;
|
||||
class Sqlite implements IDatabase {
|
||||
use Tvalues;
|
||||
|
||||
const PREFIX = "sqlite";
|
||||
|
||||
function getPrefix(): ?string {
|
||||
return self::PREFIX;
|
||||
}
|
||||
|
||||
static function with($sqlite, ?array $params=null): self {
|
||||
if ($sqlite instanceof static) {
|
||||
return $sqlite;
|
||||
|
@ -34,7 +34,7 @@ class SqliteStorage extends CapacitorStorage {
|
||||
function _getMigration(CapacitorChannel $channel): _sqliteMigration {
|
||||
$migrations = cl::merge([
|
||||
"0init" => [$this->_createSql($channel)],
|
||||
], $channel->getMigration());
|
||||
], $channel->getMigration($this->db->getPrefix()));
|
||||
return new _sqliteMigration($migrations, $channel->getName());
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,6 @@ class Date extends DateTime {
|
||||
}
|
||||
|
||||
function format($format=self::DEFAULT_FORMAT): string {
|
||||
return \DateTime::format($format);
|
||||
return parent::format($format);
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,16 @@ class DateTime extends \DateTime {
|
||||
else return new static($datetime);
|
||||
}
|
||||
|
||||
static function withn($datetime): ?self {
|
||||
if ($datetime === null) return null;
|
||||
elseif ($datetime instanceof static) return $datetime;
|
||||
else return new static($datetime);
|
||||
}
|
||||
|
||||
static function ensure(&$datetime): void {
|
||||
$datetime = static::withn($datetime);
|
||||
}
|
||||
|
||||
const DMY_PATTERN = '/^(\d+)\/(\d+)(?:\/(\d+))?$/';
|
||||
const YMD_PATTERN = '/^((?:\d{2})?\d{2})(\d{2})(\d{2})$/';
|
||||
const DMYHIS_PATTERN = '/^(\d+)\/(\d+)(?:\/(\d+))? +(\d+)[h:.](\d+)(?:[:.](\d+))?$/';
|
||||
|
@ -5,6 +5,7 @@ use nulib\db\Capacitor;
|
||||
use nulib\db\sqlite\impl\MyChannel;
|
||||
use nulib\db\sqlite\impl\MyChannelV2;
|
||||
use nulib\db\sqlite\impl\MyChannelV3;
|
||||
use nulib\db\sqlite\impl\MyIndexChannel;
|
||||
use nulib\output\msg;
|
||||
use nulib\output\std\StdMessenger;
|
||||
use nulib\php\time\DateTime;
|
||||
@ -69,6 +70,42 @@ alter table my add column date_mod datetime;
|
||||
-- infos
|
||||
alter table my add column age integer;
|
||||
|
||||
EOT;
|
||||
self::assertSame($expected, $sql);
|
||||
}
|
||||
|
||||
function testMigrationIndex() {
|
||||
$storage = new SqliteStorage(__DIR__.'/capacitor.db');
|
||||
$data = [
|
||||
["un", "premier", "first"],
|
||||
["deux", "deuxieme", "second"],
|
||||
];
|
||||
|
||||
new Capacitor($storage, $channel = new MyIndexChannel());
|
||||
$channel->reset(true);
|
||||
$channel->chargeAll($data);
|
||||
|
||||
$sql = $channel->getCapacitor()->getCreateSql();
|
||||
$class = MyIndexChannel::class;
|
||||
$expected = <<<EOT
|
||||
-- -*- coding: utf-8 mode: sql -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||||
-- autogénéré à partir de $class
|
||||
|
||||
-- 0init
|
||||
create table if not exists my_index (
|
||||
name varchar not null primary key
|
||||
, first varchar
|
||||
, second varchar
|
||||
, item__ mediumtext
|
||||
, item__sum_ varchar(40)
|
||||
, created_ datetime
|
||||
, modified_ datetime
|
||||
);
|
||||
|
||||
-- index
|
||||
create index my_index_first on my_index(first);
|
||||
create index my_index_second on my_index(second);
|
||||
|
||||
EOT;
|
||||
self::assertSame($expected, $sql);
|
||||
}
|
||||
|
29
php/tests/db/sqlite/impl/MyIndexChannel.php
Normal file
29
php/tests/db/sqlite/impl/MyIndexChannel.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
namespace nulib\db\sqlite\impl;
|
||||
|
||||
use nulib\cl;
|
||||
use nulib\db\CapacitorChannel;
|
||||
|
||||
class MyIndexChannel extends CapacitorChannel {
|
||||
const NAME = "my_index";
|
||||
const TABLE_NAME = "my_index";
|
||||
const COLUMN_DEFINITIONS = [
|
||||
"name" => "varchar not null primary key",
|
||||
"first" => "varchar",
|
||||
"second" => "varchar",
|
||||
];
|
||||
const MIGRATION = [
|
||||
"index" => [
|
||||
"create index my_index_first on my_index(first)",
|
||||
"create index my_index_second on my_index(second)",
|
||||
],
|
||||
];
|
||||
|
||||
function getItemValues($item): ?array {
|
||||
return cl::select($item, [
|
||||
"name" => 0,
|
||||
"first" => 1,
|
||||
"second" => 2,
|
||||
]);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user