diff --git a/master/buildbot/db/changes.py b/master/buildbot/db/changes.py index 32cad8d1893..bc38aa5932e 100644 --- a/master/buildbot/db/changes.py +++ b/master/buildbot/db/changes.py @@ -141,8 +141,6 @@ def thd(conn): for i in inserts: self.checkLength(tbl.c.property_name, i['property_name']) - self.checkLength(tbl.c.property_value, - i['property_value']) conn.execute(tbl.insert(), inserts) if uid: diff --git a/master/buildbot/db/migrate/versions/048_change_properties_to_text.py b/master/buildbot/db/migrate/versions/048_change_properties_to_text.py new file mode 100644 index 00000000000..a9763a469f4 --- /dev/null +++ b/master/buildbot/db/migrate/versions/048_change_properties_to_text.py @@ -0,0 +1,36 @@ +# This file is part of Buildbot. Buildbot 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, version 2. +# +# 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, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright Buildbot Team Members + +from __future__ import absolute_import +from __future__ import print_function +import sqlalchemy as sa +from migrate import changeset + + +def upgrade(migrate_engine): + metadata = sa.MetaData() + metadata.bind = migrate_engine + + if migrate_engine.dialect.name == "postgresql": + # changeset.alter_column has no effect on postgres, so we do this with raw sql + migrate_engine.execute("alter table change_properties alter column property_value type text") + + else: + # Commit messages can get too big for the normal 1024 String limit. + changeset.alter_column( + sa.Column('property_value', sa.Text, nullable=False), + table='change_properties', + metadata=metadata, + engine=migrate_engine) diff --git a/master/buildbot/db/model.py b/master/buildbot/db/model.py index 76c5ed687e7..ca7c1b9637f 100644 --- a/master/buildbot/db/model.py +++ b/master/buildbot/db/model.py @@ -316,7 +316,7 @@ class Model(base.DBConnectorComponent): nullable=False), sa.Column('property_name', sa.String(256), nullable=False), # JSON-encoded tuple of (value, source) - sa.Column('property_value', sa.String(1024), nullable=False), + sa.Column('property_value', sa.Text, nullable=False), ) # users associated with this change; this allows multiple users for diff --git a/master/buildbot/newsfragments/db_schema_change_properties.bugfix b/master/buildbot/newsfragments/db_schema_change_properties.bugfix new file mode 100644 index 00000000000..c3537dbe038 --- /dev/null +++ b/master/buildbot/newsfragments/db_schema_change_properties.bugfix @@ -0,0 +1 @@ +Change properties 'value' changed from String(1024) to Text. Requires upgrade master. (:bug:`3197`) diff --git a/master/buildbot/test/unit/test_db_migrate_versions_048_change_properties_to_text.py b/master/buildbot/test/unit/test_db_migrate_versions_048_change_properties_to_text.py new file mode 100644 index 00000000000..77452b53266 --- /dev/null +++ b/master/buildbot/test/unit/test_db_migrate_versions_048_change_properties_to_text.py @@ -0,0 +1,71 @@ +# This file is part of Buildbot. Buildbot 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, version 2. +# +# 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, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright Buildbot Team Members + +from __future__ import absolute_import +from __future__ import print_function +from random import choice +from string import ascii_lowercase +import sqlalchemy as sa +from twisted.trial import unittest +from buildbot.test.util import migration +from buildbot.util import sautils + + +class Migration(migration.MigrateTestMixin, unittest.TestCase): + + def setUp(self): + return self.setUpMigrateTest() + + def tearDown(self): + return self.tearDownMigrateTest() + + def create_table_thd(self, conn): + metadata = sa.MetaData() + metadata.bind = conn + + change_properties = sautils.Table( + 'change_properties', metadata, + sa.Column('changeid', sa.Integer, nullable=False), + sa.Column('property_name', sa.String(256), nullable=False), + sa.Column('property_value', sa.String(1024), nullable=False), + ) + + change_properties.create() + + def test_update(self): + def setup_thd(conn): + self.create_table_thd(conn) + + def verify_thd(conn): + metadata = sa.MetaData() + metadata.bind = conn + random_length = 65535 + random_string = ''.join(choice(ascii_lowercase) for byte in range(random_length)) + + # Verify column type is text + change_properties = sautils.Table('change_properties', metadata, autoload=True) + self.assertIsInstance(change_properties.c.property_value.type, sa.Text) + + # Test write and read random string + conn.execute(change_properties.insert(), [dict( + changeid=1, + property_name="test_change_properties_property_value_length", + property_value=random_string, + )]) + q = conn.execute(sa.select( + [change_properties.c.property_value]).where(change_properties.c.changeid == 1)) + [self.assertEqual(q_string[0].encode("ascii"), random_string) for q_string in q] + + return self.do_test_migration(47, 48, setup_thd, verify_thd)