]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #2646 from wallabag/explain-migrations-in-doc
authorNicolas Lœuillet <nicolas@loeuillet.org>
Thu, 26 Jan 2017 12:15:06 +0000 (13:15 +0100)
committerGitHub <noreply@github.com>
Thu, 26 Jan 2017 12:15:06 +0000 (13:15 +0100)
Added explanations about migrations

21 files changed:
app/DoctrineMigrations/Version20160410190541.php
app/DoctrineMigrations/Version20160812120952.php
app/DoctrineMigrations/Version20160911214952.php
app/DoctrineMigrations/Version20160916201049.php
app/DoctrineMigrations/Version20161001072726.php
app/DoctrineMigrations/Version20161022134138.php
app/DoctrineMigrations/Version20161024212538.php
app/DoctrineMigrations/Version20161031132655.php
app/DoctrineMigrations/Version20161104073720.php
app/DoctrineMigrations/Version20161106113822.php
app/DoctrineMigrations/Version20161117071626.php
app/DoctrineMigrations/Version20161118134328.php
app/DoctrineMigrations/Version20161122203647.php
app/DoctrineMigrations/Version20161128131503.php
docs/de/user/query-upgrade-21-22.rst [new file with mode: 0644]
docs/de/user/upgrade.rst
docs/en/user/query-upgrade-21-22.rst [new file with mode: 0644]
docs/en/user/upgrade.rst
docs/fr/user/query-upgrade-21-22.rst [new file with mode: 0644]
docs/fr/user/upgrade.rst
scripts/update.sh

index f166a32513cd7ac90eef9ef26aee7306acb45e29..ebf4135f9f5052a0e1f519bb4028077f0d8c9520 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added foreign keys for account resetting
+ */
 class Version20160410190541 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index 053b8d889c736baf3030d0c89c1ffdcbdb357af6..bd6e8d6369ae03499333109557b39d340cc6697a 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added name field on wallabag_oauth2_clients
+ */
 class Version20160812120952 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index 6ddeb767c85acd23291ee4e1edd3809c6e7fea92..edef81ed558b895dd71270afa788e0cc1570b9c1 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added settings for RabbitMQ and Redis imports
+ */
 class Version20160911214952 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index 8b42bb8791a69bc3f0220508186cda0496adaf81..9f8e77e73f926bb7e60d426b745e13cf7c572d95 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added pocket_consumer_key field on wallabag_config
+ */
 class Version20160916201049 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index f6930778c391fd42b9ca9e494b92f96d3afb615d..f247c236f08c7d71ab166f234104ca07b6c56956 100644 (file)
@@ -6,7 +6,11 @@ use Doctrine\DBAL\Migrations\AbstractMigration;
 use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Doctrine\DBAL\Migrations\SkipMigrationException;
 
+/**
+ * Added pocket_consumer_key field on wallabag_config
+ */
 class Version20161001072726 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index d0e5cb3fc695c9d749d3f41b988dbc9c99fbc298..c71166a00aca3fcc32ab03d292681daac4d63c96 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Converted database to utf8mb4 encoding (for MySQL only)
+ */
 class Version20161022134138 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index 75ff86f1fa40602870e851d1ab72985fc21240f1..ecb872d1059ec99b0d723e494b40e9c9d3cb2c6a 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added user_id column on oauth2_clients to prevent users to delete API clients from other users
+ */
 class Version20161024212538 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
@@ -14,6 +17,8 @@ class Version20161024212538 extends AbstractMigration implements ContainerAwareI
      */
     private $container;
 
+    private $constraintName = 'IDX_user_oauth_client';
+
     public function setContainer(ContainerInterface $container = null)
     {
         $this->container = $container;
@@ -33,13 +38,14 @@ class Version20161024212538 extends AbstractMigration implements ContainerAwareI
 
         $this->skipIf($clientsTable->hasColumn('user_id'), 'It seems that you already played this migration.');
 
-        $clientsTable->addColumn('user_id', 'integer');
+        $clientsTable->addColumn('user_id', 'integer', ['notnull' => false]);
 
         $clientsTable->addForeignKeyConstraint(
             $this->getTable('user'),
             ['user_id'],
             ['id'],
-            ['onDelete' => 'CASCADE']
+            ['onDelete' => 'CASCADE'],
+            $this->constraintName
         );
     }
 
@@ -48,5 +54,14 @@ class Version20161024212538 extends AbstractMigration implements ContainerAwareI
      */
     public function down(Schema $schema)
     {
+        $clientsTable = $schema->getTable($this->getTable('oauth2_clients'));
+
+        $this->skipIf(!$clientsTable->hasColumn('user_id'), 'It seems that you already played this migration.');
+
+        $clientsTable->dropColumn('user_id', 'integer');
+
+        if ($this->connection->getDatabasePlatform()->getName() != 'sqlite') {
+            $clientsTable->removeForeignKey($this->constraintName);
+        }
     }
 }
index f81898ff3c496ab3b1eeabd9f4a9ef74ba1c2bee..83b97ca99b7d82d116cd45e078fcc6da7ff14663 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added the internal setting to enable/disable downloading pictures
+ */
 class Version20161031132655 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index 4721426a406aa093b0142eb2ae0888699de5ec76..fb8f5fa1e5eee653bcf6664c72236f9f598d6ede 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added created_at index on entry table
+ */
 class Version20161104073720 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index 55bd87a2ccba18a2a85c2b9ff87bf4bfb03c093d..de3702a406246e379a19de7bd2e8f9e9452eebc2 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added action_mark_as_read field on config table
+ */
 class Version20161106113822 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
@@ -45,6 +48,9 @@ class Version20161106113822 extends AbstractMigration implements ContainerAwareI
     public function down(Schema $schema)
     {
         $configTable = $schema->getTable($this->getTable('config'));
-        $userTable->dropColumn('action_mark_as_read');
+
+        $this->skipIf(!$configTable->hasColumn('action_mark_as_read'), 'It seems that you already played this migration.');
+
+        $configTable->dropColumn('action_mark_as_read');
     }
 }
index d864888f1acd15ef3fb1f5e925849f1ec99f670c..8daa2142b1afa3f5303616aaeaab6531c97129cc 100644 (file)
@@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+/**
+ * Added the internal setting to share articles to unmark.it
+ */
 class Version20161117071626 extends AbstractMigration implements ContainerAwareInterface
 {
     /**
index f168cb53c813a601b19607b29c3f58d78b547953..7b2eeb7bd53333bdc76f8fd1662a6d01a5d2c5e2 100644 (file)
@@ -47,7 +47,10 @@ class Version20161118134328 extends AbstractMigration implements ContainerAwareI
      */
     public function down(Schema $schema)
     {
-        $userTable = $schema->getTable($this->getTable('entry'));
-        $userTable->dropColumn('http_status');
+        $entryTable = $schema->getTable($this->getTable('entry'));
+
+        $this->skipIf(!$entryTable->hasColumn('http_status'), 'It seems that you already played this migration.');
+
+        $entryTable->dropColumn('http_status');
     }
 }
index 94197193cdc3d6c277749330128b17eb467e35cc..9b17d6efddfc90547bd02c5f2dc0de527ee7272d 100644 (file)
@@ -54,7 +54,10 @@ class Version20161122203647 extends AbstractMigration implements ContainerAwareI
     public function down(Schema $schema)
     {
         $userTable = $schema->getTable($this->getTable('user'));
-        $userTable->addColumn('expired', 'smallint');
-        $userTable->addColumn('credentials_expired', 'smallint');
+
+        $this->skipIf(true === $userTable->hasColumn('expired') || true === $userTable->hasColumn('credentials_expired'), 'It seems that you already played this migration.');
+
+        $userTable->addColumn('expired', 'smallint', ['notnull' => false]);
+        $userTable->addColumn('credentials_expired', 'smallint', ['notnull' => false]);
     }
 }
index f0e016c8c7b715242035ddf9fc9e469f6af57920..b71aa38bcbe6fc5cab9edf1ac6b4642138332b1b 100644 (file)
@@ -55,7 +55,7 @@ class Version20161128131503 extends AbstractMigration implements ContainerAwareI
 
         foreach ($this->fields as $field => $type) {
             $this->skipIf($userTable->hasColumn($field), 'It seems that you already played this migration.');
-            $userTable->addColumn($field, $type);
+            $userTable->addColumn($field, $type, ['notnull' => false]);
         }
     }
 }
diff --git a/docs/de/user/query-upgrade-21-22.rst b/docs/de/user/query-upgrade-21-22.rst
new file mode 100644 (file)
index 0000000..cd201dc
--- /dev/null
@@ -0,0 +1,797 @@
+Migration 20161001072726
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry_tag DROP FOREIGN KEY FK_C9F0DD7CBA364942
+    ALTER TABLE wallabag_entry_tag DROP FOREIGN KEY FK_C9F0DD7CBAD26311
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_tag FOREIGN KEY (tag_id) REFERENCES wallabag_tag (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_annotation DROP FOREIGN KEY FK_A7AED006BA364942
+    ALTER TABLE wallabag_annotation ADD CONSTRAINT FK_annotation_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+
+Migration down
+""""""""""""""
+
+We didn't write down migration for ``20161001072726``.
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry_tag DROP CONSTRAINT fk_c9f0dd7cba364942
+    ALTER TABLE wallabag_entry_tag DROP CONSTRAINT fk_c9f0dd7cbad26311
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_tag FOREIGN KEY (tag_id) REFERENCES wallabag_tag (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_annotation DROP CONSTRAINT fk_a7aed006ba364942
+    ALTER TABLE wallabag_annotation ADD CONSTRAINT FK_annotation_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+
+Migration down
+""""""""""""""
+
+We didn't write down migration for ``20161001072726``.
+
+SQLite
+^^^^^^
+
+This migration can only be executed safely on MySQL or PostgreSQL.
+
+Migration 20161022134138
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER DATABASE wallabag CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE confirmation_token confirmation_token VARCHAR(180) DEFAULT NULL;
+    ALTER TABLE wallabag_user CHANGE salt salt VARCHAR(180) NOT NULL;
+    ALTER TABLE wallabag_user CHANGE password password VARCHAR(180) NOT NULL;
+    ALTER TABLE wallabag_annotation CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_tag CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `text` `text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `quote` `quote` VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `title` `title` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `content` `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_tag CHANGE `label` `label` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE `name` `name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER DATABASE wallabag CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `text` `text` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `quote` `quote` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `title` `title` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `content` `content` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_tag CHANGE `label` `label` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE `name` `name` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+
+PostgreSQL and SQLite
+^^^^^^^^^^^^^^^^^^^^^
+
+This migration only apply to MySQL.
+
+Migration 20161024212538
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients ADD user_id INT NOT NULL
+    ALTER TABLE wallabag_oauth2_clients ADD CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients DROP FOREIGN KEY IDX_user_oauth_client
+    ALTER TABLE wallabag_oauth2_clients DROP user_id
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients ADD user_id INT DEFAULT NULL
+    ALTER TABLE wallabag_oauth2_clients ADD CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients DROP CONSTRAINT idx_user_oauth_client
+    ALTER TABLE wallabag_oauth2_clients DROP user_id
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE TEMPORARY TABLE __temp__wallabag_oauth2_clients AS SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM wallabag_oauth2_clients
+    DROP TABLE wallabag_oauth2_clients
+    CREATE TABLE wallabag_oauth2_clients (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, allowed_grant_types CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id), CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE)
+    INSERT INTO wallabag_oauth2_clients (id, random_id, redirect_uris, secret, allowed_grant_types, name) SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM __temp__wallabag_oauth2_clients
+    DROP TABLE __temp__wallabag_oauth2_clients
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_635D765EA76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_oauth2_clients AS SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM wallabag_oauth2_clients
+    DROP TABLE wallabag_oauth2_clients
+    CREATE TABLE wallabag_oauth2_clients (id INTEGER NOT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, allowed_grant_types CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_oauth2_clients (id, random_id, redirect_uris, secret, allowed_grant_types, name) SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM __temp__wallabag_oauth2_clients
+    DROP TABLE __temp__wallabag_oauth2_clients
+
+Migration 20161031132655
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+Migration 20161104073720
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_created_at ON wallabag_entry
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX idx_entry_created_at
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_created_at
+    DROP INDEX IDX_F4D18282A76ED395
+    DROP INDEX created_at_idx
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+
+Migration 20161106113822
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD action_mark_as_read INT DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP action_mark_as_read
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD action_mark_as_read INT DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP action_mark_as_read
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD COLUMN action_mark_as_read INTEGER DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_87E64C53A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_config AS SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM wallabag_config
+    DROP TABLE wallabag_config
+    CREATE TABLE wallabag_config (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, theme VARCHAR(255) NOT NULL COLLATE BINARY, items_per_page INTEGER NOT NULL, language VARCHAR(255) NOT NULL COLLATE BINARY, rss_token VARCHAR(255) DEFAULT NULL COLLATE BINARY, rss_limit INTEGER DEFAULT NULL, reading_speed DOUBLE PRECISION DEFAULT NULL, pocket_consumer_key VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_config (id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key) SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM __temp__wallabag_config
+    DROP TABLE __temp__wallabag_config
+    CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config (user_id)
+
+Migration 20161117071626
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+Migration 20161118134328
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry DROP http_status
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry DROP http_status
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD COLUMN http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+
+Migration 20161122144743
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+Migration 20161122203647
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP expired, DROP credentials_expired
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD expired SMALLINT DEFAULT NULL, ADD credentials_expired SMALLINT DEFAULT NULL
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP expired
+    ALTER TABLE wallabag_user DROP credentials_expired
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD expired SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD credentials_expired SMALLINT DEFAULT NULL
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_1D63E7E5C05FB297
+    DROP INDEX UNIQ_1D63E7E5A0D96FBF
+    DROP INDEX UNIQ_1D63E7E592FC23A8
+    CREATE TEMPORARY TABLE __temp__wallabag_user AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted FROM wallabag_user
+    DROP TABLE wallabag_user
+    CREATE TABLE wallabag_user (id INTEGER NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL COLLATE BINARY, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, locked BOOLEAN NOT NULL, expires_at DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL COLLATE BINARY, password_requested_at DATETIME DEFAULT NULL, roles CLOB NOT NULL COLLATE BINARY, credentials_expire_at DATETIME DEFAULT NULL, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, twoFactorAuthentication BOOLEAN NOT NULL, trusted CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted FROM __temp__wallabag_user
+    DROP TABLE __temp__wallabag_user
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD COLUMN expired SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN credentials_expired SMALLINT DEFAULT NULL
+
+Migration 20161128084725
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD list_mode INT DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP list_mode
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD list_mode INT DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP list_mode
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD COLUMN list_mode INTEGER DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_87E64C53A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_config AS SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM wallabag_config
+    DROP TABLE wallabag_config
+    CREATE TABLE wallabag_config (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, theme VARCHAR(255) NOT NULL COLLATE BINARY, items_per_page INTEGER NOT NULL, language VARCHAR(255) NOT NULL COLLATE BINARY, rss_token VARCHAR(255) DEFAULT NULL COLLATE BINARY, rss_limit INTEGER DEFAULT NULL, reading_speed DOUBLE PRECISION DEFAULT NULL, pocket_consumer_key VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_config (id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key) SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM __temp__wallabag_config
+    DROP TABLE __temp__wallabag_config
+    CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config (user_id)
+
+Migration 20161128131503
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP locked, DROP credentials_expire_at, DROP expires_at
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD locked SMALLINT DEFAULT NULL, ADD credentials_expire_at DATETIME DEFAULT NULL, ADD expires_at DATETIME DEFAULT NULL
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP locked
+    ALTER TABLE wallabag_user DROP credentials_expire_at
+    ALTER TABLE wallabag_user DROP expires_at
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD locked SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD credentials_expire_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL
+    ALTER TABLE wallabag_user ADD expires_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD COLUMN locked SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN credentials_expire_at DATETIME DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN expires_at DATETIME DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_1D63E7E592FC23A8
+    DROP INDEX UNIQ_1D63E7E5A0D96FBF
+    DROP INDEX UNIQ_1D63E7E5C05FB297
+    CREATE TEMPORARY TABLE __temp__wallabag_user AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired FROM wallabag_user
+    DROP TABLE wallabag_user
+    CREATE TABLE wallabag_user (id INTEGER NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL COLLATE BINARY, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL COLLATE BINARY, password_requested_at DATETIME DEFAULT NULL, roles CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, twoFactorAuthentication BOOLEAN NOT NULL, trusted CLOB DEFAULT NULL COLLATE BINARY, expired SMALLINT DEFAULT NULL, credentials_expired SMALLINT DEFAULT NULL, PRIMARY KEY(id))
+    INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired FROM __temp__wallabag_user
+    DROP TABLE __temp__wallabag_user
+    CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token)
+
+Migration 20161214094403
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_uid ON wallabag_entry
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX idx_entry_uid
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_F4D18282A76ED395
+    DROP INDEX created_at_idx
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_uid
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
index fbbf29f45092e3cc349e09abf4322b20943b70d2..1107616e2fc3ace708c7eef7faf477c3af46b67e 100644 (file)
@@ -3,42 +3,53 @@ wallabag-Installation aktualisieren
 
 Du wirst hier mehrere Wege finden, um deine wallabag zu aktualisieren:
 
+- `von 2.1.x zu 2.2.x <#upgrade-von-2-1-x-zu-2-2-x>`_
 - `von 2.0.x zu 2.1.1 <#upgrade-von-2-0-x-zu-2-1-1>`_
-- `von 2.1.x zu 2.1.y <#upgrade-von-2-1-x-zu-2-1-y>`_
 - `von 1.x zu 2.x <#upgrade-von-1-x>`_
 
-Upgrade von 2.0.x zu 2.1.1
----------------------------
-
-.. warning::
-
-    Mache eine Sicherung deines Pocket-Consumer-Key, falls hinzugefügt, da dieser nach dem Upgrade erneut hinzugefügt werden muss.
+Upgrade von 2.1.x zu 2.2.x
+--------------------------
 
 Upgrade auf einem dedizierten Webserver
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 ::
 
-    rm -rf var/cache/*
-    git fetch origin
-    git fetch --tags
-    git checkout 2.1.1 --force
-    SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
-    php bin/console doctrine:migrations:migrate --env=prod
-    php bin/console cache:clear --env=prod
+    make update
+
+Erklärungen über die Datenbankmigration
+"""""""""""""""""""""""""""""""""""""""
+
+Während des Updates migrieren wir die Datenbank.
+
+Alle Datenbankmigrationen sind im Verzeichnis ``app/DoctrineMigrations`` gespeichert. Jede von ihnen kann einzeln ausgeführt werden:
+``bin/console doctrine:migrations:execute 20161001072726 --env=prod``.
+
+Dies ist die Migrationsliste von 2.1.x auf 2.2.0:
+
+* ``20161001072726``: Fremdschlüssel für das Zurücksetzen des Kontos hinzugefügt
+* ``20161022134138``: Datenbank zum ``utf8mb4``-Encoding ändern (nur für MySQL)
+* ``20161024212538``: ``user_id``-Spalte zu ``oauth2_clients`` hinzugefügt, um Benutzer davon abzuhalten, API-Clients anderer Nutzer zu löschen
+* ``20161031132655``: Interne Einstellung für das (de-)aktivieren vom Bilder-Download hinzugefügt
+* ``20161104073720``: ``created_at``-Index zur ``entry``-Tabelle hinzugefügt
+* ``20161106113822``: ``action_mark_as_read``-Feld zur ``config``-Tabelle hinzugefügt
+* ``20161117071626``: Interne Einstellung zum Teilen mit unmark.it hinzugefügt
+* ``20161118134328``: ``http_status``-Feld zur ``entry``-Tabelle hinzugefügt
+* ``20161122144743``: Interne Einstellung für das (de-)aktivieren zum Holen von Artikeln mit einer Paywall hinzugefügt
+* ``20161122203647``: ``expired``- und ``credentials_expired``-Feld aus der ``user``-Tabelle entfernt
 
 Upgrade auf einem Shared Hosting
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Sichere deine ``app/config/parameters.yml``-Datei.
 
-Lade das 2.1.1-Release von wallabag herunter:
+Lade das letzte Release von wallabag herunter:
 
 .. code-block:: bash
 
-    wget https://framabag.org/wallabag-release-2.1.1.tar.gz && tar xvf wallabag-release-2.1.1.tar.gz
+    wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
 
-(md5 hash of the 2.1.1 package: ``9584a3b60a2b2a4de87f536548caac93``)
+Du findest den `aktuellen MD5-Hash auf unserer Webseite <https://www.wallabag.org/pages/download-wallabag.html>`_.
 
 Extrahiere das Archiv in deinen wallabag-Ordner und ersetze die ``app/config/parameters.yml`` mit deiner.
 
@@ -48,42 +59,42 @@ Falls du SQLite nutzt, musst du außerdem deinen ``data/``-Ordner in die neue In
 
 Leere den ``var/cache``-Ordner.
 
-Du musst einige SQL-Abfragen durchführen, um deine Datenbank zu aktualisieren. Wir gehen in diesem Fall davon aus, dass das Tabellenpräfix ``wallabag_`` ist und eine MySQL-Datenbank verwendet wird:
+Du musst einige SQL-Abfragen durchführen, um deine Datenbank zu aktualisieren. Wir gehen in diesem Fall davon aus, dass das Tabellenpräfix ``wallabag_`` ist.
 
-.. code-block:: sql
+`You can find all the queries here <http://doc.wallabag.org/en/master/user/query-upgrade-21-22.html>`_.
 
-    ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL;
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry');
-    ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL;
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import');
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import');
-    ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL;
-    DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key';
+Upgrade von 2.0.x zu 2.1.1
+---------------------------
+
+.. warning::
 
-Upgrade von 2.1.x zu 2.1.y
------------------------------
+    Mache eine Sicherung deines Pocket-Consumer-Key, falls hinzugefügt, da dieser nach dem Upgrade erneut hinzugefügt werden muss.
 
 Upgrade auf einem dedizierten Webserver
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Um deine wallabag-Installation auf die letzte Version zu aktualisieren, führe den folgenden Befehl in deinem wallabag-Ordner aus:
-
 ::
 
-    make update
+    rm -rf var/cache/*
+    git fetch origin
+    git fetch --tags
+    git checkout 2.1.1 --force
+    SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
+    php bin/console doctrine:migrations:migrate --env=prod
+    php bin/console cache:clear --env=prod
 
 Upgrade auf einem Shared Hosting
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Sichere deine ``app/config/parameters.yml``-Datei.
 
-Lade das letzte Release von wallabag herunter:
+Lade das 2.1.1-Release von wallabag herunter:
 
 .. code-block:: bash
 
-    wget https://wllbg.org/latest-v2-package && tar xvf latest-v2-package
+    wget http://framabag.org/wallabag-release-2.1.1.tar.gz && tar xvf wallabag-release-2.1.1.tar.gz
 
-Du findest den `aktuellen MD5-Hash auf unserer Webseite <https://www.wallabag.org/pages/download-wallabag.html>`_.
+(md5 hash of the 2.1.1 package: ``9584a3b60a2b2a4de87f536548caac93``)
 
 Extrahiere das Archiv in deinen wallabag-Ordner und ersetze die ``app/config/parameters.yml`` mit deiner.
 
@@ -93,6 +104,18 @@ Falls du SQLite nutzt, musst du außerdem deinen ``data/``-Ordner in die neue In
 
 Leere den ``var/cache``-Ordner.
 
+Du musst einige SQL-Abfragen durchführen, um deine Datenbank zu aktualisieren. Wir gehen in diesem Fall davon aus, dass das Tabellenpräfix ``wallabag_`` ist und eine MySQL-Datenbank verwendet wird:
+
+.. code-block:: sql
+
+    ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL;
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry');
+    ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL;
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import');
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import');
+    ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL;
+    DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key';
+
 Upgrade von 1.x
 ---------------
 
@@ -100,4 +123,4 @@ Es gibt kein automatisiertes Skript, um wallabag 1.x auf wallabag 2.x zu aktuali
 
 - deine Daten exportieren
 - wallabag 2.x installieren (Dokumentation <http://doc.wallabag.org/en/master/user/installation.html>`_ )
-- die Daten in die neue Installation importieren (`Dokumentation <http://doc.wallabag.org/en/master/user/import.html>`_ )
\ No newline at end of file
+- die Daten in die neue Installation importieren (`Dokumentation <http://doc.wallabag.org/en/master/user/import.html>`_ )
diff --git a/docs/en/user/query-upgrade-21-22.rst b/docs/en/user/query-upgrade-21-22.rst
new file mode 100644 (file)
index 0000000..cd201dc
--- /dev/null
@@ -0,0 +1,797 @@
+Migration 20161001072726
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry_tag DROP FOREIGN KEY FK_C9F0DD7CBA364942
+    ALTER TABLE wallabag_entry_tag DROP FOREIGN KEY FK_C9F0DD7CBAD26311
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_tag FOREIGN KEY (tag_id) REFERENCES wallabag_tag (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_annotation DROP FOREIGN KEY FK_A7AED006BA364942
+    ALTER TABLE wallabag_annotation ADD CONSTRAINT FK_annotation_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+
+Migration down
+""""""""""""""
+
+We didn't write down migration for ``20161001072726``.
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry_tag DROP CONSTRAINT fk_c9f0dd7cba364942
+    ALTER TABLE wallabag_entry_tag DROP CONSTRAINT fk_c9f0dd7cbad26311
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_tag FOREIGN KEY (tag_id) REFERENCES wallabag_tag (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_annotation DROP CONSTRAINT fk_a7aed006ba364942
+    ALTER TABLE wallabag_annotation ADD CONSTRAINT FK_annotation_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+
+Migration down
+""""""""""""""
+
+We didn't write down migration for ``20161001072726``.
+
+SQLite
+^^^^^^
+
+This migration can only be executed safely on MySQL or PostgreSQL.
+
+Migration 20161022134138
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER DATABASE wallabag CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE confirmation_token confirmation_token VARCHAR(180) DEFAULT NULL;
+    ALTER TABLE wallabag_user CHANGE salt salt VARCHAR(180) NOT NULL;
+    ALTER TABLE wallabag_user CHANGE password password VARCHAR(180) NOT NULL;
+    ALTER TABLE wallabag_annotation CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_tag CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `text` `text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `quote` `quote` VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `title` `title` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `content` `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_tag CHANGE `label` `label` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE `name` `name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER DATABASE wallabag CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `text` `text` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `quote` `quote` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `title` `title` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `content` `content` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_tag CHANGE `label` `label` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE `name` `name` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+
+PostgreSQL and SQLite
+^^^^^^^^^^^^^^^^^^^^^
+
+This migration only apply to MySQL.
+
+Migration 20161024212538
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients ADD user_id INT NOT NULL
+    ALTER TABLE wallabag_oauth2_clients ADD CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients DROP FOREIGN KEY IDX_user_oauth_client
+    ALTER TABLE wallabag_oauth2_clients DROP user_id
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients ADD user_id INT DEFAULT NULL
+    ALTER TABLE wallabag_oauth2_clients ADD CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients DROP CONSTRAINT idx_user_oauth_client
+    ALTER TABLE wallabag_oauth2_clients DROP user_id
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE TEMPORARY TABLE __temp__wallabag_oauth2_clients AS SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM wallabag_oauth2_clients
+    DROP TABLE wallabag_oauth2_clients
+    CREATE TABLE wallabag_oauth2_clients (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, allowed_grant_types CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id), CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE)
+    INSERT INTO wallabag_oauth2_clients (id, random_id, redirect_uris, secret, allowed_grant_types, name) SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM __temp__wallabag_oauth2_clients
+    DROP TABLE __temp__wallabag_oauth2_clients
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_635D765EA76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_oauth2_clients AS SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM wallabag_oauth2_clients
+    DROP TABLE wallabag_oauth2_clients
+    CREATE TABLE wallabag_oauth2_clients (id INTEGER NOT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, allowed_grant_types CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_oauth2_clients (id, random_id, redirect_uris, secret, allowed_grant_types, name) SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM __temp__wallabag_oauth2_clients
+    DROP TABLE __temp__wallabag_oauth2_clients
+
+Migration 20161031132655
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+Migration 20161104073720
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_created_at ON wallabag_entry
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX idx_entry_created_at
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_created_at
+    DROP INDEX IDX_F4D18282A76ED395
+    DROP INDEX created_at_idx
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+
+Migration 20161106113822
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD action_mark_as_read INT DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP action_mark_as_read
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD action_mark_as_read INT DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP action_mark_as_read
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD COLUMN action_mark_as_read INTEGER DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_87E64C53A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_config AS SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM wallabag_config
+    DROP TABLE wallabag_config
+    CREATE TABLE wallabag_config (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, theme VARCHAR(255) NOT NULL COLLATE BINARY, items_per_page INTEGER NOT NULL, language VARCHAR(255) NOT NULL COLLATE BINARY, rss_token VARCHAR(255) DEFAULT NULL COLLATE BINARY, rss_limit INTEGER DEFAULT NULL, reading_speed DOUBLE PRECISION DEFAULT NULL, pocket_consumer_key VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_config (id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key) SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM __temp__wallabag_config
+    DROP TABLE __temp__wallabag_config
+    CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config (user_id)
+
+Migration 20161117071626
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+Migration 20161118134328
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry DROP http_status
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry DROP http_status
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD COLUMN http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+
+Migration 20161122144743
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+Migration 20161122203647
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP expired, DROP credentials_expired
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD expired SMALLINT DEFAULT NULL, ADD credentials_expired SMALLINT DEFAULT NULL
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP expired
+    ALTER TABLE wallabag_user DROP credentials_expired
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD expired SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD credentials_expired SMALLINT DEFAULT NULL
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_1D63E7E5C05FB297
+    DROP INDEX UNIQ_1D63E7E5A0D96FBF
+    DROP INDEX UNIQ_1D63E7E592FC23A8
+    CREATE TEMPORARY TABLE __temp__wallabag_user AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted FROM wallabag_user
+    DROP TABLE wallabag_user
+    CREATE TABLE wallabag_user (id INTEGER NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL COLLATE BINARY, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, locked BOOLEAN NOT NULL, expires_at DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL COLLATE BINARY, password_requested_at DATETIME DEFAULT NULL, roles CLOB NOT NULL COLLATE BINARY, credentials_expire_at DATETIME DEFAULT NULL, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, twoFactorAuthentication BOOLEAN NOT NULL, trusted CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted FROM __temp__wallabag_user
+    DROP TABLE __temp__wallabag_user
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD COLUMN expired SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN credentials_expired SMALLINT DEFAULT NULL
+
+Migration 20161128084725
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD list_mode INT DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP list_mode
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD list_mode INT DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP list_mode
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD COLUMN list_mode INTEGER DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_87E64C53A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_config AS SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM wallabag_config
+    DROP TABLE wallabag_config
+    CREATE TABLE wallabag_config (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, theme VARCHAR(255) NOT NULL COLLATE BINARY, items_per_page INTEGER NOT NULL, language VARCHAR(255) NOT NULL COLLATE BINARY, rss_token VARCHAR(255) DEFAULT NULL COLLATE BINARY, rss_limit INTEGER DEFAULT NULL, reading_speed DOUBLE PRECISION DEFAULT NULL, pocket_consumer_key VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_config (id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key) SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM __temp__wallabag_config
+    DROP TABLE __temp__wallabag_config
+    CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config (user_id)
+
+Migration 20161128131503
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP locked, DROP credentials_expire_at, DROP expires_at
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD locked SMALLINT DEFAULT NULL, ADD credentials_expire_at DATETIME DEFAULT NULL, ADD expires_at DATETIME DEFAULT NULL
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP locked
+    ALTER TABLE wallabag_user DROP credentials_expire_at
+    ALTER TABLE wallabag_user DROP expires_at
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD locked SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD credentials_expire_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL
+    ALTER TABLE wallabag_user ADD expires_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD COLUMN locked SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN credentials_expire_at DATETIME DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN expires_at DATETIME DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_1D63E7E592FC23A8
+    DROP INDEX UNIQ_1D63E7E5A0D96FBF
+    DROP INDEX UNIQ_1D63E7E5C05FB297
+    CREATE TEMPORARY TABLE __temp__wallabag_user AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired FROM wallabag_user
+    DROP TABLE wallabag_user
+    CREATE TABLE wallabag_user (id INTEGER NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL COLLATE BINARY, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL COLLATE BINARY, password_requested_at DATETIME DEFAULT NULL, roles CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, twoFactorAuthentication BOOLEAN NOT NULL, trusted CLOB DEFAULT NULL COLLATE BINARY, expired SMALLINT DEFAULT NULL, credentials_expired SMALLINT DEFAULT NULL, PRIMARY KEY(id))
+    INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired FROM __temp__wallabag_user
+    DROP TABLE __temp__wallabag_user
+    CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token)
+
+Migration 20161214094403
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_uid ON wallabag_entry
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX idx_entry_uid
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_F4D18282A76ED395
+    DROP INDEX created_at_idx
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_uid
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
index e6e4c16575130995568d4226f11beec06bb2950d..99260e13509fc4b1f177d4974593d7dc5b380187 100644 (file)
@@ -1,44 +1,62 @@
+==================================
 Upgrade your wallabag installation
 ==================================
 
 You will find here different ways to upgrade your wallabag:
 
+- `from 2.1.x to 2.2.x <#upgrading-from-2-1-x-to-2-2-x>`_
 - `from 2.0.x to 2.1.1 <#upgrade-from-2-0-x-to-2-1-1>`_
-- `from 2.1.x to 2.1.y <#upgrading-from-2-1-x-to-2-1-y>`_
 - `from 1.x to 2.x <#from-wallabag-1-x>`_
 
-Upgrade from 2.0.x to 2.1.1
----------------------------
-
-.. warning::
-
-    Before this migration, if you configured the Pocket import by adding your consumer key in Internal settings, please do a backup of it: you'll have to add it into the Config page after the upgrade.
+*****************************
+Upgrading from 2.1.x to 2.2.x
+*****************************
 
 Upgrade on a dedicated web server
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+=================================
 
 ::
 
-    rm -rf var/cache/*
-    git fetch origin
-    git fetch --tags
-    git checkout 2.1.1 --force
-    SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
-    php bin/console doctrine:migrations:migrate --env=prod
-    php bin/console cache:clear --env=prod
+    make update
+
+Explanations about database migrations
+--------------------------------------
+
+During the update, we execute database migrations.
+
+All the database migrations are stored in ``app/DoctrineMigrations``. You can execute each migration individually:
+``bin/console doctrine:migrations:execute 20161001072726 --env=prod``.
+
+You can also cancel each migration individually: ``bin/console doctrine:migrations:execute 20161001072726 --down --env=prod``.
+
+Here is the migrations list for 2.1.x to 2.2.0 release:
+
+* ``20161001072726``: added foreign keys for account resetting
+* ``20161022134138``: converted database to ``utf8mb4`` encoding (for MySQL only)
+* ``20161024212538``: added ``user_id`` column on ``oauth2_clients`` to prevent users to delete API clients from other users
+* ``20161031132655``: added the internal setting to enable/disable downloading pictures
+* ``20161104073720``: added ``created_at`` index on ``entry`` table
+* ``20161106113822``: added ``action_mark_as_read`` field on ``config`` table
+* ``20161117071626``: added the internal setting to share articles to unmark.it
+* ``20161118134328``: added ``http_status`` field on ``entry`` table
+* ``20161122144743``: added the internal setting to enable/disable fetching articles with paywall
+* ``20161122203647``: dropped ``expired`` and ``credentials_expired`` fields on ``user`` table
+* ``20161128084725``: added ``list_mode`` field on ``config`` table
+* ``20161128131503``: dropped ``locked``, ``credentials_expire_at`` and ``expires_at`` fields on ``user`` table
+* ``20161214094403``: added ``uid`` index on ``entry`` table
 
 Upgrade on a shared hosting
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+===========================
 
 Backup your ``app/config/parameters.yml`` file.
 
-Download the 2.1.1 release of wallabag:
+Download the last release of wallabag:
 
 .. code-block:: bash
 
-    wget https://framabag.org/wallabag-release-2.1.1.tar.gz && tar xvf wallabag-release-2.1.1.tar.gz
+    wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
 
-(md5 hash of the 2.1.1 package: ``9584a3b60a2b2a4de87f536548caac93``)
+You will find the `md5 hash of the latest package on our website <https://www.wallabag.org/pages/download-wallabag.html>`_.
 
 Extract the archive in your wallabag folder and replace ``app/config/parameters.yml`` with yours.
 
@@ -48,42 +66,45 @@ If you use SQLite, you must also copy your ``data/`` folder inside the new insta
 
 Empty ``var/cache`` folder.
 
-You must run some SQL queries to upgrade your database. We assume that the table prefix is ``wallabag_`` and the database server is a MySQL one:
+You must run some SQL queries to upgrade your database. We assume that the table prefix is ``wallabag_``. Don't forgete to backup your database before migrating.
 
-.. code-block:: sql
+You may encounter issues with indexes names: if so, please change queries with the correct index name.
 
-    ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL;
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry');
-    ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL;
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import');
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import');
-    ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL;
-    DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key';
+`You can find all the queries here <http://doc.wallabag.org/en/master/user/query-upgrade-21-22.html>`_.
 
-Upgrading from 2.1.x to 2.1.y
------------------------------
+***************************
+Upgrade from 2.0.x to 2.1.1
+***************************
 
-Upgrade on a dedicated web server
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+.. warning::
 
-In order to upgrade your wallabag installation and get the last version, run the following command in you wallabag folder:
+    Before this migration, if you configured the Pocket import by adding your consumer key in Internal settings, please do a backup of it: you'll have to add it into the Config page after the upgrade.
+
+Upgrade on a dedicated web server
+=================================
 
 ::
 
-    make update
+    rm -rf var/cache/*
+    git fetch origin
+    git fetch --tags
+    git checkout 2.1.1 --force
+    SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
+    php bin/console doctrine:migrations:migrate --env=prod
+    php bin/console cache:clear --env=prod
 
 Upgrade on a shared hosting
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+===========================
 
 Backup your ``app/config/parameters.yml`` file.
 
-Download the last release of wallabag:
+Download the 2.1.1 release of wallabag:
 
 .. code-block:: bash
 
-    wget https://wllbg.org/latest-v2-package && tar xvf latest-v2-package
+    wget http://framabag.org/wallabag-release-2.1.1.tar.gz && tar xvf wallabag-release-2.1.1.tar.gz
 
-You will find the `md5 hash of the latest package on our website <https://www.wallabag.org/pages/download-wallabag.html>`_.
+(md5 hash of the 2.1.1 package: ``9584a3b60a2b2a4de87f536548caac93``)
 
 Extract the archive in your wallabag folder and replace ``app/config/parameters.yml`` with yours.
 
@@ -93,8 +114,21 @@ If you use SQLite, you must also copy your ``data/`` folder inside the new insta
 
 Empty ``var/cache`` folder.
 
+You must run some SQL queries to upgrade your database. We assume that the table prefix is ``wallabag_`` and the database server is a MySQL one:
+
+.. code-block:: sql
+
+    ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL;
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry');
+    ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL;
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import');
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import');
+    ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL;
+    DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key';
+
+*****************
 From wallabag 1.x
------------------
+*****************
 
 There is no automatic script to update from wallabag 1.x to wallabag 2.x. You need to:
 
diff --git a/docs/fr/user/query-upgrade-21-22.rst b/docs/fr/user/query-upgrade-21-22.rst
new file mode 100644 (file)
index 0000000..cd201dc
--- /dev/null
@@ -0,0 +1,797 @@
+Migration 20161001072726
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry_tag DROP FOREIGN KEY FK_C9F0DD7CBA364942
+    ALTER TABLE wallabag_entry_tag DROP FOREIGN KEY FK_C9F0DD7CBAD26311
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_tag FOREIGN KEY (tag_id) REFERENCES wallabag_tag (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_annotation DROP FOREIGN KEY FK_A7AED006BA364942
+    ALTER TABLE wallabag_annotation ADD CONSTRAINT FK_annotation_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+
+Migration down
+""""""""""""""
+
+We didn't write down migration for ``20161001072726``.
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry_tag DROP CONSTRAINT fk_c9f0dd7cba364942
+    ALTER TABLE wallabag_entry_tag DROP CONSTRAINT fk_c9f0dd7cbad26311
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_entry_tag ADD CONSTRAINT FK_entry_tag_tag FOREIGN KEY (tag_id) REFERENCES wallabag_tag (id) ON DELETE CASCADE
+    ALTER TABLE wallabag_annotation DROP CONSTRAINT fk_a7aed006ba364942
+    ALTER TABLE wallabag_annotation ADD CONSTRAINT FK_annotation_entry FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE
+
+Migration down
+""""""""""""""
+
+We didn't write down migration for ``20161001072726``.
+
+SQLite
+^^^^^^
+
+This migration can only be executed safely on MySQL or PostgreSQL.
+
+Migration 20161022134138
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER DATABASE wallabag CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE confirmation_token confirmation_token VARCHAR(180) DEFAULT NULL;
+    ALTER TABLE wallabag_user CHANGE salt salt VARCHAR(180) NOT NULL;
+    ALTER TABLE wallabag_user CHANGE password password VARCHAR(180) NOT NULL;
+    ALTER TABLE wallabag_annotation CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_tag CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `text` `text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `quote` `quote` VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `title` `title` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `content` `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_tag CHANGE `label` `label` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE `name` `name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER DATABASE wallabag CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `text` `text` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_annotation CHANGE `quote` `quote` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `title` `title` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_entry CHANGE `content` `content` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_tag CHANGE `label` `label` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+    ALTER TABLE wallabag_user CHANGE `name` `name` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci;
+
+PostgreSQL and SQLite
+^^^^^^^^^^^^^^^^^^^^^
+
+This migration only apply to MySQL.
+
+Migration 20161024212538
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients ADD user_id INT NOT NULL
+    ALTER TABLE wallabag_oauth2_clients ADD CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients DROP FOREIGN KEY IDX_user_oauth_client
+    ALTER TABLE wallabag_oauth2_clients DROP user_id
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients ADD user_id INT DEFAULT NULL
+    ALTER TABLE wallabag_oauth2_clients ADD CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_oauth2_clients DROP CONSTRAINT idx_user_oauth_client
+    ALTER TABLE wallabag_oauth2_clients DROP user_id
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE TEMPORARY TABLE __temp__wallabag_oauth2_clients AS SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM wallabag_oauth2_clients
+    DROP TABLE wallabag_oauth2_clients
+    CREATE TABLE wallabag_oauth2_clients (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, allowed_grant_types CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id), CONSTRAINT IDX_user_oauth_client FOREIGN KEY (user_id) REFERENCES wallabag_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE)
+    INSERT INTO wallabag_oauth2_clients (id, random_id, redirect_uris, secret, allowed_grant_types, name) SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM __temp__wallabag_oauth2_clients
+    DROP TABLE __temp__wallabag_oauth2_clients
+    CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_635D765EA76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_oauth2_clients AS SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM wallabag_oauth2_clients
+    DROP TABLE wallabag_oauth2_clients
+    CREATE TABLE wallabag_oauth2_clients (id INTEGER NOT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, allowed_grant_types CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_oauth2_clients (id, random_id, redirect_uris, secret, allowed_grant_types, name) SELECT id, random_id, redirect_uris, secret, allowed_grant_types, name FROM __temp__wallabag_oauth2_clients
+    DROP TABLE __temp__wallabag_oauth2_clients
+
+Migration 20161031132655
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('download_images_enabled', 0, 'misc')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'download_images_enabled';
+
+Migration 20161104073720
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_created_at ON wallabag_entry
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX idx_entry_created_at
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_created_at
+    DROP INDEX IDX_F4D18282A76ED395
+    DROP INDEX created_at_idx
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+
+Migration 20161106113822
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD action_mark_as_read INT DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP action_mark_as_read
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD action_mark_as_read INT DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP action_mark_as_read
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD COLUMN action_mark_as_read INTEGER DEFAULT 0
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_87E64C53A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_config AS SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM wallabag_config
+    DROP TABLE wallabag_config
+    CREATE TABLE wallabag_config (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, theme VARCHAR(255) NOT NULL COLLATE BINARY, items_per_page INTEGER NOT NULL, language VARCHAR(255) NOT NULL COLLATE BINARY, rss_token VARCHAR(255) DEFAULT NULL COLLATE BINARY, rss_limit INTEGER DEFAULT NULL, reading_speed DOUBLE PRECISION DEFAULT NULL, pocket_consumer_key VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_config (id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key) SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM __temp__wallabag_config
+    DROP TABLE __temp__wallabag_config
+    CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config (user_id)
+
+Migration 20161117071626
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_unmark', 0, 'entry')
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('unmark_url', 'https://unmark.it', 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'share_unmark';
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'unmark_url';
+
+Migration 20161118134328
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry DROP http_status
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry DROP http_status
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_entry ADD COLUMN http_status VARCHAR(3) DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uuid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uuid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+
+Migration 20161122144743
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('restricted_access', 0, 'entry')
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DELETE FROM wallabag_craue_config_setting WHERE name = 'restricted_access';
+
+Migration 20161122203647
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP expired, DROP credentials_expired
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD expired SMALLINT DEFAULT NULL, ADD credentials_expired SMALLINT DEFAULT NULL
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP expired
+    ALTER TABLE wallabag_user DROP credentials_expired
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD expired SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD credentials_expired SMALLINT DEFAULT NULL
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_1D63E7E5C05FB297
+    DROP INDEX UNIQ_1D63E7E5A0D96FBF
+    DROP INDEX UNIQ_1D63E7E592FC23A8
+    CREATE TEMPORARY TABLE __temp__wallabag_user AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted FROM wallabag_user
+    DROP TABLE wallabag_user
+    CREATE TABLE wallabag_user (id INTEGER NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL COLLATE BINARY, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, locked BOOLEAN NOT NULL, expires_at DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL COLLATE BINARY, password_requested_at DATETIME DEFAULT NULL, roles CLOB NOT NULL COLLATE BINARY, credentials_expire_at DATETIME DEFAULT NULL, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, twoFactorAuthentication BOOLEAN NOT NULL, trusted CLOB DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expires_at, confirmation_token, password_requested_at, roles, credentials_expire_at, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted FROM __temp__wallabag_user
+    DROP TABLE __temp__wallabag_user
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD COLUMN expired SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN credentials_expired SMALLINT DEFAULT NULL
+
+Migration 20161128084725
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD list_mode INT DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP list_mode
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD list_mode INT DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config DROP list_mode
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_config ADD COLUMN list_mode INTEGER DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_87E64C53A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_config AS SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM wallabag_config
+    DROP TABLE wallabag_config
+    CREATE TABLE wallabag_config (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, theme VARCHAR(255) NOT NULL COLLATE BINARY, items_per_page INTEGER NOT NULL, language VARCHAR(255) NOT NULL COLLATE BINARY, rss_token VARCHAR(255) DEFAULT NULL COLLATE BINARY, rss_limit INTEGER DEFAULT NULL, reading_speed DOUBLE PRECISION DEFAULT NULL, pocket_consumer_key VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))
+    INSERT INTO wallabag_config (id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key) SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key FROM __temp__wallabag_config
+    DROP TABLE __temp__wallabag_config
+    CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config (user_id)
+
+Migration 20161128131503
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP locked, DROP credentials_expire_at, DROP expires_at
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD locked SMALLINT DEFAULT NULL, ADD credentials_expire_at DATETIME DEFAULT NULL, ADD expires_at DATETIME DEFAULT NULL
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user DROP locked
+    ALTER TABLE wallabag_user DROP credentials_expire_at
+    ALTER TABLE wallabag_user DROP expires_at
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD locked SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD credentials_expire_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL
+    ALTER TABLE wallabag_user ADD expires_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    ALTER TABLE wallabag_user ADD COLUMN locked SMALLINT DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN credentials_expire_at DATETIME DEFAULT NULL
+    ALTER TABLE wallabag_user ADD COLUMN expires_at DATETIME DEFAULT NULL
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX UNIQ_1D63E7E592FC23A8
+    DROP INDEX UNIQ_1D63E7E5A0D96FBF
+    DROP INDEX UNIQ_1D63E7E5C05FB297
+    CREATE TEMPORARY TABLE __temp__wallabag_user AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired FROM wallabag_user
+    DROP TABLE wallabag_user
+    CREATE TABLE wallabag_user (id INTEGER NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL COLLATE BINARY, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL COLLATE BINARY, password_requested_at DATETIME DEFAULT NULL, roles CLOB NOT NULL COLLATE BINARY, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, twoFactorAuthentication BOOLEAN NOT NULL, trusted CLOB DEFAULT NULL COLLATE BINARY, expired SMALLINT DEFAULT NULL, credentials_expired SMALLINT DEFAULT NULL, PRIMARY KEY(id))
+    INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication, trusted, expired, credentials_expired FROM __temp__wallabag_user
+    DROP TABLE __temp__wallabag_user
+    CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical)
+    CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token)
+
+Migration 20161214094403
+------------------------
+
+MySQL
+^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_uid ON wallabag_entry
+
+PostgreSQL
+^^^^^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX idx_entry_uid
+
+SQLite
+^^^^^^
+
+Migration up
+""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_F4D18282A76ED395
+    DROP INDEX created_at_idx
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_entry_uid ON wallabag_entry (uid)
+
+Migration down
+""""""""""""""
+
+.. code-block:: sql
+
+    DROP INDEX IDX_entry_uid
+    DROP INDEX created_at_idx
+    DROP INDEX IDX_F4D18282A76ED395
+    CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM wallabag_entry
+    DROP TABLE wallabag_entry
+    CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uid CLOB DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, is_public BOOLEAN DEFAULT '0', PRIMARY KEY(id))
+    INSERT INTO wallabag_entry (id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public) SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, is_public FROM __temp__wallabag_entry
+    DROP TABLE __temp__wallabag_entry
+    CREATE INDEX created_at_idx ON wallabag_entry (created_at)
+    CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id)
index 9aaa7782b76850cf7248c25eb4898e24552d2124..088b19a00570cbba163d203af75ac6478856d1fb 100644 (file)
@@ -3,41 +3,53 @@ Mettre à jour votre installation de wallabag
 
 Vous trouverez ici différentes manières de mettre à jour wallabag :
 
+- `de la 2.1.x à la 2.2.x <#mettre-a-jour-de-la-2-1-x-a-la-2-2-x>`_
 - `de la 2.0.x à la 2.1.1 <#mettre-a-jour-de-la-2-0-x-a-la-2-1-1>`_
-- `de la 2.1.x à la 2.1.y <#mettre-a-jour-de-la-2-1-x-a-la-2-1-y>`_
 - `de la 1.x à la 2.x <#depuis-wallabag-1-x>`_
 
-Mettre à jour de la 2.0.x à la 2.1.1
+Mettre à jour de la 2.1.x à la 2.2.x
 ------------------------------------
 
-.. warning::
-Avant cette migration, si vous aviez configuré l'import depuis Pocket en ajoutant votre consumer key dans les paramètres internes, pensez à effectuer une sauvegarde de celle-ci : vous devrez l'ajouter dans la configuration de wallabag après la mise à jour.
-
 Mise à jour sur un serveur dédié
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 ::
 
-    rm -rf var/cache/*
-    git fetch origin
-    git fetch --tags
-    git checkout 2.1.1 --force
-    SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
-    php bin/console doctrine:migrations:migrate --env=prod
-    php bin/console cache:clear --env=prod
+    make update
+
+Explications à propos des migrations de base de données
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+Durant la mise à jour, nous exécutons des migrations de base de données.
+
+Toutes les migrations de base de données sont stockées dans le dossier ``app/DoctrineMigrations``. Vous pouvez exécuter chaque migration individuellement :
+``bin/console doctrine:migrations:execute 20161001072726 --env=prod``.
+
+Voici la liste des migrations de la 2.1.x à la 2.2.0 :
+
+* ``20161001072726``: ajout de clés étrangères pour la réinitialisation de compte
+* ``20161022134138``: conversion de la base de données à l'encodage ``utf8mb4`` (pour MySQL uniquement)
+* ``20161024212538``: ajout de la colonne ``user_id`` sur la table ``oauth2_clients`` pour empêcher les utilisateurs de supprimer des clients API d'autres utilisateurs
+* ``20161031132655``: ajout du paramètre interne pour activer/désactiver le téléchargement des images
+* ``20161104073720``: ajout de l'index ``created_at`` sur la table ``entry``
+* ``20161106113822``: ajout du champ ``action_mark_as_read`` sur la table ``config``
+* ``20161117071626``: ajout du paramètre interne pour partager ses articles vers unmark.it
+* ``20161118134328``: ajout du champ ``http_status`` sur la table ``entry``
+* ``20161122144743``: ajout du paramètre interne pour activer/désactiver la récupération d'articles derrière un paywall
+* ``20161122203647``: suppression des champs ``expired`` et ``credentials_expired`` sur la table ``user``
 
 Mise à jour sur un hébergement mutualisé
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Effectuez une sauvegarde du fichier ``app/config/parameters.yml``.
 
-Téléchargez la version 2.1.1 de wallabag :
+Téléchargez la dernière version de wallabag :
 
 .. code-block:: bash
 
-    wget https://framabag.org/wallabag-release-2.1.1.tar.gz && tar xvf wallabag-release-2.1.1.tar.gz
+    wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
 
-(hash md5 de l'archive 2.1.1 : ``9584a3b60a2b2a4de87f536548caac93``)
+Vous trouverez `le hash md5 du dernier package sur notre site <https://www.wallabag.org/pages/download-wallabag.html>`_.
 
 Décompressez l'archive dans votre répertoire d'installation et remplacez le fichier ``app/config/parameters.yml`` avec le votre.
 
@@ -47,42 +59,42 @@ Si vous utilisez SQLite, vous devez également conserver le contenu du répertoi
 
 Videz le répertoire ``var/cache``.
 
-Vous allez devoir également exécuter des requêtes SQL pour mettre à jour votre base de données. Nous partons du principe que le préfixe de vos tables est ``wallabag_`` et que le serveur SQL est un serveur MySQL :
+Vous allez devoir également exécuter des requêtes SQL pour mettre à jour votre base de données. Nous partons du principe que le préfixe de vos tables est ``wallabag_``.
 
-.. code-block:: sql
+`Vous trouverez toutes les requêtes à exécuter ici <http://doc.wallabag.org/fr/master/user/query-upgrade-21-22.html>`_.
 
-    ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL;
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry');
-    ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL;
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import');
-    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import');
-    ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL;
-    DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key';
 
-Mettre à jour de la 2.1.x à la 2.1.y
+Mettre à jour de la 2.0.x à la 2.1.1
 ------------------------------------
 
+.. warning::
+Avant cette migration, si vous aviez configuré l'import depuis Pocket en ajoutant votre consumer key dans les paramètres internes, pensez à effectuer une sauvegarde de celle-ci : vous devrez l'ajouter dans la configuration de wallabag après la mise à jour.
+
 Mise à jour sur un serveur dédié
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Pour mettre à jour votre installation de wallabag et récupérer la dernière version, exécutez la commande suivante dans votre répertoire d'installation : 
-
 ::
 
-    make update
+    rm -rf var/cache/*
+    git fetch origin
+    git fetch --tags
+    git checkout 2.1.1 --force
+    SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
+    php bin/console doctrine:migrations:migrate --env=prod
+    php bin/console cache:clear --env=prod
 
 Mise à jour sur un hébergement mutualisé
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Effectuez une sauvegarde du fichier ``app/config/parameters.yml``.
 
-Téléchargez la dernière version de wallabag :
+Téléchargez la version 2.1.1 de wallabag :
 
 .. code-block:: bash
 
-    wget https://wllbg.org/latest-v2-package && tar xvf latest-v2-package
+    wget http://framabag.org/wallabag-release-2.1.1.tar.gz && tar xvf wallabag-release-2.1.1.tar.gz
 
-Vous trouverez `le hash md5 du dernier package sur notre site <https://www.wallabag.org/pages/download-wallabag.html>`_.
+(hash md5 de l'archive 2.1.1 : ``9584a3b60a2b2a4de87f536548caac93``)
 
 Décompressez l'archive dans votre répertoire d'installation et remplacez le fichier ``app/config/parameters.yml`` avec le votre.
 
@@ -92,6 +104,18 @@ Si vous utilisez SQLite, vous devez également conserver le contenu du répertoi
 
 Videz le répertoire ``var/cache``.
 
+Vous allez devoir également exécuter des requêtes SQL pour mettre à jour votre base de données. Nous partons du principe que le préfixe de vos tables est ``wallabag_`` et que le serveur SQL est un serveur MySQL :
+
+.. code-block:: sql
+
+    ALTER TABLE `wallabag_entry` ADD `uuid` LONGTEXT DEFAULT NULL;
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('share_public', '1', 'entry');
+    ALTER TABLE `wallabag_oauth2_clients` ADD name longtext COLLATE 'utf8_unicode_ci' DEFAULT NULL;
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_redis', '0', 'import');
+    INSERT INTO `wallabag_craue_config_setting` (`name`, `value`, `section`) VALUES ('import_with_rabbitmq', '0', 'import');
+    ALTER TABLE `wallabag_config` ADD `pocket_consumer_key` VARCHAR(255) DEFAULT NULL;
+    DELETE FROM `wallabag_craue_config_setting` WHERE `name` = 'pocket_consumer_key';
+
 Depuis wallabag 1.x
 -------------------
 
index a29e0168f1901364ab106bf5ecdbb14e64219978..e6ed58b7bf482506c9ceb9252fe1f6493851b1c9 100644 (file)
@@ -16,4 +16,5 @@ git fetch --tags
 TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
 git checkout $TAG --force
 SYMFONY_ENV=$ENV $COMPOSER_COMMAND install --no-dev -o --prefer-dist
+php bin/console doctrine:migrations:migrate --no-interaction --env=$ENV
 php bin/console cache:clear --env=$ENV