From: Clint Byrum Date: Mon, 19 Aug 2013 22:02:53 +0000 (-0700) Subject: Use LONGTEXT for templates in MySQL X-Git-Tag: 2014.1~189 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=1e16ed2deab60995f5a49cb5396e9c43b8d24b91;p=openstack-build%2Fheat-build.git Use LONGTEXT for templates in MySQL TEXT in PostgreSQL is an unlimited column size. However, in MySQL, it is limited to 2^16 bytes. LONGTEXT allows 2^32 bytes, which is overkill, but will prevent MySQL from silently truncating this column and thus rendering the entire tenant's API access moot. Fixes bug #1210799 Change-Id: Ib2b379db32a8296cf8c5a2434e7615afc59288e3 --- diff --git a/heat/db/sqlalchemy/migrate_repo/versions/023_raw_template_mysql_longtext.py b/heat/db/sqlalchemy/migrate_repo/versions/023_raw_template_mysql_longtext.py new file mode 100644 index 00000000..35a8ca9f --- /dev/null +++ b/heat/db/sqlalchemy/migrate_repo/versions/023_raw_template_mysql_longtext.py @@ -0,0 +1,35 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import sqlalchemy +from sqlalchemy.dialects import mysql +from sqlalchemy import types as sqltypes + + +def upgrade(migrate_engine): + if migrate_engine.name != 'mysql': + return + + meta = sqlalchemy.MetaData(bind=migrate_engine) + raw_template = sqlalchemy.Table('raw_template', meta, autoload=True) + raw_template.c.template.alter(type=mysql.LONGTEXT()) + + +def downgrade(migrate_engine): + if migrate_engine.name != 'mysql': + return + + meta = sqlalchemy.MetaData(bind=migrate_engine) + raw_template = sqlalchemy.Table('raw_template', meta, autoload=True) + raw_template.c.template.alter(type=sqltypes.TEXT()) diff --git a/heat/db/sqlalchemy/models.py b/heat/db/sqlalchemy/models.py index 36391958..e5c5a08b 100644 --- a/heat/db/sqlalchemy/models.py +++ b/heat/db/sqlalchemy/models.py @@ -17,6 +17,7 @@ SQLAlchemy models for heat data. import sqlalchemy +from sqlalchemy.dialects import mysql from sqlalchemy.orm import relationship, backref, object_mapper from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.declarative import declarative_base @@ -35,6 +36,12 @@ BASE = declarative_base() class Json(types.TypeDecorator): impl = types.Text + def load_dialect_impl(self, dialect): + if dialect.name == 'mysql': + return dialect.type_descriptor(mysql.LONGTEXT()) + else: + return self.impl + def process_bind_param(self, value, dialect): return dumps(value)