SQLite als Standard (keine Einrichtung noetig, WAL aktiviert), optional MySQL/MariaDB. Beide Treiber nutzen dieselben vorbereiteten Statements. Die Migrationen laufen automatisch beim ersten Request; jede Migration liefert das SQL je Treiber. Damit entfaellt ein manueller Schritt beim Deployment ueber FTP. data/ enthaelt eine eigene .htaccess als zweite Absicherung, falls das Verzeichnis beim Hoster doch einmal im Webroot landet.
79 lines
2.9 KiB
PHP
79 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* Mehrere Kurzlink-Domains auf einer Installation.
|
|
*
|
|
* Ein Kurzlink gehoert ab hier zu genau einer Domain; Slugs muessen nur
|
|
* noch INNERHALB einer Domain eindeutig sein. "qr.example.de/messe" und
|
|
* "short.example.de/messe" sind damit zwei verschiedene Links.
|
|
*
|
|
* Bestandslinks bekommen die Kennung 0 ("noch nicht zugeordnet"). Beim
|
|
* ersten Zugriff legt die Anwendung aus APP_BASE_URL die Standarddomain
|
|
* an und traegt sie bei diesen Links nach (siehe DomainRepository).
|
|
* Ein Sentinel-Wert statt NULL, weil SQLite NULL-Werte in einem
|
|
* UNIQUE-Index als jeweils verschieden behandelt - die Eindeutigkeit
|
|
* waere sonst nicht durchgesetzt.
|
|
*/
|
|
return [
|
|
'sqlite' => [
|
|
'CREATE TABLE IF NOT EXISTS domains (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
host TEXT NOT NULL UNIQUE,
|
|
base_url TEXT NOT NULL,
|
|
label TEXT NULL,
|
|
is_default INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL
|
|
)',
|
|
|
|
// SQLite kann eine UNIQUE-Spalte nicht nachtraeglich aendern,
|
|
// deshalb wird die Tabelle neu aufgebaut.
|
|
'PRAGMA foreign_keys = OFF',
|
|
|
|
'CREATE TABLE links_new (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
domain_id INTEGER NOT NULL DEFAULT 0,
|
|
slug TEXT NOT NULL,
|
|
target_url TEXT NOT NULL,
|
|
title TEXT NULL,
|
|
is_active INTEGER NOT NULL DEFAULT 1,
|
|
click_count INTEGER NOT NULL DEFAULT 0,
|
|
last_clicked_at TEXT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
UNIQUE (domain_id, slug)
|
|
)',
|
|
|
|
'INSERT INTO links_new
|
|
(id, domain_id, slug, target_url, title, is_active, click_count, last_clicked_at, created_at, updated_at)
|
|
SELECT id, 0, slug, target_url, title, is_active, click_count, last_clicked_at, created_at, updated_at
|
|
FROM links',
|
|
|
|
'DROP TABLE links',
|
|
'ALTER TABLE links_new RENAME TO links',
|
|
|
|
'CREATE INDEX IF NOT EXISTS idx_links_created_at ON links (created_at)',
|
|
'CREATE INDEX IF NOT EXISTS idx_links_domain ON links (domain_id)',
|
|
|
|
'PRAGMA foreign_keys = ON',
|
|
],
|
|
|
|
'mysql' => [
|
|
'CREATE TABLE IF NOT EXISTS domains (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
host VARCHAR(190) NOT NULL,
|
|
base_url VARCHAR(255) NOT NULL,
|
|
label VARCHAR(255) NULL,
|
|
is_default TINYINT(1) NOT NULL DEFAULT 0,
|
|
created_at DATETIME NOT NULL,
|
|
UNIQUE KEY uniq_domains_host (host)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4',
|
|
|
|
'ALTER TABLE links ADD COLUMN domain_id INT NOT NULL DEFAULT 0',
|
|
'ALTER TABLE links DROP INDEX uniq_links_slug',
|
|
'ALTER TABLE links ADD UNIQUE KEY uniq_links_domain_slug (domain_id, slug)',
|
|
'ALTER TABLE links ADD INDEX idx_links_domain (domain_id)',
|
|
],
|
|
];
|