diff --git a/kallithea/alembic/versions/a0a1bf09c143_db_add_ui_composite_index_and_drop_.py b/kallithea/alembic/versions/a0a1bf09c143_db_add_ui_composite_index_and_drop_.py new file mode 100644 --- /dev/null +++ b/kallithea/alembic/versions/a0a1bf09c143_db_add_ui_composite_index_and_drop_.py @@ -0,0 +1,41 @@ +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""db: add Ui composite index and drop UniqueConstraint on Ui.ui_key + +Revision ID: a0a1bf09c143 +Revises: d7ec25b66e47 +Create Date: 2020-03-12 22:41:14.421837 + +""" + +# The following opaque hexadecimal identifiers ("revisions") are used +# by Alembic to track this migration script and its relations to others. +revision = 'a0a1bf09c143' +down_revision = 'd7ec25b66e47' +branch_labels = None +depends_on = None + +from alembic import op + + +def upgrade(): + with op.batch_alter_table('ui', schema=None) as batch_op: + batch_op.create_index('ui_ui_section_ui_key_idx', ['ui_section', 'ui_key'], unique=False) + batch_op.drop_constraint('uq_ui_ui_key', type_='unique') + + +def downgrade(): + with op.batch_alter_table('ui', schema=None) as batch_op: + batch_op.create_unique_constraint('uq_ui_ui_key', ['ui_key']) + batch_op.drop_index('ui_ui_section_ui_key_idx') diff --git a/kallithea/lib/utils.py b/kallithea/lib/utils.py --- a/kallithea/lib/utils.py +++ b/kallithea/lib/utils.py @@ -341,7 +341,7 @@ def make_ui(repo_path=None): baseui._tcfg = mercurial.config.config() sa = meta.Session() - for ui_ in sa.query(Ui).all(): + for ui_ in sa.query(Ui).order_by(Ui.ui_section, Ui.ui_key): if ui_.ui_active: log.debug('config from db: [%s] %s=%r', ui_.ui_section, ui_.ui_key, ui_.ui_value) diff --git a/kallithea/model/db.py b/kallithea/model/db.py --- a/kallithea/model/db.py +++ b/kallithea/model/db.py @@ -337,9 +337,7 @@ class Setting(Base, BaseDbModel): class Ui(Base, BaseDbModel): __tablename__ = 'ui' __table_args__ = ( - # FIXME: ui_key as key is wrong and should be removed when the corresponding - # Ui.get_by_key has been replaced by the composite key - UniqueConstraint('ui_key'), + Index('ui_ui_section_ui_key_idx', 'ui_section', 'ui_key'), UniqueConstraint('ui_section', 'ui_key'), _table_args_default_dict, ) @@ -372,6 +370,7 @@ class Ui(Base, BaseDbModel): q = cls.query() q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE])) q = q.filter(cls.ui_section == 'hooks') + q = q.order_by(cls.ui_section, cls.ui_key) return q.all() @classmethod @@ -379,6 +378,7 @@ class Ui(Base, BaseDbModel): q = cls.query() q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE])) q = q.filter(cls.ui_section == 'hooks') + q = q.order_by(cls.ui_section, cls.ui_key) return q.all() @classmethod