misuzu/database/2019_12_08_181735_emoticon_restructure.php

76 lines
2.6 KiB
PHP

<?php
namespace Misuzu\DatabaseMigrations\EmoticonRestructure;
use PDO;
function migrate_up(PDO $conn): void {
$emotes = $conn->query('SELECT * FROM `msz_emoticons`')->fetchAll(PDO::FETCH_ASSOC);
$pruneDupes = $conn->prepare('DELETE FROM `msz_emoticons` WHERE `emote_id` = :id');
// int order, int hierarchy, string url, array(string string, int order) strings
$images = [];
$delete = [];
foreach($emotes as $emote) {
if(!isset($images[$emote['emote_url']])) {
$images[$emote['emote_url']] = [
'id' => $emote['emote_id'],
'order' => $emote['emote_order'],
'hierarchy' => $emote['emote_hierarchy'],
'url' => $emote['emote_url'],
'strings' => [],
];
} else {
$delete[] = $emote['emote_id'];
}
$images[$emote['emote_url']]['strings'][] = [
'string' => $emote['emote_string'],
'order' => count($images[$emote['emote_url']]['strings']) + 1,
];
}
foreach($delete as $id) {
$pruneDupes->bindValue('id', $id);
$pruneDupes->execute();
}
$conn->exec('
ALTER TABLE `msz_emoticons`
DROP COLUMN `emote_string`,
DROP INDEX `emotes_string`,
DROP INDEX `emotes_url`,
ADD UNIQUE INDEX `emotes_url` (`emote_url`);
');
$conn->exec("
CREATE TABLE `msz_emoticons_strings` (
`emote_id` INT UNSIGNED NOT NULL,
`emote_string_order` MEDIUMINT NOT NULL DEFAULT 0,
`emote_string` VARCHAR(50) NOT NULL COLLATE 'ascii_general_nopad_ci',
INDEX `string_emote_foreign` (`emote_id`),
INDEX `string_order_key` (`emote_string_order`),
UNIQUE INDEX `string_unique` (`emote_string`),
CONSTRAINT `string_emote_foreign`
FOREIGN KEY (`emote_id`)
REFERENCES `msz_emoticons` (`emote_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin';
");
$insertString = $conn->prepare('
INSERT INTO `msz_emoticons_strings` (`emote_id`, `emote_string_order`, `emote_string`)
VALUES (:id, :order, :string)
');
foreach($images as $image) {
$insertString->bindValue('id', $image['id']);
foreach($image['strings'] as $string) {
$insertString->bindValue('order', $string['order']);
$insertString->bindValue('string', $string['string']);
$insertString->execute();
}
}
}