]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Use LONGTEXT for templates in MySQL
authorClint Byrum <clint@fewbar.com>
Mon, 19 Aug 2013 22:02:53 +0000 (15:02 -0700)
committerClint Byrum <clint@fewbar.com>
Tue, 20 Aug 2013 03:13:17 +0000 (20:13 -0700)
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

heat/db/sqlalchemy/migrate_repo/versions/023_raw_template_mysql_longtext.py [new file with mode: 0644]
heat/db/sqlalchemy/models.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 (file)
index 0000000..35a8ca9
--- /dev/null
@@ -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())
index 3639195890a189727ec79611c8d6bf2794d24816..e5c5a08bca7e1dae58b1adee91fcf0fe501c5c9c 100644 (file)
@@ -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)