00001
00002
00003 """
00004 usage: %(progname)s [args]
00005 """
00006
00007
00008 import os, sys, string, time, getopt
00009 from log import *
00010
00011 import odb
00012
00013 import sqlite
00014
00015
00016 class Cursor(odb.Cursor):
00017 def insert_id(self, tablename, colname):
00018 return self.cursor.lastrowid
00019
00020 def execute(self, sql):
00021
00022
00023 return self.cursor.execute(sql)
00024
00025 class Connection(odb.Connection):
00026 def __init__(self, *args, **kwargs):
00027 odb.Connection.__init__(self)
00028
00029 self._conn = apply(sqlite.connect, args, kwargs)
00030
00031 self.SQLError = sqlite.Error
00032
00033 def getConnType(self): return "sqlite"
00034
00035 def cursor(self):
00036 return Cursor(self._conn.cursor())
00037
00038 def escape(self,str):
00039 if str is None:
00040 return None
00041 elif type(str) == type(""):
00042 return string.replace(str,"'","''")
00043 elif type(str) == type(1):
00044 return str
00045 else:
00046 raise "unknown column data type: %s" % type(str)
00047
00048
00049 def listTables(self, cursor):
00050 cursor.execute("select name from sqlite_master where type='table'")
00051 rows = cursor.fetchall()
00052 tables = []
00053 for row in rows: tables.append(row[0])
00054 return tables
00055
00056 def supportsTriggers(self): return True
00057
00058 def listTriggers(self, cursor):
00059 cursor.execute("select name from sqlite_master where type='trigger'")
00060 rows = cursor.fetchall()
00061 tables = []
00062 for row in rows: tables.append(row[0])
00063 return tables
00064
00065 def listIndices(self, tableName, cursor):
00066 cursor.execute("select name from sqlite_master where type='index'")
00067 rows = cursor.fetchall()
00068 tables = []
00069 for row in rows: tables.append(row[0])
00070 return tables
00071
00072 def listFieldsDict(self, table_name, cursor):
00073 sql = "pragma table_info(%s)" % table_name
00074 cursor.execute(sql)
00075 rows = cursor.fetchall()
00076
00077 columns = {}
00078 for row in rows:
00079 colname = row[1]
00080 columns[colname] = row
00081 return columns
00082
00083 def _tableCreateStatement(self, table_name, cursor):
00084 sql = "select sql from sqlite_master where type='table' and name='%s'" % table_name
00085 print sql
00086 cursor.execute(sql)
00087 row = cursor.fetchone()
00088 sqlstatement = row[0]
00089 return sqlstatement
00090
00091
00092 def alterTableToMatch(self, table, cursor):
00093 tableName = table.getTableName()
00094 tmpTableName = tableName + "_" + str(os.getpid())
00095
00096 invalidAppCols, invalidDBCols = table.checkTable(warnflag=0)
00097
00098
00099
00100
00101
00102
00103 if not invalidAppCols and not invalidDBCols:
00104 return
00105
00106
00107 oldcols = self.listFieldsDict(tableName, cursor)
00108
00109
00110 tmpcols = []
00111 newcols = table.getAppColumnList()
00112 for colname, coltype, options in newcols:
00113 if oldcols.has_key(colname): tmpcols.append(colname)
00114
00115 tmpcolnames = string.join(tmpcols, ",")
00116
00117 statements = []
00118
00119
00120
00121
00122 sql = "create temporary table %s (%s)" % (tmpTableName, tmpcolnames)
00123 statements.append(sql)
00124
00125 sql = "insert into %s select %s from %s" % (tmpTableName, tmpcolnames, tableName)
00126 statements.append(sql)
00127
00128 sql = "drop table %s" % tableName
00129 statements.append(sql)
00130
00131 sql = table._createTableSQL()
00132 statements.append(sql)
00133
00134 sql = "insert into %s(%s) select %s from %s" % (tableName, tmpcolnames, tmpcolnames, tmpTableName)
00135 statements.append(sql)
00136
00137 sql = "drop table %s" % tmpTableName
00138 statements.append(sql)
00139
00140
00141
00142
00143 for statement in statements:
00144 print statement
00145 cursor.execute(statement)
00146
00147
00148 def test():
00149 pass
00150
00151 def usage(progname):
00152 print __doc__ % vars()
00153
00154 def main(argv, stdout, environ):
00155 progname = argv[0]
00156 optlist, args = getopt.getopt(argv[1:], "", ["help", "test", "debug"])
00157
00158 testflag = 0
00159 if len(args) == 0:
00160 usage(progname)
00161 return
00162 for (field, val) in optlist:
00163 if field == "--help":
00164 usage(progname)
00165 return
00166 elif field == "--debug":
00167 debugfull()
00168 elif field == "--test":
00169 testflag = 1
00170
00171 if testflag:
00172 test()
00173 return
00174
00175
00176 if __name__ == "__main__":
00177 main(sys.argv, sys.stdout, os.environ)