- Timestamp:
- Mar 30, 2012, 2:49:37 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20111122/ippToPsps/jython/scratchdb.py
r32590 r33638 19 19 Constructor 20 20 ''' 21 def __init__(self, logger, doc, useFull=0): 22 super(ScratchDb, self).__init__(logger, doc, "localdatabase") 21 def __init__(self, logger, config, dbName=None): 22 super(ScratchDb, self).__init__(logger, config, "localdatabase", dbName) 23 24 self.dvoDoneTable = "dvoDone" 25 self.dvoSkyTable = "dvoSkyTable" 26 27 28 ''' 29 Destructor 30 ''' 31 def __del__(self): 32 33 self.logger.debug("ScratchDb destructor") 34 35 36 ''' 37 Sets whether we are using normal or pre-ingested DVO tables 38 ''' 39 def setUseFullTables(self, useFull): 23 40 24 41 if useFull: 25 self.dvo MetaTable = "dvoMetaFull"42 self.dvoImagesTable = "dvoImagesFull" 26 43 self.dvoDetectionTable = "dvoDetectionFull" 27 self.dvoDoneTable = "dvoDone"28 44 else: 29 self.dvo MetaTable = "dvoMeta"45 self.dvoImagesTable = "dvoImages" 30 46 self.dvoDetectionTable = "dvoDetection" 31 47 32 self.logger.debugPair("Using DVO meta table", self.dvoMetaTable)48 self.logger.debugPair("Using DVO images table", self.dvoImagesTable) 33 49 self.logger.debugPair("Using DVO detection table", self.dvoDetectionTable) 34 35 '''36 Destructor37 '''38 def __del__(self):39 40 self.logger.debug("ScratchDb destructor")41 50 42 51 ''' … … 112 121 Gets imageID from extern ID 113 122 ''' 114 def getImageIDFromExternID(self, sourceID,externID):123 def getImageIDFromExternID(self, externID): 115 124 116 125 imageID = -1 117 126 118 sql = "SELECT imageID FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID,externID)127 sql = "SELECT IMAGE_ID FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID) 119 128 try: 120 129 rs = self.executeQuery(sql) … … 129 138 Gets DVO image flags 130 139 ''' 131 def getDvoImageFlags(self, sourceID,externID):140 def getDvoImageFlags(self, externID): 132 141 133 142 flags = 0 134 143 135 sql = "SELECT flags FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID,externID)144 sql = "SELECT FLAGS FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID) 136 145 try: 137 146 rs = self.executeQuery(sql) … … 145 154 Gets photcode (aka photoCalID from dvo table) 146 155 ''' 147 def getPhotoCalID(self, sourceID,externID):156 def getPhotoCalID(self, externID): 148 157 149 158 photcode = -1 150 159 151 sql = "SELECT photcode FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID,externID)160 sql = "SELECT PHOTCODE FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID) 152 161 try: 153 162 rs = self.executeQuery(sql) … … 168 177 169 178 ''' 170 Inserts a new sourceID/imageID combo into dvo Meta179 Inserts a new sourceID/imageID combo into dvoImages 171 180 ''' 172 181 def insertNewDvoExternID(self, sourceID, externID): 173 182 174 sql = "INSERT INTO dvoMeta( \175 sourceID, \176 externID \183 sql = "INSERT INTO " + self.dvoImagesTable + " ( \ 184 SOURCE_ID, \ 185 EXTERN_ID \ 177 186 ) VALUES (\ 178 187 " + str(sourceID) + ", \ … … 182 191 183 192 ''' 193 Do we have an out-of-date version of this file? 194 ''' 195 def haveOutOfDateVersionOfThisDvoTable(self, path): 196 197 fileStat = os.stat(path) 198 199 sql = "SELECT COUNT(*) FROM " + self.dvoDoneTable + " WHERE path = '" + path + "' AND modifiedDate != " + str(fileStat.st_mtime) 200 201 try: 202 rs = self.executeQuery(sql) 203 rs.first() 204 if rs.getInt(1) > 0: 205 self.logger.debugPair("Have out-to-date version of", path) 206 return True 207 else: 208 return False 209 except: 210 self.logger.exception("Unable to check whether this DVO table is out-of-date") 211 212 ''' 213 Have we already imported this DVO table? 214 Checks path and modified date to be sure 215 ''' 216 def alreadyImportedThisDvoTable(self, path): 217 218 fileStat = os.stat(path) 219 220 sql = "SELECT COUNT(*) FROM " + self.dvoDoneTable + " WHERE path = '" + path + "' AND modifiedDate = " + str(fileStat.st_mtime) 221 222 try: 223 rs = self.executeQuery(sql) 224 rs.first() 225 if rs.getInt(1) > 0: 226 self.logger.debugPair("Already imported up-to-date version of", path) 227 return True 228 else: 229 return False 230 except: 231 self.logger.exception("Unable to check whether this DVO table has been imported") 232 233 234 ''' 184 235 Updates dvoDone table with this DVO table 185 236 ''' 186 def setImportedThisDvoTable(self, name): 187 188 sql = "INSERT INTO dvoDone (name) VALUES ('" + name + "')" 237 def setImportedThisDvoTable(self, path, region="null"): 238 239 fileStat = os.stat(path) 240 241 # first delete any old version we have ingested 242 sql = "DELETE FROM " + self.dvoDoneTable + " WHERE path = '" + path + "'" 189 243 self.execute(sql) 190 244 245 # now insert new version with up-to-date size and date 246 sql = "INSERT INTO " + self.dvoDoneTable + " (region, path, modifiedDate, size) VALUES ('" + region + "', '" + path + "', " + str(str(fileStat.st_mtime)) + ", " + str(str(fileStat.st_size)) + ")" 247 self.execute(sql) 248 249 250 ''' 251 Gets the id for the cpm file for the provided region 252 ''' 253 def getDvoCpmFileIdForRegion(self, region): 254 255 id = -1 256 sql = "SELECT id FROM " + self.dvoDoneTable + " WHERE region = '" + region + "' AND path LIKE '%.cpm'"; 257 try: 258 rs = self.executeQuery(sql) 259 rs.first() 260 id = rs.getInt(1) 261 except: 262 self.logger.errorPair("Could not get file id from " + self.dvoDoneTable, "for region: " + region) 263 264 return id 265 266 267 ''' 268 Gets the id for the provided file 269 ''' 270 def getDvoFileId(self, path): 271 272 id = -1 273 sql = "SELECT id FROM " + self.dvoDoneTable + " WHERE path = '" + path + "'" 274 try: 275 rs = self.executeQuery(sql) 276 rs.first() 277 id = rs.getInt(1) 278 except: 279 self.logger.errprPair("Could not get file id from " + self.dvoDoneTable + "for", path) 280 281 return id 282 283 ''' 284 Returns a list of DVO regions currently ingested 285 ''' 286 def getIngestedDvoRegions(self): 287 288 regions = [] 289 290 sql = "SELECT DISTINCT region FROM dvoDone WHERE region != 'null'" 291 try: 292 rs = self.executeQuery(sql) 293 while (rs.next()): 294 regions.append(rs.getString(1)) 295 rs.close() 296 except: 297 self.logger.errorPai("Can't query for ingested regions", sql) 298 299 return regions 300 301 302 ''' 303 Gets total size of DVO files imported to this database 304 Counts only cpm and cpt files 305 ''' 306 def getTotalSizeOfIngestedDvoFiles(self): 307 308 size = 0 309 sql = "SELECT SUM(size) FROM " + self.dvoDoneTable + " WHERE path LIKE '%cpm' OR path LIKE '%cpt'" 310 try: 311 rs = self.executeQuery(sql) 312 rs.first() 313 size = rs.getLong(1) 314 except: 315 self.logger.errorPair("Unable to get total ingested DVO size", sql) 316 317 return size 318 319 ''' 320 Checks whether DVO files we have ingested are from the DVO path provided 321 Does this by checking the original path of the SkyTable.fits file 322 ''' 323 def isCorrectDvo(self, path): 324 325 sql = "SELECT path FROM " + self.dvoDoneTable + " WHERE path LIKE '%SkyTable.fits'" 326 try: 327 rs = self.executeQuery(sql) 328 rs.first() 329 330 head,tail = os.path.split(rs.getString(1)) 331 332 if head == path: 333 self.logger.debugPair("Already ingested stuff from DVO at", path) 334 return True 335 else: 336 self.logger.errorPair("DVO does not match. We have", head) 337 return False 338 339 except: 340 self.logger.errorPair("No DVO files ingested for this path", path) 341 return False 342 191 343 ''' 192 344 Checks whether the astrometric solution is ok for this chip … … 210 362 return True 211 363 212 '''213 Have we already imported this DVO table?214 '''215 def alreadyImportedThisDvoTable(self, name):216 217 sql = "SELECT COUNT(*) FROM dvoDone WHERE name = '" + name + "'"218 219 try:220 rs = self.executeQuery(sql)221 rs.first()222 if rs.getInt(1) > 0:223 self.logger.errorPair("Already imported DVO tables for", name)224 return True225 else:226 return False227 except:228 self.logger.exception("Unable to check whether this DVO table has been imported")229 230 364 231 365 ''' … … 233 367 ''' 234 368 def createDvoTables(self): 235 236 self.logger.debugPair("Creating DVO table", "dvoMeta")237 238 sql = "DROP TABLE dvoMeta"369 370 # drop and create Images table 371 self.logger.debugPair("Creating DVO table", self.dvoImagesTable) 372 sql = "DROP TABLE " + self.dvoImagesTable 239 373 try: self.execute(sql) 240 374 except: pass 241 375 242 sql = "DROP TABLE dvoDetection" 243 try: self.execute(sql) 244 except: pass 245 246 sql = "CREATE TABLE dvoMeta ( \ 247 sourceID INT, \ 248 imageID INT, \ 249 externID INT, \ 250 flags INT, \ 251 photcode INT, \ 252 PRIMARY KEY (sourceID, imageID, externID) \ 376 sql = "CREATE TABLE " + self.dvoImagesTable + " ( \ 377 SOURCE_ID SMALLINT, \ 378 IMAGE_ID INT, \ 379 EXTERN_ID INT, \ 380 FLAGS INT, \ 381 PHOTCODE SMALLINT, \ 382 PRIMARY KEY (IMAGE_ID, EXTERN_ID) \ 253 383 )" 254 384 … … 257 387 self.logger.error("Unable to create DVO meta-data database table") 258 388 389 # now detection table 390 self.logger.debugPair("Creating DVO table", self.dvoDetectionTable) 391 sql = "DROP TABLE " + self.dvoDetectionTable 392 try: self.execute(sql) 393 except: pass 394 259 395 self.logger.debugPair("Creating DVO table", "dvoDetection") 260 396 sql = "CREATE TABLE dvoDetection ( \ 261 sourceID INT, \262 397 imageID INT, \ 263 398 ippDetectID BIGINT, \ … … 266 401 objID BIGINT, \ 267 402 flags INT, \ 268 PRIMARY KEY ( sourceID,imageID, ippDetectID) \403 PRIMARY KEY (imageID, ippDetectID) \ 269 404 )" 270 405 … … 275 410 276 411 ''' 412 Removes the provided DVO FITS files from from dvoDone and dvoDetection tables 413 Returns a count of the number of detections deleted 414 ''' 415 def purgeTheseDvoRegions(self, regions): 416 417 detectionCount = self.getRowCount(self.dvoDetectionTable) 418 for region in regions: 419 420 fileId = self.getDvoCpmFileIdForRegion(region) 421 422 if fileId < 0: 423 self.logger.errorPair("Unable to get file ID to delete " + region + " from", self.dvoDoneTable) 424 continue 425 426 sql = "DELETE FROM " + self.dvoDoneTable + " WHERE region = '" + region + "'" 427 try: self.execute(sql) 428 except: 429 self.logger.errorPair("Unable to delete " + region + " from", self.dvoDoneTable) 430 431 finalCount = detectionCount - self.getRowCount(self.dvoDetectionTable) 432 433 # after a big delete, we should OPTIMIZE the table 434 self.logger.infoPair("Running OPTIMIZE on ", self.dvoDetectionTable) 435 if finalCount > 0: self.optimizeTable(self.dvoDetectionTable) 436 437 return finalCount 438 439 ''' 277 440 Drops and recreates tables necessary for dvoToMySQL program. Be very careful before using this... 278 441 ''' 279 def resetDvoToMysqlTables(self): 280 281 self.logger.infoPair("Dropping table", self.dvoMetaTable) 282 self.dropTable(self.dvoMetaTable) 442 def resetAllDvoTables(self): 443 444 # drop all dvo tables - NB detections have to be deleted prior to dvoDone due to foreign key constraint 445 self.logger.infoPair("Dropping table", self.dvoImagesTable) 446 self.dropTable(self.dvoImagesTable) 447 self.logger.infoPair("Dropping table", self.dvoSkyTable) 448 self.dropTable(self.dvoSkyTable) 283 449 self.logger.infoPair("Dropping table", self.dvoDetectionTable) 284 450 self.dropTable(self.dvoDetectionTable) … … 286 452 self.dropTable(self.dvoDoneTable) 287 453 288 self.logger.infoPair("Creating table", self.dvoMetaTable) 289 sql = "CREATE TABLE " + self.dvoMetaTable + " LIKE dvoMeta" 454 # create dvoDone table 455 self.logger.infoPair("Creating table", self.dvoDoneTable) 456 sql = "CREATE TABLE " + self.dvoDoneTable + " (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, region VARCHAR(100), path VARCHAR(1000), modifiedDate BIGINT, size BIGINT)" 290 457 try: self.execute(sql) 291 except: self.logger.errorPair("Unable to create table", self.dvoMetaTable) 292 458 except: 459 self.logger.errorPair("Unable to create table", self.dvoDoneTable) 460 return False 461 462 self.changeEngineToInnoDB(self.dvoDoneTable) 463 464 # create detections table 293 465 self.logger.infoPair("Creating table", self.dvoDetectionTable) 294 466 sql = "CREATE TABLE " + self.dvoDetectionTable + " LIKE dvoDetection" 295 467 try: self.execute(sql) 296 except: self.logger.errorPair("Unable to create table", self.dvoDetectionTable) 297 298 self.logger.infoPair("Creating table", self.dvoDoneTable ) 299 sql = "CREATE TABLE " + self.dvoDoneTable + " (name VARCHAR(100))" 468 except: 469 self.logger.errorPair("Unable to create table", self.dvoDetectionTable) 470 return False 471 self.changeEngineToInnoDB(self.dvoDetectionTable) 472 473 # add fileID column 474 sql = "ALTER TABLE " + self.dvoDetectionTable + " ADD fileID INT NOT NULL" 300 475 try: self.execute(sql) 301 except: self.logger.errorPair("Unable to create table", self.dvoDoneTable) 302 303 304 476 except: 477 self.logger.errorPair("Unable to add fileID column to ", self.dvoDetectionTable) 478 return False 479 480 # add an index to the fileID column 481 self.createIndex(self.dvoDetectionTable, "fileID") 482 483 # now add a delete cascading foreign key constraint on fileID 484 sql = "ALTER TABLE dvoDetectionFull \ 485 ADD CONSTRAINT fk_fileID \ 486 FOREIGN KEY (fileID) \ 487 REFERENCES dvoDone(id) \ 488 ON DELETE CASCADE" 489 try: self.execute(sql) 490 except: 491 self.logger.errorPair("Unable to create foreign key on", self.dvoDoneTable) 492 return False 493 494 return True 495 496 ''' 497 Gets a list of DVO regions that overlap with the defined box 498 ''' 499 def getDvoRegions(self, minRa, maxRa, minDec, maxDec): 500 501 self.logger.debug("Querying DVO SkyTable for FITS files in this region") 502 503 regions = [] 504 self.getDvoRegionsForThisBox(regions, minRa, maxRa, minDec, maxDec) 505 506 # deal with 0/360 boundary 507 if minRa < 0: self.getDvoRegionsForThisBox(regions, minRa + 360, 361 ,minDec, maxDec) 508 if maxRa > 360: self.getDvoRegionsForThisBox(regions, 0, maxRa - 360 ,minDec, maxDec) 509 510 return regions 511 512 ''' 513 Gets a list of DVO regions that overlap with the defined box 514 ''' 515 def getDvoRegionsForThisBox(self, regions, minRa, maxRa, minDec, maxDec): 516 517 sql = "SELECT name FROM " + self.dvoSkyTable + " \ 518 WHERE NOT ((" + str(maxRa) + " <= R_MIN) OR \ 519 (" + str(minRa) + " >= R_MAX) OR \ 520 (" + str(maxDec) + " <= D_MIN) OR \ 521 (" + str(minDec) + " >= D_MAX)) " 522 523 try: 524 rs = self.executeQuery(sql) 525 while (rs.next()): regions.append(rs.getString(1)) 526 rs.close() 527 except: 528 self.logger.exception("Can't query for DVO regions") 529 530
Note:
See TracChangeset
for help on using the changeset viewer.
