diff -r 7183f32fad13 -r e77cea9721e7 hooks/syncschema.py --- a/hooks/syncschema.py Fri Jun 18 18:31:22 2010 +0200 +++ b/hooks/syncschema.py Mon Jun 21 13:23:11 2010 +0200 @@ -21,8 +21,8 @@ - perform physical update on the source when necessary checking for schema consistency is done in hooks.py +""" -""" __docformat__ = "restructuredtext en" from copy import copy @@ -84,7 +84,7 @@ table = SQL_PREFIX + etype column = SQL_PREFIX + rtype try: - session.system_sql(str('ALTER TABLE %s ADD COLUMN %s integer' + session.system_sql(str('ALTER TABLE %s ADD %s integer' % (table, column)), rollback_on_failure=False) session.info('added column %s to table %s', column, table) except: @@ -145,15 +145,17 @@ table = column = None # make pylint happy def precommit_event(self): session, table, column = self.session, self.table, self.column + source = session.repo.system_source # drop index if any - session.pool.source('system').drop_index(session, table, column) - try: + source.drop_index(session, table, column) + if source.dbhelper.alter_column_support: session.system_sql('ALTER TABLE %s DROP COLUMN %s' % (table, column), rollback_on_failure=False) self.info('dropped column %s from table %s', column, table) - except Exception, ex: + else: # not supported by sqlite for instance - self.error('error while altering table %s: %s', table, ex) + self.error('dropping column not supported by the backend, handle ' + 'it yourself (%s.%s)', table, column) # base operations for in-memory schema synchronization ######################## @@ -284,9 +286,10 @@ sqlexec('INSERT INTO %s_relation SELECT %s, %s FROM %s WHERE NOT %s IS NULL' % (rtype, eidcolumn, column, table, column)) # drop existant columns + #if session.repo.system_source.dbhelper.alter_column_support: for etype in rschema.subjects(): DropColumn(session, table=SQL_PREFIX + str(etype), - column=SQL_PREFIX + rtype) + column=SQL_PREFIX + rtype) else: for etype in rschema.subjects(): try: @@ -377,7 +380,7 @@ table = SQL_PREFIX + rdef.subject column = SQL_PREFIX + rdef.name try: - session.system_sql(str('ALTER TABLE %s ADD COLUMN %s %s' + session.system_sql(str('ALTER TABLE %s ADD %s %s' % (table, column, attrtype)), rollback_on_failure=False) self.info('added column %s to table %s', table, column) @@ -552,8 +555,8 @@ sql = adbh.sql_change_col_type(table, column, coltype, card != '1') try: session.system_sql(sql, rollback_on_failure=False) - self.info('altered column %s of table %s: now VARCHAR(%s)', - column, table, newcstr.max) + self.info('altered column %s of table %s: now %s', + column, table, coltype) except Exception, ex: # not supported by sqlite for instance self.error('error while altering table %s: %s', table, ex) @@ -568,16 +571,19 @@ def precommit_event(self): cstrtype = self.cstr.type() - table = SQL_PREFIX + str(self.subjtype) - column = SQL_PREFIX + str(self.rtype) + table = SQL_PREFIX + str(self.rdef.subject) + column = SQL_PREFIX + str(self.rdef.rtype) # alter the physical schema on size/unique constraint changes if cstrtype == 'SizeConstraint': try: - self.session.system_sql('ALTER TABLE %s ALTER COLUMN %s TYPE TEXT' - % (table, column), - rollback_on_failure=False) - self.info('altered column %s of table %s: now TEXT', - column, table) + adbh = self.session.pool.source('system').dbhelper + coltype = y2sql.type_from_constraints(adbh, rdef.object, [], + creating=False) + sql = adbh.sql_change_col_type(table, column, coltype, + rdef.cardinality != '1') + self.session.system_sql(sql, rollback_on_failure=False) + self.info('altered column %s of table %s: now %s', + column, table, coltype) except Exception, ex: # not supported by sqlite for instance self.error('error while altering table %s: %s', table, ex) @@ -1112,8 +1118,7 @@ except IndexError: self._cw.critical('constraint type no more accessible') else: - SourceDbCWConstraintDel(self._cw, cstr=cstr, - subjtype=rdef.subject, rtype=rdef.rtype) + SourceDbCWConstraintDel(self._cw, rdef=rdef, cstr=cstr) MemSchemaCWConstraintDel(self._cw, rdef=rdef, cstr=cstr)