Changeset 129

Show
Ignore:
Timestamp:
Thu Jul 13 21:51:38 2006
Author:
Brian
Message:

Adjusting foreign keys.

Files:

Legend:

Unmodified
Added
Removed
Modified
  • server/trunk/update/client/Commit Changes to Server.py

    r93 r129  
    28 28 #          need of special handling for ReportRow foreign keys (not solved yet)  
    29 29 # 060407 - More debuging changes  
      30 # 060708 - Some fixes to foreign key corrections  
    30 31  
    31 32 debug = 1  
     
    53 54  
    54 55     parms = {   # data to make sure were are talking to the right server  
    55           'ScriptVersion': '2006-03-26',  
      56         'ScriptVersion': '2006-07-08',  
    55 56         'FileSignature': Data.Other.get('FileSignature'),  
    56 57         'Key': Data.Other.get('ServerKey'),   # should be saved like file signature  
     
    69 70      
    70 71     # this should be returned by a function in Data  
    71       # this should use tupples as keys  
      72     # using 'table/column': table (same format as 'ForeignKey' table)  
    71 72     # table and id in report rows needs special treatment <- IMPORTANT - To Do  
    72 73     foreign_key_xref = {  
    73           'PrerequisiteID': 'Task',  
    74           'PriorMeasurementID': 'Measurement',  
    75           'FirstRow': 'ReportRow',  
    76           'NextRow': 'ReportRow',  
    77           'FirstColumn': 'ReportColumn',  
    78           'NextColumn': 'ReportColumn',  
    79           'Also': 'ReportType',  
      74         'Dependency/PrerequisiteID': 'Task',  
      75         'MeasurementDependency/PriorMeasurementID': 'Measurement',  
      76         'ResourceGrouping/ResourceGroupID': 'Resource',  
      77         'Report/FirstRow': 'ReportRow',  
      78         'ReportRow/NextRow': 'ReportRow',  
      79         'Report/FirstColumn': 'ReportColumn',  
      80         'ReportColumn/NextColumn': 'ReportColumn',  
      81         'ReportType/Also': 'ReportType',  
    80 82         }  
    81       # these foreign keys should be specified as (table, column): table  
    82 83  
    83 84     # server_prior_nextid = {} # set in AdjustIDs, used in FindChanges  
     
    113 114  
    114 115         # ask server to reserve rows and return all new changes  
      116         # ask server for all changes since the last update we received  
    115 117         if debug: print parms, lastChange, rows_needed  
    116 118         changes, version, new_server_nextid = server.get_updates_since(parms, lastChange, rows_needed)  
    117 119         if debug: print changes, version, new_server_nextid  
    118    
    119 120         # new_server_nextid is a dict with this format:  
    120 121         #   { tablename: (row_after_last_reserved) }  
    121 122         # this will be used to set the new server '_' next ids  
    122 123  
    123           # maybe server should return all of its next ids   -- it does now  
    124           # if it does, we could add new tables              -- we do, see below  
    125    
    126           # renumber our new rows, if necessary (do we test this?)  
    127           # set server version keys to '_'?  
    128           # or keep track of new rows for use FindChanges (BETTER?)  
    129    
    130           # how to handle report rows <-- IMPORTANT - To Do  
    131           key_adjustment = {}  
      124         # renumber our new rows, if necessary (do we test this? -- not yet)  
      125         # set server version keys to '_'?  -- probably not  
      126         # or keep track of new rows for use FindChanges (BETTER?) -- probably not  
      127         key_adjustment = {} # how much to add to locally assigned IDs  
    132 128         for tname, v in new_nextID.iteritems():  
    133 129             key_adjustment[tname] = new_server_nextid.get(tname, 1) - v  
    134 130  
    135           for tname in new_nextID:  
      131         for tname in new_nextID:  # list of all non-alias table names  
    135 131             newkeys = {}  
    136 132             # all IDs in table will be adjusted by the same amount  
     
    140 136  
    141 137             t = Data.Database.get(tname, {})  
    142               for rid, row in t.iteritems():  
    143                   for cname, value in row.iteritems():  
      138             for rid, row in t.iteritems():  # process each row in table  
      139                 for cname, value in row.iteritems():  # look for foreign key columns  
    144 140                     if not cname: continue  
    145 141                     if not isinstance(value, int): continue  # does his work for really big numbers?  
     
    149 145                     else:  
    150 146                         # is this a foreign key column?  
    151                           if cname in foreign_key_xref:  
    152                               table = foreign_key_xref[cname]  
      147                         tc = '/'.join(tname, cname)  
      148                         if tc in foreign_key_xref:  
      149                             table = foreign_key_xref[tc]  
    153 150                         elif cname[-2:] == 'ID' and cname[:1] != '_':  
    154 151                             if cname == 'TableID' and tname == 'ReportRow': # report rows are special case  
     
    310 307     # these problems  
    311 308     #  
    312       # Table and ID in report rows needs special treatment  <- IMPORTANT - To Do  
      309     # Table and ID in report rows needs special treatment  <- IMPORTANT - To Do -- ?let update handle??  
    312 309  
    313 310     def FixDataProblems():  
     
    345 342         DupPair('Assignment', 'TaskID', 'ResourceID')  
    346 343         DupPair('Dependency', 'TaskID', 'PrerequisiteID')  
      344         DupPair('ResourceGrouping', 'ResourceID', 'ResourceGroupID')  
    347 345         DupPair('ColumnType', 'ReportTypeID', 'Name') # prevent duplicate column names in reporttype  
    348 346                  
     
    371 369                     if not cname or cname == 'ID': continue  
    372 370                     # is this a foreign key column?  
    373                       if cname in foreign_key_xref:  
    374                           table = foreign_key_xref[cname]  
      371                     tc = '/'.join(tname, cname)  
      372                     if tc in foreign_key_xref:  
      373                         table = foreign_key_xref[tc]  
    375 374                     elif cname[-2:] == 'ID' and cname[:1] != '_':  
    376                           table = cname[:-2]  
      375                         if cname == 'TableID' and tname == 'ReportRow': # report rows are special case  
      376                             table = row.get('TableName')  
      377                             if not value or not table: continue # skip invalid combinations  
      378                         else:  
      379                             table = cname[:-2]  
    377 380                     else:  # not a foreign key  
    378 381                         continue  
    379 382                     newid = changeids.get((table, value))  # need double prens?  
    380                       if newid:  # points to a dup row  
      383                     if newid:  # pointed to a dup row  
    380 383                         change[cname] = newid  
    381 384                 if change:  
  • server/trunk/update/client/Add Database to Server.py

    r93 r129  
    59 59         for tid, t in tables:  
    60 60             if tid[0] == "_": continue  # skip internal tables, if any  
      61             if tid == 'Next': continue  # server can't handle because it doesn't containt 'ID'  
    61 62              
    62 63             alias = None  # identify aliases (thanks for the code Alex!)  
  • server/trunk/update/client/Download Database from Server.py

    r91 r129  
    28 28     debug = 1  
    29 29  
    30       server_address = Data.Other.get('ServerAddress') or "http://192.168.0.6:8001"  
      30     server_address = Data.Other.get('ServerAddress') or "http://192.168.0.5:8001"  
    30 30     server_key = Data.Other.get('ServerKey') or "a6d1"  
    31 31     if server_key != "a6d1":  # only set by this script?  
     
    71 71  
    72 72     normal, aliases, exceptions = result  
      73  
    73 74     database = {}  
    74 75      
     
    78 79             for key in row.keys(): # get rid of "_" fields???  
    79 80                 if key[0] == "_": del row[key]  
      81             if debug: print k, row  
    80 82             t[row["ID"]] = row  
    81 83         database[k] = t