Changeset 4426

Show
Ignore:
Timestamp:
04/04/09 15:33:31 (4 years ago)
Author:
gpolo
Message:

Full column merging is supported now.

Location:
branch/merger
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • branch/merger/sqlitedb.py

    r4425 r4426  
    2424# XXX Missing: 
    2525#   Index merging (read copying) 
    26 #   Proper foreign key merging 
     26 
    2727VALID_NAME_PATTERN = ( 
    2828        """ 
     
    135135        self._fromcursor = None 
    136136        self._tocursor = None 
    137         self._reference = None # updated when merging tables 
    138137 
    139138        self._merge() 
     
    219218                    "not happen.") 
    220219            return 
    221  
    222         res = new_cursor.execute("pragma foreign_key_list(%s)" % tablename) 
    223         self._reference = {} 
    224         for ref in res.fetchall(): 
    225             self._reference[ref['from']] = (ref['table'], ref['to']) 
    226220 
    227221        res = old_cursor.execute("pragma table_info(%s)" % tablename) 
     
    252246        if new_by_col: 
    253247            print "Adding new columns in table '%s'" % tablename 
     248        # Get the full column definitions for this table 
     249        res = self._fromcursor.execute( 
     250                "SELECT sql FROM sqlite_master " 
     251                "WHERE type='table' and name=?", (tablename, )).fetchone() 
     252        coldef = column_definitions(res['sql']) 
    254253        for cname, cinfo in new_by_col.iteritems(): 
    255254            if cinfo['pk']: 
     
    265264                continue 
    266265 
    267             self._merge_column(tablename, cname, cinfo) 
     266            self._merge_column(tablename, cname, coldef[cname]) 
    268267 
    269268 
    270269    def _merge_column(self, tablename, cname, cinfo): 
    271         reference = self._reference or {} 
    272  
    273         cursor = self._tocursor 
    274         query = "ALTER TABLE %s ADD COLUMN %s %s" % ( 
    275                 tablename, cname, cinfo['type']) 
    276  
    277         if cinfo['notnull']: 
    278             query += " NOT NULL" 
    279         if cinfo['dflt_value']: 
    280             query += " DEFAULT %s" % cinfo['dflt_value'] 
    281         if cname in reference: 
    282             query += " REFERENCES %s(%s)" % reference[cname] 
    283  
    284         cursor.execute(query) 
     270        query = "ALTER TABLE %s ADD COLUMN %s %s" % (tablename, cname, cinfo) 
     271        self._tocursor.execute(query) 
    285272 
    286273 
  • branch/merger/tests/test_sqlitemerge.py

    r4425 r4426  
    106106                "b INTEGER") 
    107107 
    108         # XXX not fully supported yet 
    109108        self._verify_merge( 
    110109                "a INTEGER, b INTEGER CONSTRAINT fk REFERENCES d(id)",