From b5ff8581f31d9088ebc6aaab853bf5f7e769c377 Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Thu, 6 Jan 2022 20:27:23 -0800 Subject: [PATCH] feat(migrations): add upgrade_voteinfo_integers ref This migration modifies the Yes, No, Abstain and ActiveTUs columns of the TUVoteInfo table from unsigned TINYINT to unsigned INTEGER. TINYINT supports a total of 1 byte (up to 255 trusted users). This is quite limited and we don't spend too much more by storing a standard 4-byte INTEGER. Signed-off-by: Kevin Morris --- aurweb/schema.py | 8 +-- .../be7adae47ac3_upgrade_voteinfo_integers.py | 49 +++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 migrations/versions/be7adae47ac3_upgrade_voteinfo_integers.py diff --git a/aurweb/schema.py b/aurweb/schema.py index 43db920d..39550ff6 100644 --- a/aurweb/schema.py +++ b/aurweb/schema.py @@ -391,10 +391,10 @@ TU_VoteInfo = Table( if db_backend == "mysql" else String(5), nullable=False), Column('SubmitterID', ForeignKey('Users.ID', ondelete='CASCADE'), nullable=False), - Column('Yes', TINYINT(3, unsigned=True), nullable=False, server_default=text("'0'")), - Column('No', TINYINT(3, unsigned=True), nullable=False, server_default=text("'0'")), - Column('Abstain', TINYINT(3, unsigned=True), nullable=False, server_default=text("'0'")), - Column('ActiveTUs', TINYINT(3, unsigned=True), nullable=False, server_default=text("'0'")), + Column('Yes', INTEGER(unsigned=True), nullable=False, server_default=text("'0'")), + Column('No', INTEGER(unsigned=True), nullable=False, server_default=text("'0'")), + Column('Abstain', INTEGER(unsigned=True), nullable=False, server_default=text("'0'")), + Column('ActiveTUs', INTEGER(unsigned=True), nullable=False, server_default=text("'0'")), mysql_engine='InnoDB', mysql_charset='utf8mb4', mysql_collate='utf8mb4_general_ci', diff --git a/migrations/versions/be7adae47ac3_upgrade_voteinfo_integers.py b/migrations/versions/be7adae47ac3_upgrade_voteinfo_integers.py new file mode 100644 index 00000000..d910a14b --- /dev/null +++ b/migrations/versions/be7adae47ac3_upgrade_voteinfo_integers.py @@ -0,0 +1,49 @@ +""" +upgrade voteinfo integers + +Within `aurweb/schema.py`, these were previously forced to use +TINYINT(3, unsigned=True) types. When generating with dummy data, +it is very easy to bypass 3-character TU counts; in addition, +this is possible in the future on production, and so we should +deal with this case regardless. + +All previous TINYINT(3, unsigned=True) typed columns are upgraded +INTEGER(unsigned=True) types, supporting up to 4-bytes of active TUs +and votes for one particular proposal. + +Revision ID: be7adae47ac3 +Revises: 56e2ce8e2ffa +Create Date: 2022-01-06 14:37:07.899778 +""" +from alembic import op +from sqlalchemy.dialects.mysql import INTEGER, TINYINT + +# revision identifiers, used by Alembic. +revision = 'be7adae47ac3' +down_revision = '56e2ce8e2ffa' +branch_labels = None +depends_on = None + +# Upgrade to INTEGER(unsigned=True); supports 4-byte values. +UPGRADE_T = INTEGER(unsigned=True) + +# Downgrade to TINYINT(3, unsigned=True); supports 1-byte values. +DOWNGRADE_T = TINYINT(3, unsigned=True) + + +def upgrade(): + """ Upgrade 'Yes', 'No', 'Abstain' and 'ActiveTUs' to unsigned INTEGER. """ + op.alter_column("TU_VoteInfo", "Yes", type_=UPGRADE_T) + op.alter_column("TU_VoteInfo", "No", type_=UPGRADE_T) + op.alter_column("TU_VoteInfo", "Abstain", type_=UPGRADE_T) + op.alter_column("TU_VoteInfo", "ActiveTUs", type_=UPGRADE_T) + + +def downgrade(): + """ + Downgrade 'Yes', 'No', 'Abstain' and 'ActiveTUs' to unsigned TINYINT. + """ + op.alter_column("TU_VoteInfo", "ActiveTUs", type_=DOWNGRADE_T) + op.alter_column("TU_VoteInfo", "Abstain", type_=DOWNGRADE_T) + op.alter_column("TU_VoteInfo", "No", type_=DOWNGRADE_T) + op.alter_column("TU_VoteInfo", "Yes", type_=DOWNGRADE_T)