diff --git a/composer.json b/composer.json index 327c4fd..510c7ed 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,8 @@ "symfony/http-foundation": "^7.4", "symfony/http-kernel": "^7.4", "symfony/messenger": "^7.4", - "symfony/yaml": "^7.4" + "symfony/yaml": "^7.4", + "ibexa/doctrine-migrations": "dev-feat/doctrine-migrations-5.0" }, "require-dev": { "dama/doctrine-test-bundle": "^8", diff --git a/src/bundle/Migration/FixMessengerMessagesIndexesMigration.php b/src/bundle/Migration/FixMessengerMessagesIndexesMigration.php new file mode 100644 index 0000000..106dcf4 --- /dev/null +++ b/src/bundle/Migration/FixMessengerMessagesIndexesMigration.php @@ -0,0 +1,63 @@ +abortIfUnsupportedPlatform(SqlPlatform::MYSQL, SqlPlatform::POSTGRESQL, SqlPlatform::SQLITE); + + if ($schema->getTable('ibexa_messenger_messages')->hasIndex('ibexa_messenger_messages_queue_available_delivered_idx')) { + return; + } + + if ($this->isMySQL()) { + $this->addSqlFile(__DIR__ . '/sql/fix-messenger-messages-indexes-mysql.sql'); + } elseif ($this->isPostgreSQL()) { + $this->addSqlFile(__DIR__ . '/sql/fix-messenger-messages-indexes-postgresql.sql'); + } elseif ($this->isSqlite()) { + $this->addSqlFile(__DIR__ . '/sql/fix-messenger-messages-indexes-sqlite.sql'); + } + } +} diff --git a/src/bundle/Migration/InstallSchemaMigration.php b/src/bundle/Migration/InstallSchemaMigration.php new file mode 100644 index 0000000..c7bb502 --- /dev/null +++ b/src/bundle/Migration/InstallSchemaMigration.php @@ -0,0 +1,51 @@ +abortIfUnsupportedPlatform(SqlPlatform::MYSQL, SqlPlatform::POSTGRESQL, SqlPlatform::SQLITE); + + if ($schema->hasTable('ibexa_messenger_messages') + && $schema->hasTable('ibexa_messenger_lock_keys')) { + return; + } + + if ($this->isMySQL()) { + $this->addSqlFile(__DIR__ . '/sql/install-schema-mysql.sql'); + } elseif ($this->isPostgreSQL()) { + $this->addSqlFile(__DIR__ . '/sql/install-schema-postgresql.sql'); + } elseif ($this->isSqlite()) { + $this->addSqlFile(__DIR__ . '/sql/install-schema-sqlite.sql'); + } + } +} diff --git a/src/bundle/Migration/sql/fix-messenger-messages-indexes-mysql.sql b/src/bundle/Migration/sql/fix-messenger-messages-indexes-mysql.sql new file mode 100644 index 0000000..4307e53 --- /dev/null +++ b/src/bundle/Migration/sql/fix-messenger-messages-indexes-mysql.sql @@ -0,0 +1,7 @@ +DROP INDEX ibexa_messenger_created_at_idx ON ibexa_messenger_messages; +-- ibexa:sql-statement-separator +DROP INDEX ibexa_messenger_available_at_idx ON ibexa_messenger_messages; +-- ibexa:sql-statement-separator +DROP INDEX ibexa_messenger_delivered_at_idx ON ibexa_messenger_messages; +-- ibexa:sql-statement-separator +CREATE INDEX ibexa_messenger_messages_queue_available_delivered_idx ON ibexa_messenger_messages (queue_name, available_at, delivered_at, id); diff --git a/src/bundle/Migration/sql/fix-messenger-messages-indexes-postgresql.sql b/src/bundle/Migration/sql/fix-messenger-messages-indexes-postgresql.sql new file mode 100644 index 0000000..35db770 --- /dev/null +++ b/src/bundle/Migration/sql/fix-messenger-messages-indexes-postgresql.sql @@ -0,0 +1,7 @@ +DROP INDEX ibexa_messenger_created_at_idx; +-- ibexa:sql-statement-separator +DROP INDEX ibexa_messenger_available_at_idx; +-- ibexa:sql-statement-separator +DROP INDEX ibexa_messenger_delivered_at_idx; +-- ibexa:sql-statement-separator +CREATE INDEX ibexa_messenger_messages_queue_available_delivered_idx ON ibexa_messenger_messages (queue_name, available_at, delivered_at, id); diff --git a/src/bundle/Migration/sql/fix-messenger-messages-indexes-sqlite.sql b/src/bundle/Migration/sql/fix-messenger-messages-indexes-sqlite.sql new file mode 100644 index 0000000..35db770 --- /dev/null +++ b/src/bundle/Migration/sql/fix-messenger-messages-indexes-sqlite.sql @@ -0,0 +1,7 @@ +DROP INDEX ibexa_messenger_created_at_idx; +-- ibexa:sql-statement-separator +DROP INDEX ibexa_messenger_available_at_idx; +-- ibexa:sql-statement-separator +DROP INDEX ibexa_messenger_delivered_at_idx; +-- ibexa:sql-statement-separator +CREATE INDEX ibexa_messenger_messages_queue_available_delivered_idx ON ibexa_messenger_messages (queue_name, available_at, delivered_at, id); diff --git a/src/bundle/Migration/sql/install-schema-mysql.sql b/src/bundle/Migration/sql/install-schema-mysql.sql new file mode 100644 index 0000000..047af5b --- /dev/null +++ b/src/bundle/Migration/sql/install-schema-mysql.sql @@ -0,0 +1,3 @@ +CREATE TABLE ibexa_messenger_messages (id BIGINT AUTO_INCREMENT NOT NULL, body LONGTEXT NOT NULL, headers LONGTEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', available_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', delivered_at DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', INDEX ibexa_messenger_messages_queue_available_delivered_idx (queue_name, available_at, delivered_at, id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; +-- ibexa:sql-statement-separator +CREATE TABLE ibexa_messenger_lock_keys (key_id VARCHAR(64) NOT NULL, key_token VARCHAR(44) NOT NULL, key_expiration INT UNSIGNED NOT NULL, PRIMARY KEY(key_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; diff --git a/src/bundle/Migration/sql/install-schema-postgresql.sql b/src/bundle/Migration/sql/install-schema-postgresql.sql new file mode 100644 index 0000000..319804d --- /dev/null +++ b/src/bundle/Migration/sql/install-schema-postgresql.sql @@ -0,0 +1,11 @@ +CREATE TABLE ibexa_messenger_messages (id BIGSERIAL NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id)); +-- ibexa:sql-statement-separator +CREATE INDEX ibexa_messenger_messages_queue_available_delivered_idx ON ibexa_messenger_messages (queue_name, available_at, delivered_at, id); +-- ibexa:sql-statement-separator +COMMENT ON COLUMN ibexa_messenger_messages.created_at IS '(DC2Type:datetime_immutable)'; +-- ibexa:sql-statement-separator +COMMENT ON COLUMN ibexa_messenger_messages.available_at IS '(DC2Type:datetime_immutable)'; +-- ibexa:sql-statement-separator +COMMENT ON COLUMN ibexa_messenger_messages.delivered_at IS '(DC2Type:datetime_immutable)'; +-- ibexa:sql-statement-separator +CREATE TABLE ibexa_messenger_lock_keys (key_id VARCHAR(64) NOT NULL, key_token VARCHAR(44) NOT NULL, key_expiration INT NOT NULL, PRIMARY KEY(key_id)); diff --git a/src/bundle/Migration/sql/install-schema-sqlite.sql b/src/bundle/Migration/sql/install-schema-sqlite.sql new file mode 100644 index 0000000..ff6bbf6 --- /dev/null +++ b/src/bundle/Migration/sql/install-schema-sqlite.sql @@ -0,0 +1,8 @@ +CREATE TABLE ibexa_messenger_messages (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, body CLOB NOT NULL, headers CLOB NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL --(DC2Type:datetime_immutable) +, available_at DATETIME NOT NULL --(DC2Type:datetime_immutable) +, delivered_at DATETIME DEFAULT NULL --(DC2Type:datetime_immutable) +); +-- ibexa:sql-statement-separator +CREATE INDEX ibexa_messenger_messages_queue_available_delivered_idx ON ibexa_messenger_messages (queue_name, available_at, delivered_at, id); +-- ibexa:sql-statement-separator +CREATE TABLE ibexa_messenger_lock_keys (key_id VARCHAR(64) NOT NULL, key_token VARCHAR(44) NOT NULL, key_expiration INTEGER UNSIGNED NOT NULL, PRIMARY KEY(key_id)); diff --git a/src/bundle/Resources/config/schema.yaml b/src/bundle/Resources/config/schema.yaml index 32f3ef0..b3fab04 100644 --- a/src/bundle/Resources/config/schema.yaml +++ b/src/bundle/Resources/config/schema.yaml @@ -1,5 +1,7 @@ tables: ibexa_messenger_messages: + indexes: + ibexa_messenger_messages_queue_available_delivered_idx: { fields: [ queue_name, available_at, delivered_at, id ] } id: id: type: bigint @@ -20,18 +22,12 @@ tables: created_at: type: datetime_immutable nullable: false - index: - name: ibexa_messenger_created_at_idx available_at: type: datetime_immutable nullable: false - index: - name: ibexa_messenger_available_at_idx delivered_at: type: datetime_immutable nullable: true - index: - name: ibexa_messenger_delivered_at_idx ibexa_messenger_lock_keys: id: diff --git a/src/bundle/Resources/config/services/doctrine_migrations.yaml b/src/bundle/Resources/config/services/doctrine_migrations.yaml new file mode 100644 index 0000000..5be8ba0 --- /dev/null +++ b/src/bundle/Resources/config/services/doctrine_migrations.yaml @@ -0,0 +1,17 @@ +services: + Ibexa\Bundle\Messenger\Migration\InstallSchemaMigration: + autowire: true + public: false + arguments: + $connection: '@ibexa.persistence.connection' + tags: + - { name: !php/const Ibexa\Contracts\DoctrineMigrations\Migrations\IbexaMigrationTag::TAG } + + Ibexa\Bundle\Messenger\Migration\FixMessengerMessagesIndexesMigration: + autowire: true + autoconfigure: false + public: false + arguments: + $connection: '@ibexa.persistence.connection' + tags: + - { name: !php/const Ibexa\Contracts\DoctrineMigrations\Migrations\IbexaMigrationTag::TAG }