From 1e16ed2deab60995f5a49cb5396e9c43b8d24b91 Mon Sep 17 00:00:00 2001 From: Clint Byrum Date: Mon, 19 Aug 2013 15:02:53 -0700 Subject: [PATCH] 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 --- .../023_raw_template_mysql_longtext.py | 35 +++++++++++++++++++ heat/db/sqlalchemy/models.py | 7 ++++ 2 files changed, 42 insertions(+) create mode 100644 heat/db/sqlalchemy/migrate_repo/versions/023_raw_template_mysql_longtext.py 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 000000000..35a8ca9fe --- /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 363919589..e5c5a08bc 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)