diff examples/trac/trac/upgrades/db18.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/examples/trac/trac/upgrades/db18.py
@@ -0,0 +1,61 @@
+from trac.db import Table, Column, Index, DatabaseManager
+
+def do_upgrade(env, ver, cursor):
+    cursor.execute("CREATE TEMPORARY TABLE session_old AS SELECT * FROM session")
+    cursor.execute("DROP TABLE session")
+    cursor.execute("CREATE TEMPORARY TABLE ticket_change_old AS SELECT * FROM ticket_change")
+    cursor.execute("DROP TABLE ticket_change")
+
+    # A more normalized session schema where the attributes are stored in
+    # a separate table
+    tables = [Table('session', key=('sid', 'authenticated'))[
+                Column('sid'),
+                Column('authenticated', type='int'),
+                Column('last_visit', type='int'),
+                Index(['last_visit']),
+                Index(['authenticated'])],
+              Table('session_attribute', key=('sid', 'authenticated', 'name'))[
+                Column('sid'),
+                Column('authenticated', type='int'),
+                Column('name'),
+                Column('value')],
+              Table('ticket_change', key=('ticket', 'time', 'field'))[
+                Column('ticket', type='int'),
+                Column('time', type='int'),
+                Column('author'),
+                Column('field'),
+                Column('oldvalue'),
+                Column('newvalue'),
+                Index(['ticket']),
+                Index(['time'])]]
+    
+    db_connector, _ = DatabaseManager(env)._get_connector()
+    for table in tables:
+        for stmt in db_connector.to_sql(table):
+            cursor.execute(stmt)
+
+    # Add an index to the temporary table to speed up the conversion
+    cursor.execute("CREATE INDEX session_old_sid_idx ON session_old(sid)")
+    # Insert the sessions into the new table
+    db = env.get_db_cnx()
+    cursor.execute("INSERT INTO session (sid, last_visit, authenticated) "
+                   "SELECT distinct s.sid,COALESCE(%s,0),s.authenticated "
+                   "FROM session_old AS s LEFT JOIN session_old AS s2 "
+                   "ON (s.sid=s2.sid AND s2.var_name='last_visit') "
+                   "WHERE s.sid IS NOT NULL"
+                   % db.cast('s2.var_value', 'int'))
+    cursor.execute("INSERT INTO session_attribute "
+                   "(sid, authenticated, name, value) "
+                   "SELECT s.sid, s.authenticated, s.var_name, s.var_value "
+                   "FROM session_old s "
+                   "WHERE s.var_name <> 'last_visit' AND s.sid IS NOT NULL")
+
+    # Insert ticket change data into the new table
+    cursor.execute("INSERT INTO ticket_change "
+                   "(ticket, time, author, field, oldvalue, newvalue) "
+                   "SELECT ticket, time, author, field, oldvalue, newvalue "
+                   "FROM ticket_change_old")
+
+    cursor.execute("DROP TABLE session_old")
+    cursor.execute("DROP TABLE ticket_change_old")
+
Copyright (C) 2012-2017 Edgewall Software