sql: don't set highest sql level when creating meta table in migrations (#7034)

This commit is contained in:
Frédéric Péters 2015-04-23 12:20:45 +02:00
parent 6a0c0e2023
commit cbab6a94ed
2 changed files with 21 additions and 10 deletions

View File

@ -705,7 +705,18 @@ def test_sql_level():
conn, cur = sql.get_connection_and_cursor()
cur.execute('DROP TABLE wcs_meta')
assert sql.get_sql_level(conn, cur) == 0
sql.migrate()
assert sql.get_sql_level(conn, cur) == sql.SQL_LEVEL
# insert negative SQL level, to trigger an error, and check it's not
# changed.
cur.execute('''UPDATE wcs_meta SET value = %s WHERE key = %s''',
(str(-1), 'sql_level'))
assert sql.get_sql_level(conn, cur) == -1
with pytest.raises(RuntimeError):
sql.migrate()
assert sql.get_sql_level(conn, cur) == -1
conn.commit()
cur.close()

View File

@ -449,30 +449,29 @@ def do_tracking_code_table():
cur.close()
@guard_postgres
def do_meta_table(conn=None, cur=None):
def do_meta_table(conn=None, cur=None, insert_current_sql_level=True):
own_conn = False
if not conn:
own_conn = True
conn, cur = get_connection_and_cursor()
created = False
cur.execute('''SELECT COUNT(*) FROM information_schema.tables
WHERE table_name = %s''', ('wcs_meta',))
if cur.fetchone()[0] == 0:
cur.execute('''CREATE TABLE wcs_meta (id serial PRIMARY KEY,
key varchar,
value varchar)''')
if insert_current_sql_level:
sql_level = SQL_LEVEL
else:
sql_level = 0
cur.execute('''INSERT INTO wcs_meta (id, key, value)
VALUES (DEFAULT, %s, %s)''', ('sql_level', str(SQL_LEVEL)))
created = True
VALUES (DEFAULT, %s, %s)''', ('sql_level', str(sql_level)))
if own_conn:
conn.commit()
cur.close()
return created
@guard_postgres
def redo_views(conn, cur, formdef, rebuild_global_views=False):
if get_publisher().get_site_option('postgresql_views') == 'false':
@ -1570,9 +1569,7 @@ def migrate_global_views(conn, cur):
@guard_postgres
def get_sql_level(conn, cur):
if do_meta_table(conn, cur):
# table has just been created, return sql_level as 0
return 0
do_meta_table(conn, cur, insert_current_sql_level=False)
cur.execute('''SELECT value FROM wcs_meta WHERE key = %s''', ('sql_level', ))
sql_level = int(cur.fetchone()[0])
return sql_level
@ -1581,6 +1578,9 @@ def get_sql_level(conn, cur):
def migrate():
conn, cur = get_connection_and_cursor()
sql_level = get_sql_level(conn, cur)
if sql_level < 0:
# fake code to help in tetsting the error code path.
raise RuntimeError()
if sql_level < 1: # 1: introduction of tracking_code table
do_tracking_code_table()
if sql_level < 2: # 2: introduction of formdef_id in views