Changeset 15343 for trunk/ippdb/src/ippdb.c
- Timestamp:
- Oct 19, 2007, 3:59:06 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/ippdb/src/ippdb.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippdb/src/ippdb.c
r15003 r15343 31 31 #include "ippdb.h" 32 32 33 #define PZDATASTORE_TABLE_NAME "pzDataStore" 33 34 #define SUMMITEXP_TABLE_NAME "summitExp" 34 35 #define SUMMITIMFILE_TABLE_NAME "summitImfile" … … 70 71 #define DETRUNSUMMARY_TABLE_NAME "detRunSummary" 71 72 #define DETREGISTEREDIMFILE_TABLE_NAME "detRegisteredImfile" 73 #define DETCORRECTEDEXP_TABLE_NAME "detCorrectedExp" 74 #define DETCORRECTEDIMFILE_TABLE_NAME "detCorrectedImfile" 72 75 #define MAGICRUN_TABLE_NAME "magicRun" 73 76 #define MAGICINPUTSKYFILE_TABLE_NAME "magicInputSkyfile" … … 75 78 #define MAGICNODERESULT_TABLE_NAME "magicNodeResult" 76 79 #define MAGICMASK_TABLE_NAME "magicMask" 80 #define MAGICSKYFILEMASK_TABLE_NAME "magicSkyfileMask" 77 81 #define MAX_STRING_LENGTH 1024 78 82 … … 251 255 } 252 256 257 static void pzDataStoreRowFree(pzDataStoreRow *object); 258 259 pzDataStoreRow *pzDataStoreRowAlloc(const char *camera, const char *telescope, const char *uri) 260 { 261 pzDataStoreRow *_object; 262 263 _object = psAlloc(sizeof(pzDataStoreRow)); 264 psMemSetDeallocator(_object, (psFreeFunc)pzDataStoreRowFree); 265 266 _object->camera = psStringCopy(camera); 267 _object->telescope = psStringCopy(telescope); 268 _object->uri = psStringCopy(uri); 269 270 return _object; 271 } 272 273 static void pzDataStoreRowFree(pzDataStoreRow *object) 274 { 275 psFree(object->camera); 276 psFree(object->telescope); 277 psFree(object->uri); 278 } 279 280 bool pzDataStoreCreateTable(psDB *dbh) 281 { 282 psMetadata *md = psMetadataAlloc(); 283 if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, "Primary Key", "64")) { 284 psError(PS_ERR_UNKNOWN, false, "failed to add item camera"); 285 psFree(md); 286 return false; 287 } 288 if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, "Primary Key", "64")) { 289 psError(PS_ERR_UNKNOWN, false, "failed to add item telescope"); 290 psFree(md); 291 return false; 292 } 293 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) { 294 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 295 psFree(md); 296 return false; 297 } 298 299 bool status = psDBCreateTable(dbh, PZDATASTORE_TABLE_NAME, md); 300 301 psFree(md); 302 303 return status; 304 } 305 306 bool pzDataStoreDropTable(psDB *dbh) 307 { 308 return psDBDropTable(dbh, PZDATASTORE_TABLE_NAME); 309 } 310 311 bool pzDataStoreInsert(psDB * dbh, const char *camera, const char *telescope, const char *uri) 312 { 313 psMetadata *md = psMetadataAlloc(); 314 if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) { 315 psError(PS_ERR_UNKNOWN, false, "failed to add item camera"); 316 psFree(md); 317 return false; 318 } 319 if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) { 320 psError(PS_ERR_UNKNOWN, false, "failed to add item telescope"); 321 psFree(md); 322 return false; 323 } 324 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) { 325 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 326 psFree(md); 327 return false; 328 } 329 330 bool status = psDBInsertOneRow(dbh, PZDATASTORE_TABLE_NAME, md); 331 psFree(md); 332 333 return status; 334 } 335 336 long long pzDataStoreDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 337 { 338 long long deleted = 0; 339 340 long long count = psDBDeleteRows(dbh, PZDATASTORE_TABLE_NAME, where, limit); 341 if (count < 0) { 342 psError(PS_ERR_UNKNOWN, true, "failed to delete row from pzDataStore"); 343 return count; 344 345 deleted += count; 346 } 347 348 return deleted; 349 } 350 bool pzDataStoreInsertObject(psDB *dbh, pzDataStoreRow *object) 351 { 352 return pzDataStoreInsert(dbh, object->camera, object->telescope, object->uri); 353 } 354 355 bool pzDataStoreInsertObjects(psDB *dbh, psArray *objects) 356 { 357 for (long i = 0; i < psArrayLength(objects); i++) { 358 if (!pzDataStoreInsertObject(dbh, objects->data[i])) { 359 return false; 360 } 361 } 362 363 return true; 364 } 365 366 bool pzDataStoreInsertFits(psDB *dbh, const psFits *fits) 367 { 368 psArray *rowSet; 369 370 // move to (the first?) extension named PZDATASTORE_TABLE_NAME 371 if (!psFitsMoveExtName(fits, PZDATASTORE_TABLE_NAME)) { 372 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", PZDATASTORE_TABLE_NAME); 373 return false; 374 } 375 376 // check HDU type 377 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 378 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 379 return false; 380 } 381 382 // read fits table 383 rowSet = psFitsReadTable(fits); 384 if (!rowSet) { 385 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 386 psFree(rowSet); 387 return false; 388 } 389 390 if (!psDBInsertRows(dbh, PZDATASTORE_TABLE_NAME, rowSet)) { 391 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 392 psFree(rowSet); 393 return false; 394 } 395 396 psFree(rowSet); 397 398 return true; 399 } 400 401 bool pzDataStoreSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 402 { 403 psArray *rowSet; 404 405 rowSet = psDBSelectRows(dbh, PZDATASTORE_TABLE_NAME, where, limit); 406 if (!rowSet) { 407 return false; 408 } 409 410 // output to fits 411 if (!psFitsWriteTable(fits, NULL, rowSet, PZDATASTORE_TABLE_NAME)) { 412 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 413 psFree(rowSet); 414 return false; 415 } 416 417 psFree(rowSet); 418 419 return true; 420 } 421 422 psMetadata *pzDataStoreMetadataFromObject(const pzDataStoreRow *object) 423 { 424 psMetadata *md = psMetadataAlloc(); 425 if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) { 426 psError(PS_ERR_UNKNOWN, false, "failed to add item camera"); 427 psFree(md); 428 return false; 429 } 430 if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) { 431 psError(PS_ERR_UNKNOWN, false, "failed to add item telescope"); 432 psFree(md); 433 return false; 434 } 435 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) { 436 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 437 psFree(md); 438 return false; 439 } 440 441 442 return md; 443 } 444 445 pzDataStoreRow *pzDataStoreObjectFromMetadata(psMetadata *md) 446 { 447 448 bool status = false; 449 char* camera = psMetadataLookupPtr(&status, md, "camera"); 450 if (!status) { 451 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera"); 452 return false; 453 } 454 char* telescope = psMetadataLookupPtr(&status, md, "telescope"); 455 if (!status) { 456 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope"); 457 return false; 458 } 459 char* uri = psMetadataLookupPtr(&status, md, "uri"); 460 if (!status) { 461 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri"); 462 return false; 463 } 464 465 return pzDataStoreRowAlloc(camera, telescope, uri); 466 } 467 psArray *pzDataStoreSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 468 { 469 psArray *rowSet; 470 psArray *returnSet; 471 psU64 i; 472 473 rowSet = psDBSelectRows(dbh, PZDATASTORE_TABLE_NAME, where, limit); 474 if (!rowSet) { 475 return NULL; 476 } 477 478 // convert psMetadata rows to row objects 479 480 returnSet = psArrayAllocEmpty(rowSet->n); 481 482 for (i = 0; i < rowSet->n; i++) { 483 pzDataStoreRow *object = pzDataStoreObjectFromMetadata(rowSet->data[i]); 484 psArrayAdd(returnSet, 0, object); 485 psFree(object); 486 } 487 488 psFree(rowSet); 489 490 return returnSet; 491 } 492 bool pzDataStoreDeleteObject(psDB *dbh, const pzDataStoreRow *object) 493 { 494 psMetadata *where = pzDataStoreMetadataFromObject(object); 495 long long count = psDBDeleteRows(dbh, PZDATASTORE_TABLE_NAME, where, 0); 496 psFree(where); 497 if (count < 0) { 498 psError(PS_ERR_UNKNOWN, true, "failed to delete row from pzDataStore"); 499 return false; 500 } 501 if (count > 1) { 502 // XXX should this be a psAbort() instead? It is possible that 503 // having an object match multiple rows was by design. 504 psError(PS_ERR_UNKNOWN, true, "pzDataStoreRow object matched more then one row. Check your database schema"); 505 return false; 506 } 507 508 return true; 509 } 510 long long pzDataStoreDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 511 { 512 long long deleted = 0; 513 514 for (long long i = 0; i < objects->n; i++) { 515 pzDataStoreRow *object = objects->data[i]; 516 psMetadata *where = pzDataStoreMetadataFromObject(object); 517 long long count = psDBDeleteRows(dbh, PZDATASTORE_TABLE_NAME, where, limit); 518 psFree(where); 519 if (count < 0) { 520 psError(PS_ERR_UNKNOWN, true, "failed to delete row from pzDataStore"); 521 return count; 522 } 523 524 deleted += count; 525 } 526 527 return deleted; 528 } 529 bool pzDataStorePrintObjects(FILE *stream, psArray *objects, bool mdcf) 530 { 531 PS_ASSERT_PTR_NON_NULL(objects, false); 532 533 psMetadata *output = psMetadataAlloc(); 534 for (long i = 0; i < psArrayLength(objects); i++) { 535 psMetadata *md = pzDataStoreMetadataFromObject(objects->data[i]); 536 if (!psMetadataAddMetadata( 537 output, 538 PS_LIST_TAIL, 539 PZDATASTORE_TABLE_NAME, 540 PS_META_DUPLICATE_OK, 541 NULL, 542 md 543 )) { 544 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 545 psFree(md); 546 psFree(output); 547 return false; 548 } 549 psFree(md); 550 } 551 552 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 553 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 554 psFree(output); 555 } 556 psFree(output); 557 558 return true; 559 } 560 bool pzDataStorePrintObject(FILE *stream, pzDataStoreRow *object, bool mdcf) 561 { 562 PS_ASSERT_PTR_NON_NULL(object, false); 563 564 psMetadata *md = pzDataStoreMetadataFromObject(object); 565 566 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 567 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 568 psFree(md); 569 } 570 571 psFree(md); 572 573 return true; 574 } 253 575 static void summitExpRowFree(summitExpRow *object); 254 576 … … 18886 19208 return true; 18887 19209 } 19210 static void detCorrectedExpRowFree(detCorrectedExpRow *object); 19211 19212 detCorrectedExpRow *detCorrectedExpRowAlloc(psS64 det_id, psS64 exp_id, const char *uri, psS64 corr_id, const char *corr_type, const char *recipe, const char *path_base, psS16 fault) 19213 { 19214 detCorrectedExpRow *_object; 19215 19216 _object = psAlloc(sizeof(detCorrectedExpRow)); 19217 psMemSetDeallocator(_object, (psFreeFunc)detCorrectedExpRowFree); 19218 19219 _object->det_id = det_id; 19220 _object->exp_id = exp_id; 19221 _object->uri = psStringCopy(uri); 19222 _object->corr_id = corr_id; 19223 _object->corr_type = psStringCopy(corr_type); 19224 _object->recipe = psStringCopy(recipe); 19225 _object->path_base = psStringCopy(path_base); 19226 _object->fault = fault; 19227 19228 return _object; 19229 } 19230 19231 static void detCorrectedExpRowFree(detCorrectedExpRow *object) 19232 { 19233 psFree(object->uri); 19234 psFree(object->corr_type); 19235 psFree(object->recipe); 19236 psFree(object->path_base); 19237 } 19238 19239 bool detCorrectedExpCreateTable(psDB *dbh) 19240 { 19241 psMetadata *md = psMetadataAlloc(); 19242 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, exp_id) ref detInputExp(det_id, exp_id)", 0)) { 19243 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 19244 psFree(md); 19245 return false; 19246 } 19247 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(exp_id, class_id) ref rawImfile(exp_id, class_id)", 64)) { 19248 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 19249 psFree(md); 19250 return false; 19251 } 19252 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, "INDEX(det_id, exp_id)", "255")) { 19253 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 19254 psFree(md); 19255 return false; 19256 } 19257 if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, 0)) { 19258 psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id"); 19259 psFree(md); 19260 return false; 19261 } 19262 if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_type", PS_DATA_STRING, NULL, "64")) { 19263 psError(PS_ERR_UNKNOWN, false, "failed to add item corr_type"); 19264 psFree(md); 19265 return false; 19266 } 19267 if (!psMetadataAdd(md, PS_LIST_TAIL, "recipe", PS_DATA_STRING, NULL, "64")) { 19268 psError(PS_ERR_UNKNOWN, false, "failed to add item recipe"); 19269 psFree(md); 19270 return false; 19271 } 19272 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, "255")) { 19273 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base"); 19274 psFree(md); 19275 return false; 19276 } 19277 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) { 19278 psError(PS_ERR_UNKNOWN, false, "failed to add item fault"); 19279 psFree(md); 19280 return false; 19281 } 19282 19283 bool status = psDBCreateTable(dbh, DETCORRECTEDEXP_TABLE_NAME, md); 19284 19285 psFree(md); 19286 19287 return status; 19288 } 19289 19290 bool detCorrectedExpDropTable(psDB *dbh) 19291 { 19292 return psDBDropTable(dbh, DETCORRECTEDEXP_TABLE_NAME); 19293 } 19294 19295 bool detCorrectedExpInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *uri, psS64 corr_id, const char *corr_type, const char *recipe, const char *path_base, psS16 fault) 19296 { 19297 psMetadata *md = psMetadataAlloc(); 19298 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, det_id)) { 19299 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 19300 psFree(md); 19301 return false; 19302 } 19303 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) { 19304 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 19305 psFree(md); 19306 return false; 19307 } 19308 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) { 19309 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 19310 psFree(md); 19311 return false; 19312 } 19313 if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, corr_id)) { 19314 psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id"); 19315 psFree(md); 19316 return false; 19317 } 19318 if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_type", PS_DATA_STRING, NULL, corr_type)) { 19319 psError(PS_ERR_UNKNOWN, false, "failed to add item corr_type"); 19320 psFree(md); 19321 return false; 19322 } 19323 if (!psMetadataAdd(md, PS_LIST_TAIL, "recipe", PS_DATA_STRING, NULL, recipe)) { 19324 psError(PS_ERR_UNKNOWN, false, "failed to add item recipe"); 19325 psFree(md); 19326 return false; 19327 } 19328 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) { 19329 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base"); 19330 psFree(md); 19331 return false; 19332 } 19333 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) { 19334 psError(PS_ERR_UNKNOWN, false, "failed to add item fault"); 19335 psFree(md); 19336 return false; 19337 } 19338 19339 bool status = psDBInsertOneRow(dbh, DETCORRECTEDEXP_TABLE_NAME, md); 19340 psFree(md); 19341 19342 return status; 19343 } 19344 19345 long long detCorrectedExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 19346 { 19347 long long deleted = 0; 19348 19349 long long count = psDBDeleteRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit); 19350 if (count < 0) { 19351 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedExp"); 19352 return count; 19353 19354 deleted += count; 19355 } 19356 19357 return deleted; 19358 } 19359 bool detCorrectedExpInsertObject(psDB *dbh, detCorrectedExpRow *object) 19360 { 19361 return detCorrectedExpInsert(dbh, object->det_id, object->exp_id, object->uri, object->corr_id, object->corr_type, object->recipe, object->path_base, object->fault); 19362 } 19363 19364 bool detCorrectedExpInsertObjects(psDB *dbh, psArray *objects) 19365 { 19366 for (long i = 0; i < psArrayLength(objects); i++) { 19367 if (!detCorrectedExpInsertObject(dbh, objects->data[i])) { 19368 return false; 19369 } 19370 } 19371 19372 return true; 19373 } 19374 19375 bool detCorrectedExpInsertFits(psDB *dbh, const psFits *fits) 19376 { 19377 psArray *rowSet; 19378 19379 // move to (the first?) extension named DETCORRECTEDEXP_TABLE_NAME 19380 if (!psFitsMoveExtName(fits, DETCORRECTEDEXP_TABLE_NAME)) { 19381 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", DETCORRECTEDEXP_TABLE_NAME); 19382 return false; 19383 } 19384 19385 // check HDU type 19386 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 19387 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 19388 return false; 19389 } 19390 19391 // read fits table 19392 rowSet = psFitsReadTable(fits); 19393 if (!rowSet) { 19394 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 19395 psFree(rowSet); 19396 return false; 19397 } 19398 19399 if (!psDBInsertRows(dbh, DETCORRECTEDEXP_TABLE_NAME, rowSet)) { 19400 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 19401 psFree(rowSet); 19402 return false; 19403 } 19404 19405 psFree(rowSet); 19406 19407 return true; 19408 } 19409 19410 bool detCorrectedExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 19411 { 19412 psArray *rowSet; 19413 19414 rowSet = psDBSelectRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit); 19415 if (!rowSet) { 19416 return false; 19417 } 19418 19419 // output to fits 19420 if (!psFitsWriteTable(fits, NULL, rowSet, DETCORRECTEDEXP_TABLE_NAME)) { 19421 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 19422 psFree(rowSet); 19423 return false; 19424 } 19425 19426 psFree(rowSet); 19427 19428 return true; 19429 } 19430 19431 psMetadata *detCorrectedExpMetadataFromObject(const detCorrectedExpRow *object) 19432 { 19433 psMetadata *md = psMetadataAlloc(); 19434 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, object->det_id)) { 19435 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 19436 psFree(md); 19437 return false; 19438 } 19439 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) { 19440 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 19441 psFree(md); 19442 return false; 19443 } 19444 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) { 19445 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 19446 psFree(md); 19447 return false; 19448 } 19449 if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, object->corr_id)) { 19450 psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id"); 19451 psFree(md); 19452 return false; 19453 } 19454 if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_type", PS_DATA_STRING, NULL, object->corr_type)) { 19455 psError(PS_ERR_UNKNOWN, false, "failed to add item corr_type"); 19456 psFree(md); 19457 return false; 19458 } 19459 if (!psMetadataAdd(md, PS_LIST_TAIL, "recipe", PS_DATA_STRING, NULL, object->recipe)) { 19460 psError(PS_ERR_UNKNOWN, false, "failed to add item recipe"); 19461 psFree(md); 19462 return false; 19463 } 19464 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, object->path_base)) { 19465 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base"); 19466 psFree(md); 19467 return false; 19468 } 19469 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) { 19470 psError(PS_ERR_UNKNOWN, false, "failed to add item fault"); 19471 psFree(md); 19472 return false; 19473 } 19474 19475 19476 return md; 19477 } 19478 19479 detCorrectedExpRow *detCorrectedExpObjectFromMetadata(psMetadata *md) 19480 { 19481 19482 bool status = false; 19483 psS64 det_id = psMetadataLookupS64(&status, md, "det_id"); 19484 if (!status) { 19485 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item det_id"); 19486 return false; 19487 } 19488 psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id"); 19489 if (!status) { 19490 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id"); 19491 return false; 19492 } 19493 char* uri = psMetadataLookupPtr(&status, md, "uri"); 19494 if (!status) { 19495 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri"); 19496 return false; 19497 } 19498 psS64 corr_id = psMetadataLookupS64(&status, md, "corr_id"); 19499 if (!status) { 19500 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item corr_id"); 19501 return false; 19502 } 19503 char* corr_type = psMetadataLookupPtr(&status, md, "corr_type"); 19504 if (!status) { 19505 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item corr_type"); 19506 return false; 19507 } 19508 char* recipe = psMetadataLookupPtr(&status, md, "recipe"); 19509 if (!status) { 19510 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe"); 19511 return false; 19512 } 19513 char* path_base = psMetadataLookupPtr(&status, md, "path_base"); 19514 if (!status) { 19515 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item path_base"); 19516 return false; 19517 } 19518 psS16 fault = psMetadataLookupS16(&status, md, "fault"); 19519 if (!status) { 19520 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault"); 19521 return false; 19522 } 19523 19524 return detCorrectedExpRowAlloc(det_id, exp_id, uri, corr_id, corr_type, recipe, path_base, fault); 19525 } 19526 psArray *detCorrectedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 19527 { 19528 psArray *rowSet; 19529 psArray *returnSet; 19530 psU64 i; 19531 19532 rowSet = psDBSelectRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit); 19533 if (!rowSet) { 19534 return NULL; 19535 } 19536 19537 // convert psMetadata rows to row objects 19538 19539 returnSet = psArrayAllocEmpty(rowSet->n); 19540 19541 for (i = 0; i < rowSet->n; i++) { 19542 detCorrectedExpRow *object = detCorrectedExpObjectFromMetadata(rowSet->data[i]); 19543 psArrayAdd(returnSet, 0, object); 19544 psFree(object); 19545 } 19546 19547 psFree(rowSet); 19548 19549 return returnSet; 19550 } 19551 bool detCorrectedExpDeleteObject(psDB *dbh, const detCorrectedExpRow *object) 19552 { 19553 psMetadata *where = detCorrectedExpMetadataFromObject(object); 19554 long long count = psDBDeleteRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, 0); 19555 psFree(where); 19556 if (count < 0) { 19557 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedExp"); 19558 return false; 19559 } 19560 if (count > 1) { 19561 // XXX should this be a psAbort() instead? It is possible that 19562 // having an object match multiple rows was by design. 19563 psError(PS_ERR_UNKNOWN, true, "detCorrectedExpRow object matched more then one row. Check your database schema"); 19564 return false; 19565 } 19566 19567 return true; 19568 } 19569 long long detCorrectedExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 19570 { 19571 long long deleted = 0; 19572 19573 for (long long i = 0; i < objects->n; i++) { 19574 detCorrectedExpRow *object = objects->data[i]; 19575 psMetadata *where = detCorrectedExpMetadataFromObject(object); 19576 long long count = psDBDeleteRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit); 19577 psFree(where); 19578 if (count < 0) { 19579 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedExp"); 19580 return count; 19581 } 19582 19583 deleted += count; 19584 } 19585 19586 return deleted; 19587 } 19588 bool detCorrectedExpPrintObjects(FILE *stream, psArray *objects, bool mdcf) 19589 { 19590 PS_ASSERT_PTR_NON_NULL(objects, false); 19591 19592 psMetadata *output = psMetadataAlloc(); 19593 for (long i = 0; i < psArrayLength(objects); i++) { 19594 psMetadata *md = detCorrectedExpMetadataFromObject(objects->data[i]); 19595 if (!psMetadataAddMetadata( 19596 output, 19597 PS_LIST_TAIL, 19598 DETCORRECTEDEXP_TABLE_NAME, 19599 PS_META_DUPLICATE_OK, 19600 NULL, 19601 md 19602 )) { 19603 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 19604 psFree(md); 19605 psFree(output); 19606 return false; 19607 } 19608 psFree(md); 19609 } 19610 19611 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 19612 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 19613 psFree(output); 19614 } 19615 psFree(output); 19616 19617 return true; 19618 } 19619 bool detCorrectedExpPrintObject(FILE *stream, detCorrectedExpRow *object, bool mdcf) 19620 { 19621 PS_ASSERT_PTR_NON_NULL(object, false); 19622 19623 psMetadata *md = detCorrectedExpMetadataFromObject(object); 19624 19625 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 19626 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 19627 psFree(md); 19628 } 19629 19630 psFree(md); 19631 19632 return true; 19633 } 19634 static void detCorrectedImfileRowFree(detCorrectedImfileRow *object); 19635 19636 detCorrectedImfileRow *detCorrectedImfileRowAlloc(psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *path_base, psS16 fault) 19637 { 19638 detCorrectedImfileRow *_object; 19639 19640 _object = psAlloc(sizeof(detCorrectedImfileRow)); 19641 psMemSetDeallocator(_object, (psFreeFunc)detCorrectedImfileRowFree); 19642 19643 _object->det_id = det_id; 19644 _object->exp_id = exp_id; 19645 _object->class_id = psStringCopy(class_id); 19646 _object->uri = psStringCopy(uri); 19647 _object->path_base = psStringCopy(path_base); 19648 _object->fault = fault; 19649 19650 return _object; 19651 } 19652 19653 static void detCorrectedImfileRowFree(detCorrectedImfileRow *object) 19654 { 19655 psFree(object->class_id); 19656 psFree(object->uri); 19657 psFree(object->path_base); 19658 } 19659 19660 bool detCorrectedImfileCreateTable(psDB *dbh) 19661 { 19662 psMetadata *md = psMetadataAlloc(); 19663 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, exp_id) ref detInputExp(det_id, exp_id)", 0)) { 19664 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 19665 psFree(md); 19666 return false; 19667 } 19668 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(exp_id, class_id) ref rawImfile(exp_id, class_id)", 64)) { 19669 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 19670 psFree(md); 19671 return false; 19672 } 19673 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key INDEX(det_id, class_id)", "64")) { 19674 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 19675 psFree(md); 19676 return false; 19677 } 19678 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, "INDEX(det_id, exp_id)", "255")) { 19679 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 19680 psFree(md); 19681 return false; 19682 } 19683 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, "255")) { 19684 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base"); 19685 psFree(md); 19686 return false; 19687 } 19688 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) { 19689 psError(PS_ERR_UNKNOWN, false, "failed to add item fault"); 19690 psFree(md); 19691 return false; 19692 } 19693 19694 bool status = psDBCreateTable(dbh, DETCORRECTEDIMFILE_TABLE_NAME, md); 19695 19696 psFree(md); 19697 19698 return status; 19699 } 19700 19701 bool detCorrectedImfileDropTable(psDB *dbh) 19702 { 19703 return psDBDropTable(dbh, DETCORRECTEDIMFILE_TABLE_NAME); 19704 } 19705 19706 bool detCorrectedImfileInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *path_base, psS16 fault) 19707 { 19708 psMetadata *md = psMetadataAlloc(); 19709 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, det_id)) { 19710 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 19711 psFree(md); 19712 return false; 19713 } 19714 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) { 19715 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 19716 psFree(md); 19717 return false; 19718 } 19719 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) { 19720 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 19721 psFree(md); 19722 return false; 19723 } 19724 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) { 19725 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 19726 psFree(md); 19727 return false; 19728 } 19729 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) { 19730 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base"); 19731 psFree(md); 19732 return false; 19733 } 19734 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) { 19735 psError(PS_ERR_UNKNOWN, false, "failed to add item fault"); 19736 psFree(md); 19737 return false; 19738 } 19739 19740 bool status = psDBInsertOneRow(dbh, DETCORRECTEDIMFILE_TABLE_NAME, md); 19741 psFree(md); 19742 19743 return status; 19744 } 19745 19746 long long detCorrectedImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 19747 { 19748 long long deleted = 0; 19749 19750 long long count = psDBDeleteRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit); 19751 if (count < 0) { 19752 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedImfile"); 19753 return count; 19754 19755 deleted += count; 19756 } 19757 19758 return deleted; 19759 } 19760 bool detCorrectedImfileInsertObject(psDB *dbh, detCorrectedImfileRow *object) 19761 { 19762 return detCorrectedImfileInsert(dbh, object->det_id, object->exp_id, object->class_id, object->uri, object->path_base, object->fault); 19763 } 19764 19765 bool detCorrectedImfileInsertObjects(psDB *dbh, psArray *objects) 19766 { 19767 for (long i = 0; i < psArrayLength(objects); i++) { 19768 if (!detCorrectedImfileInsertObject(dbh, objects->data[i])) { 19769 return false; 19770 } 19771 } 19772 19773 return true; 19774 } 19775 19776 bool detCorrectedImfileInsertFits(psDB *dbh, const psFits *fits) 19777 { 19778 psArray *rowSet; 19779 19780 // move to (the first?) extension named DETCORRECTEDIMFILE_TABLE_NAME 19781 if (!psFitsMoveExtName(fits, DETCORRECTEDIMFILE_TABLE_NAME)) { 19782 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", DETCORRECTEDIMFILE_TABLE_NAME); 19783 return false; 19784 } 19785 19786 // check HDU type 19787 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 19788 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 19789 return false; 19790 } 19791 19792 // read fits table 19793 rowSet = psFitsReadTable(fits); 19794 if (!rowSet) { 19795 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 19796 psFree(rowSet); 19797 return false; 19798 } 19799 19800 if (!psDBInsertRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, rowSet)) { 19801 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 19802 psFree(rowSet); 19803 return false; 19804 } 19805 19806 psFree(rowSet); 19807 19808 return true; 19809 } 19810 19811 bool detCorrectedImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 19812 { 19813 psArray *rowSet; 19814 19815 rowSet = psDBSelectRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit); 19816 if (!rowSet) { 19817 return false; 19818 } 19819 19820 // output to fits 19821 if (!psFitsWriteTable(fits, NULL, rowSet, DETCORRECTEDIMFILE_TABLE_NAME)) { 19822 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 19823 psFree(rowSet); 19824 return false; 19825 } 19826 19827 psFree(rowSet); 19828 19829 return true; 19830 } 19831 19832 psMetadata *detCorrectedImfileMetadataFromObject(const detCorrectedImfileRow *object) 19833 { 19834 psMetadata *md = psMetadataAlloc(); 19835 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, object->det_id)) { 19836 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 19837 psFree(md); 19838 return false; 19839 } 19840 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) { 19841 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 19842 psFree(md); 19843 return false; 19844 } 19845 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, object->class_id)) { 19846 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 19847 psFree(md); 19848 return false; 19849 } 19850 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) { 19851 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 19852 psFree(md); 19853 return false; 19854 } 19855 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, object->path_base)) { 19856 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base"); 19857 psFree(md); 19858 return false; 19859 } 19860 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) { 19861 psError(PS_ERR_UNKNOWN, false, "failed to add item fault"); 19862 psFree(md); 19863 return false; 19864 } 19865 19866 19867 return md; 19868 } 19869 19870 detCorrectedImfileRow *detCorrectedImfileObjectFromMetadata(psMetadata *md) 19871 { 19872 19873 bool status = false; 19874 psS64 det_id = psMetadataLookupS64(&status, md, "det_id"); 19875 if (!status) { 19876 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item det_id"); 19877 return false; 19878 } 19879 psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id"); 19880 if (!status) { 19881 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id"); 19882 return false; 19883 } 19884 char* class_id = psMetadataLookupPtr(&status, md, "class_id"); 19885 if (!status) { 19886 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id"); 19887 return false; 19888 } 19889 char* uri = psMetadataLookupPtr(&status, md, "uri"); 19890 if (!status) { 19891 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri"); 19892 return false; 19893 } 19894 char* path_base = psMetadataLookupPtr(&status, md, "path_base"); 19895 if (!status) { 19896 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item path_base"); 19897 return false; 19898 } 19899 psS16 fault = psMetadataLookupS16(&status, md, "fault"); 19900 if (!status) { 19901 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault"); 19902 return false; 19903 } 19904 19905 return detCorrectedImfileRowAlloc(det_id, exp_id, class_id, uri, path_base, fault); 19906 } 19907 psArray *detCorrectedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 19908 { 19909 psArray *rowSet; 19910 psArray *returnSet; 19911 psU64 i; 19912 19913 rowSet = psDBSelectRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit); 19914 if (!rowSet) { 19915 return NULL; 19916 } 19917 19918 // convert psMetadata rows to row objects 19919 19920 returnSet = psArrayAllocEmpty(rowSet->n); 19921 19922 for (i = 0; i < rowSet->n; i++) { 19923 detCorrectedImfileRow *object = detCorrectedImfileObjectFromMetadata(rowSet->data[i]); 19924 psArrayAdd(returnSet, 0, object); 19925 psFree(object); 19926 } 19927 19928 psFree(rowSet); 19929 19930 return returnSet; 19931 } 19932 bool detCorrectedImfileDeleteObject(psDB *dbh, const detCorrectedImfileRow *object) 19933 { 19934 psMetadata *where = detCorrectedImfileMetadataFromObject(object); 19935 long long count = psDBDeleteRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, 0); 19936 psFree(where); 19937 if (count < 0) { 19938 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedImfile"); 19939 return false; 19940 } 19941 if (count > 1) { 19942 // XXX should this be a psAbort() instead? It is possible that 19943 // having an object match multiple rows was by design. 19944 psError(PS_ERR_UNKNOWN, true, "detCorrectedImfileRow object matched more then one row. Check your database schema"); 19945 return false; 19946 } 19947 19948 return true; 19949 } 19950 long long detCorrectedImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 19951 { 19952 long long deleted = 0; 19953 19954 for (long long i = 0; i < objects->n; i++) { 19955 detCorrectedImfileRow *object = objects->data[i]; 19956 psMetadata *where = detCorrectedImfileMetadataFromObject(object); 19957 long long count = psDBDeleteRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit); 19958 psFree(where); 19959 if (count < 0) { 19960 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedImfile"); 19961 return count; 19962 } 19963 19964 deleted += count; 19965 } 19966 19967 return deleted; 19968 } 19969 bool detCorrectedImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf) 19970 { 19971 PS_ASSERT_PTR_NON_NULL(objects, false); 19972 19973 psMetadata *output = psMetadataAlloc(); 19974 for (long i = 0; i < psArrayLength(objects); i++) { 19975 psMetadata *md = detCorrectedImfileMetadataFromObject(objects->data[i]); 19976 if (!psMetadataAddMetadata( 19977 output, 19978 PS_LIST_TAIL, 19979 DETCORRECTEDIMFILE_TABLE_NAME, 19980 PS_META_DUPLICATE_OK, 19981 NULL, 19982 md 19983 )) { 19984 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 19985 psFree(md); 19986 psFree(output); 19987 return false; 19988 } 19989 psFree(md); 19990 } 19991 19992 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 19993 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 19994 psFree(output); 19995 } 19996 psFree(output); 19997 19998 return true; 19999 } 20000 bool detCorrectedImfilePrintObject(FILE *stream, detCorrectedImfileRow *object, bool mdcf) 20001 { 20002 PS_ASSERT_PTR_NON_NULL(object, false); 20003 20004 psMetadata *md = detCorrectedImfileMetadataFromObject(object); 20005 20006 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 20007 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 20008 psFree(md); 20009 } 20010 20011 psFree(md); 20012 20013 return true; 20014 } 18888 20015 static void magicRunRowFree(magicRunRow *object); 18889 20016 … … 19320 20447 return false; 19321 20448 } 19322 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, " Key fkey(diff_id) ref diffRun(diff_id)", 0)) {20449 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, "Primary Key fkey(diff_id) ref diffRun(diff_id)", 0)) { 19323 20450 psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id"); 19324 20451 psFree(md); 19325 20452 return false; 19326 20453 } 19327 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "INDEX(magic_id, node)", "64")) {20454 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, "64")) { 19328 20455 psError(PS_ERR_UNKNOWN, false, "failed to add item node"); 19329 20456 psFree(md); … … 19632 20759 { 19633 20760 psMetadata *md = psMetadataAlloc(); 19634 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, " PrimaryKey fkey(magic_id) ref magicRun(magic_id)", 0)) {20761 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Key fkey(magic_id) ref magicRun(magic_id)", 0)) { 19635 20762 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id"); 19636 20763 psFree(md); 19637 20764 return false; 19638 20765 } 19639 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, " Primary Key fkey(magic_id, node) ref magicInputSkyfile(magic_id, node)", "64")) {20766 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Key INDEX(magic_id, node)", "64")) { 19640 20767 psError(PS_ERR_UNKNOWN, false, "failed to add item node"); 19641 20768 psFree(md); 19642 20769 return false; 19643 20770 } 19644 if (!psMetadataAdd(md, PS_LIST_TAIL, "dep", PS_DATA_STRING, " fkey(magic_id, dep) ref magicInputSkyfile(magic_id, node)", "64")) {20771 if (!psMetadataAdd(md, PS_LIST_TAIL, "dep", PS_DATA_STRING, "Key", "64")) { 19645 20772 psError(PS_ERR_UNKNOWN, false, "failed to add item dep"); 19646 20773 psFree(md); … … 19954 21081 return false; 19955 21082 } 19956 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Primary Key fkey(magic_id, node) ref magic InputSkyfile(magic_id, node)", "64")) {21083 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Primary Key fkey(magic_id, node) ref magicTree(magic_id, node)", "64")) { 19957 21084 psError(PS_ERR_UNKNOWN, false, "failed to add item node"); 19958 21085 psFree(md); … … 20536 21663 return true; 20537 21664 } 21665 static void magicSkyfileMaskRowFree(magicSkyfileMaskRow *object); 21666 21667 magicSkyfileMaskRow *magicSkyfileMaskRowAlloc(psS64 magic_id, psS64 diff_id, const char *uri) 21668 { 21669 magicSkyfileMaskRow *_object; 21670 21671 _object = psAlloc(sizeof(magicSkyfileMaskRow)); 21672 psMemSetDeallocator(_object, (psFreeFunc)magicSkyfileMaskRowFree); 21673 21674 _object->magic_id = magic_id; 21675 _object->diff_id = diff_id; 21676 _object->uri = psStringCopy(uri); 21677 21678 return _object; 21679 } 21680 21681 static void magicSkyfileMaskRowFree(magicSkyfileMaskRow *object) 21682 { 21683 psFree(object->uri); 21684 } 21685 21686 bool magicSkyfileMaskCreateTable(psDB *dbh) 21687 { 21688 psMetadata *md = psMetadataAlloc(); 21689 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Primary Key fkey(magic_id) ref magicRun(magic_id)", 0)) { 21690 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id"); 21691 psFree(md); 21692 return false; 21693 } 21694 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, "Primary Key fkey(diff_id) ref magicInputSkyfile(magic_id, diff_id)", 0)) { 21695 psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id"); 21696 psFree(md); 21697 return false; 21698 } 21699 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, "fkey(magic_id) ref magicMask(magic_id)", "255")) { 21700 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 21701 psFree(md); 21702 return false; 21703 } 21704 21705 bool status = psDBCreateTable(dbh, MAGICSKYFILEMASK_TABLE_NAME, md); 21706 21707 psFree(md); 21708 21709 return status; 21710 } 21711 21712 bool magicSkyfileMaskDropTable(psDB *dbh) 21713 { 21714 return psDBDropTable(dbh, MAGICSKYFILEMASK_TABLE_NAME); 21715 } 21716 21717 bool magicSkyfileMaskInsert(psDB * dbh, psS64 magic_id, psS64 diff_id, const char *uri) 21718 { 21719 psMetadata *md = psMetadataAlloc(); 21720 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, magic_id)) { 21721 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id"); 21722 psFree(md); 21723 return false; 21724 } 21725 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, NULL, diff_id)) { 21726 psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id"); 21727 psFree(md); 21728 return false; 21729 } 21730 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) { 21731 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 21732 psFree(md); 21733 return false; 21734 } 21735 21736 bool status = psDBInsertOneRow(dbh, MAGICSKYFILEMASK_TABLE_NAME, md); 21737 psFree(md); 21738 21739 return status; 21740 } 21741 21742 long long magicSkyfileMaskDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 21743 { 21744 long long deleted = 0; 21745 21746 long long count = psDBDeleteRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit); 21747 if (count < 0) { 21748 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicSkyfileMask"); 21749 return count; 21750 21751 deleted += count; 21752 } 21753 21754 return deleted; 21755 } 21756 bool magicSkyfileMaskInsertObject(psDB *dbh, magicSkyfileMaskRow *object) 21757 { 21758 return magicSkyfileMaskInsert(dbh, object->magic_id, object->diff_id, object->uri); 21759 } 21760 21761 bool magicSkyfileMaskInsertObjects(psDB *dbh, psArray *objects) 21762 { 21763 for (long i = 0; i < psArrayLength(objects); i++) { 21764 if (!magicSkyfileMaskInsertObject(dbh, objects->data[i])) { 21765 return false; 21766 } 21767 } 21768 21769 return true; 21770 } 21771 21772 bool magicSkyfileMaskInsertFits(psDB *dbh, const psFits *fits) 21773 { 21774 psArray *rowSet; 21775 21776 // move to (the first?) extension named MAGICSKYFILEMASK_TABLE_NAME 21777 if (!psFitsMoveExtName(fits, MAGICSKYFILEMASK_TABLE_NAME)) { 21778 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", MAGICSKYFILEMASK_TABLE_NAME); 21779 return false; 21780 } 21781 21782 // check HDU type 21783 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 21784 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 21785 return false; 21786 } 21787 21788 // read fits table 21789 rowSet = psFitsReadTable(fits); 21790 if (!rowSet) { 21791 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 21792 psFree(rowSet); 21793 return false; 21794 } 21795 21796 if (!psDBInsertRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, rowSet)) { 21797 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 21798 psFree(rowSet); 21799 return false; 21800 } 21801 21802 psFree(rowSet); 21803 21804 return true; 21805 } 21806 21807 bool magicSkyfileMaskSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 21808 { 21809 psArray *rowSet; 21810 21811 rowSet = psDBSelectRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit); 21812 if (!rowSet) { 21813 return false; 21814 } 21815 21816 // output to fits 21817 if (!psFitsWriteTable(fits, NULL, rowSet, MAGICSKYFILEMASK_TABLE_NAME)) { 21818 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 21819 psFree(rowSet); 21820 return false; 21821 } 21822 21823 psFree(rowSet); 21824 21825 return true; 21826 } 21827 21828 psMetadata *magicSkyfileMaskMetadataFromObject(const magicSkyfileMaskRow *object) 21829 { 21830 psMetadata *md = psMetadataAlloc(); 21831 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, object->magic_id)) { 21832 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id"); 21833 psFree(md); 21834 return false; 21835 } 21836 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, NULL, object->diff_id)) { 21837 psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id"); 21838 psFree(md); 21839 return false; 21840 } 21841 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) { 21842 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 21843 psFree(md); 21844 return false; 21845 } 21846 21847 21848 return md; 21849 } 21850 21851 magicSkyfileMaskRow *magicSkyfileMaskObjectFromMetadata(psMetadata *md) 21852 { 21853 21854 bool status = false; 21855 psS64 magic_id = psMetadataLookupS64(&status, md, "magic_id"); 21856 if (!status) { 21857 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic_id"); 21858 return false; 21859 } 21860 psS64 diff_id = psMetadataLookupS64(&status, md, "diff_id"); 21861 if (!status) { 21862 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item diff_id"); 21863 return false; 21864 } 21865 char* uri = psMetadataLookupPtr(&status, md, "uri"); 21866 if (!status) { 21867 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri"); 21868 return false; 21869 } 21870 21871 return magicSkyfileMaskRowAlloc(magic_id, diff_id, uri); 21872 } 21873 psArray *magicSkyfileMaskSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 21874 { 21875 psArray *rowSet; 21876 psArray *returnSet; 21877 psU64 i; 21878 21879 rowSet = psDBSelectRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit); 21880 if (!rowSet) { 21881 return NULL; 21882 } 21883 21884 // convert psMetadata rows to row objects 21885 21886 returnSet = psArrayAllocEmpty(rowSet->n); 21887 21888 for (i = 0; i < rowSet->n; i++) { 21889 magicSkyfileMaskRow *object = magicSkyfileMaskObjectFromMetadata(rowSet->data[i]); 21890 psArrayAdd(returnSet, 0, object); 21891 psFree(object); 21892 } 21893 21894 psFree(rowSet); 21895 21896 return returnSet; 21897 } 21898 bool magicSkyfileMaskDeleteObject(psDB *dbh, const magicSkyfileMaskRow *object) 21899 { 21900 psMetadata *where = magicSkyfileMaskMetadataFromObject(object); 21901 long long count = psDBDeleteRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, 0); 21902 psFree(where); 21903 if (count < 0) { 21904 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicSkyfileMask"); 21905 return false; 21906 } 21907 if (count > 1) { 21908 // XXX should this be a psAbort() instead? It is possible that 21909 // having an object match multiple rows was by design. 21910 psError(PS_ERR_UNKNOWN, true, "magicSkyfileMaskRow object matched more then one row. Check your database schema"); 21911 return false; 21912 } 21913 21914 return true; 21915 } 21916 long long magicSkyfileMaskDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 21917 { 21918 long long deleted = 0; 21919 21920 for (long long i = 0; i < objects->n; i++) { 21921 magicSkyfileMaskRow *object = objects->data[i]; 21922 psMetadata *where = magicSkyfileMaskMetadataFromObject(object); 21923 long long count = psDBDeleteRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit); 21924 psFree(where); 21925 if (count < 0) { 21926 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicSkyfileMask"); 21927 return count; 21928 } 21929 21930 deleted += count; 21931 } 21932 21933 return deleted; 21934 } 21935 bool magicSkyfileMaskPrintObjects(FILE *stream, psArray *objects, bool mdcf) 21936 { 21937 PS_ASSERT_PTR_NON_NULL(objects, false); 21938 21939 psMetadata *output = psMetadataAlloc(); 21940 for (long i = 0; i < psArrayLength(objects); i++) { 21941 psMetadata *md = magicSkyfileMaskMetadataFromObject(objects->data[i]); 21942 if (!psMetadataAddMetadata( 21943 output, 21944 PS_LIST_TAIL, 21945 MAGICSKYFILEMASK_TABLE_NAME, 21946 PS_META_DUPLICATE_OK, 21947 NULL, 21948 md 21949 )) { 21950 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 21951 psFree(md); 21952 psFree(output); 21953 return false; 21954 } 21955 psFree(md); 21956 } 21957 21958 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 21959 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 21960 psFree(output); 21961 } 21962 psFree(output); 21963 21964 return true; 21965 } 21966 bool magicSkyfileMaskPrintObject(FILE *stream, magicSkyfileMaskRow *object, bool mdcf) 21967 { 21968 PS_ASSERT_PTR_NON_NULL(object, false); 21969 21970 psMetadata *md = magicSkyfileMaskMetadataFromObject(object); 21971 21972 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 21973 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 21974 psFree(md); 21975 } 21976 21977 psFree(md); 21978 21979 return true; 21980 }
Note:
See TracChangeset
for help on using the changeset viewer.
