Changeset 15420 for trunk/ippdb/src
- Timestamp:
- Oct 30, 2007, 4:42:05 PM (19 years ago)
- Location:
- trunk/ippdb/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippdb/src/ippdb.c
r15344 r15420 20 20 /* 21 21 * 22 * This file was generated by glueforge 1.0 122 * This file was generated by glueforge 1.03 23 23 * 24 24 * Do NOT directly edit this file. … … 31 31 #include "ippdb.h" 32 32 33 #define PZDATASTORE_TABLE_NAME "pzDataStore"34 33 #define SUMMITEXP_TABLE_NAME "summitExp" 35 34 #define SUMMITIMFILE_TABLE_NAME "summitImfile" … … 44 43 #define GUIDEPENDINGEXP_TABLE_NAME "guidePendingExp" 45 44 #define CHIPRUN_TABLE_NAME "chipRun" 45 #define CHIPINPUTIMFILE_TABLE_NAME "chipInputImfile" 46 46 #define CHIPPROCESSEDIMFILE_TABLE_NAME "chipProcessedImfile" 47 47 #define CHIPMASK_TABLE_NAME "chipMask" … … 70 70 #define DETRESIDEXP_TABLE_NAME "detResidExp" 71 71 #define DETRUNSUMMARY_TABLE_NAME "detRunSummary" 72 #define DETREGISTEREDIMFILE_TABLE_NAME "detRegisteredImfile"73 #define DETCORRECTEDEXP_TABLE_NAME "detCorrectedExp"74 #define DETCORRECTEDIMFILE_TABLE_NAME "detCorrectedImfile"75 #define MAGICRUN_TABLE_NAME "magicRun"76 #define MAGICINPUTSKYFILE_TABLE_NAME "magicInputSkyfile"77 #define MAGICTREE_TABLE_NAME "magicTree"78 #define MAGICNODERESULT_TABLE_NAME "magicNodeResult"79 #define MAGICMASK_TABLE_NAME "magicMask"80 #define MAGICSKYFILEMASK_TABLE_NAME "magicSkyfileMask"81 72 #define MAX_STRING_LENGTH 1024 82 73 … … 255 246 } 256 247 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_NAME371 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 type377 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 table383 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 fits411 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 objects479 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 that503 // 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 md543 )) {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 }575 248 static void summitExpRowFree(summitExpRow *object); 576 249 … … 1747 1420 static void pzPendingImfileRowFree(pzPendingImfileRow *object); 1748 1421 1749 pzPendingImfileRow *pzPendingImfileRowAlloc(const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id )1422 pzPendingImfileRow *pzPendingImfileRowAlloc(const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id) 1750 1423 { 1751 1424 pzPendingImfileRow *_object; … … 1759 1432 _object->class = psStringCopy(class); 1760 1433 _object->class_id = psStringCopy(class_id); 1434 _object->exp_id = exp_id; 1761 1435 1762 1436 return _object; … … 1800 1474 return false; 1801 1475 } 1476 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Unique Key", 64)) { 1477 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 1478 psFree(md); 1479 return false; 1480 } 1802 1481 1803 1482 bool status = psDBCreateTable(dbh, PZPENDINGIMFILE_TABLE_NAME, md); … … 1813 1492 } 1814 1493 1815 bool pzPendingImfileInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id )1494 bool pzPendingImfileInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id) 1816 1495 { 1817 1496 psMetadata *md = psMetadataAlloc(); … … 1838 1517 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) { 1839 1518 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 1519 psFree(md); 1520 return false; 1521 } 1522 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) { 1523 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 1840 1524 psFree(md); 1841 1525 return false; … … 1864 1548 bool pzPendingImfileInsertObject(psDB *dbh, pzPendingImfileRow *object) 1865 1549 { 1866 return pzPendingImfileInsert(dbh, object->exp_name, object->camera, object->telescope, object->class, object->class_id );1550 return pzPendingImfileInsert(dbh, object->exp_name, object->camera, object->telescope, object->class, object->class_id, object->exp_id); 1867 1551 } 1868 1552 … … 1962 1646 return false; 1963 1647 } 1648 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) { 1649 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 1650 psFree(md); 1651 return false; 1652 } 1964 1653 1965 1654 … … 1996 1685 return false; 1997 1686 } 1998 1999 return pzPendingImfileRowAlloc(exp_name, camera, telescope, class, class_id); 1687 psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id"); 1688 if (!status) { 1689 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id"); 1690 return false; 1691 } 1692 1693 return pzPendingImfileRowAlloc(exp_name, camera, telescope, class, class_id, exp_id); 2000 1694 } 2001 1695 psArray *pzPendingImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 2427 2121 static void pzDoneImfileRowFree(pzDoneImfileRow *object); 2428 2122 2429 pzDoneImfileRow *pzDoneImfileRowAlloc(const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, const char *uri)2123 pzDoneImfileRow *pzDoneImfileRowAlloc(const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id, const char *uri) 2430 2124 { 2431 2125 pzDoneImfileRow *_object; … … 2439 2133 _object->class = psStringCopy(class); 2440 2134 _object->class_id = psStringCopy(class_id); 2135 _object->exp_id = exp_id; 2441 2136 _object->uri = psStringCopy(uri); 2442 2137 … … 2482 2177 return false; 2483 2178 } 2179 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Unique Key", 64)) { 2180 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 2181 psFree(md); 2182 return false; 2183 } 2484 2184 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) { 2485 2185 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); … … 2500 2200 } 2501 2201 2502 bool pzDoneImfileInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, const char *uri)2202 bool pzDoneImfileInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id, const char *uri) 2503 2203 { 2504 2204 psMetadata *md = psMetadataAlloc(); … … 2525 2225 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) { 2526 2226 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 2227 psFree(md); 2228 return false; 2229 } 2230 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) { 2231 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 2527 2232 psFree(md); 2528 2233 return false; … … 2556 2261 bool pzDoneImfileInsertObject(psDB *dbh, pzDoneImfileRow *object) 2557 2262 { 2558 return pzDoneImfileInsert(dbh, object->exp_name, object->camera, object->telescope, object->class, object->class_id, object-> uri);2263 return pzDoneImfileInsert(dbh, object->exp_name, object->camera, object->telescope, object->class, object->class_id, object->exp_id, object->uri); 2559 2264 } 2560 2265 … … 2654 2359 return false; 2655 2360 } 2361 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) { 2362 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 2363 psFree(md); 2364 return false; 2365 } 2656 2366 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) { 2657 2367 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); … … 2693 2403 return false; 2694 2404 } 2405 psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id"); 2406 if (!status) { 2407 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id"); 2408 return false; 2409 } 2695 2410 char* uri = psMetadataLookupPtr(&status, md, "uri"); 2696 2411 if (!status) { … … 2699 2414 } 2700 2415 2701 return pzDoneImfileRowAlloc(exp_name, camera, telescope, class, class_id, uri);2416 return pzDoneImfileRowAlloc(exp_name, camera, telescope, class, class_id, exp_id, uri); 2702 2417 } 2703 2418 psArray *pzDoneImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 2811 2526 static void newExpRowFree(newExpRow *object); 2812 2527 2813 newExpRow *newExpRowAlloc(psS64 exp_id, const char *tmp_exp_name, const char *tmp_camera, const char *tmp_telescope, const char *state, const char *workdir, const char *workdir_state, const char *reduction)2528 newExpRow *newExpRowAlloc(psS64 exp_id, const char *tmp_exp_name, const char *tmp_camera, const char *tmp_telescope, const char *state, psS32 imfiles, const char *workdir, const char *workdir_state) 2814 2529 { 2815 2530 newExpRow *_object; … … 2823 2538 _object->tmp_telescope = psStringCopy(tmp_telescope); 2824 2539 _object->state = psStringCopy(state); 2540 _object->imfiles = imfiles; 2825 2541 _object->workdir = psStringCopy(workdir); 2826 2542 _object->workdir_state = psStringCopy(workdir_state); 2827 _object->reduction = psStringCopy(reduction);2828 2543 2829 2544 return _object; … … 2838 2553 psFree(object->workdir); 2839 2554 psFree(object->workdir_state); 2840 psFree(object->reduction);2841 2555 } 2842 2556 … … 2869 2583 return false; 2870 2584 } 2585 if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, 0)) { 2586 psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles"); 2587 psFree(md); 2588 return false; 2589 } 2871 2590 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, "destination for output files", "255")) { 2872 2591 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir"); … … 2879 2598 return false; 2880 2599 } 2881 if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, "Reduction class", "64")) {2882 psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");2883 psFree(md);2884 return false;2885 }2886 2600 2887 2601 bool status = psDBCreateTable(dbh, NEWEXP_TABLE_NAME, md); … … 2897 2611 } 2898 2612 2899 bool newExpInsert(psDB * dbh, psS64 exp_id, const char *tmp_exp_name, const char *tmp_camera, const char *tmp_telescope, const char *state, const char *workdir, const char *workdir_state, const char *reduction)2613 bool newExpInsert(psDB * dbh, psS64 exp_id, const char *tmp_exp_name, const char *tmp_camera, const char *tmp_telescope, const char *state, psS32 imfiles, const char *workdir, const char *workdir_state) 2900 2614 { 2901 2615 psMetadata *md = psMetadataAlloc(); … … 2925 2639 return false; 2926 2640 } 2641 if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, imfiles)) { 2642 psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles"); 2643 psFree(md); 2644 return false; 2645 } 2927 2646 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) { 2928 2647 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir"); … … 2932 2651 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, workdir_state)) { 2933 2652 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state"); 2934 psFree(md);2935 return false;2936 }2937 if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {2938 psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");2939 2653 psFree(md); 2940 2654 return false; … … 2963 2677 bool newExpInsertObject(psDB *dbh, newExpRow *object) 2964 2678 { 2965 return newExpInsert(dbh, object->exp_id, object->tmp_exp_name, object->tmp_camera, object->tmp_telescope, object->state, object-> workdir, object->workdir_state, object->reduction);2679 return newExpInsert(dbh, object->exp_id, object->tmp_exp_name, object->tmp_camera, object->tmp_telescope, object->state, object->imfiles, object->workdir, object->workdir_state); 2966 2680 } 2967 2681 … … 3061 2775 return false; 3062 2776 } 2777 if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, object->imfiles)) { 2778 psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles"); 2779 psFree(md); 2780 return false; 2781 } 3063 2782 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) { 3064 2783 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir"); … … 3071 2790 return false; 3072 2791 } 3073 if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {3074 psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");3075 psFree(md);3076 return false;3077 }3078 2792 3079 2793 … … 3110 2824 return false; 3111 2825 } 2826 psS32 imfiles = psMetadataLookupS32(&status, md, "imfiles"); 2827 if (!status) { 2828 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item imfiles"); 2829 return false; 2830 } 3112 2831 char* workdir = psMetadataLookupPtr(&status, md, "workdir"); 3113 2832 if (!status) { … … 3120 2839 return false; 3121 2840 } 3122 char* reduction = psMetadataLookupPtr(&status, md, "reduction"); 3123 if (!status) { 3124 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction"); 3125 return false; 3126 } 3127 3128 return newExpRowAlloc(exp_id, tmp_exp_name, tmp_camera, tmp_telescope, state, workdir, workdir_state, reduction); 2841 2842 return newExpRowAlloc(exp_id, tmp_exp_name, tmp_camera, tmp_telescope, state, imfiles, workdir, workdir_state); 3129 2843 } 3130 2844 psArray *newExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 3555 3269 static void rawExpRowFree(rawExpRow *object); 3556 3270 3557 rawExpRow *rawExpRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *reduction, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault)3271 rawExpRow *rawExpRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, psS32 imfiles, const char *filelevel, const char *workdir, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault) 3558 3272 { 3559 3273 rawExpRow *_object; … … 3569 3283 _object->exp_tag = psStringCopy(exp_tag); 3570 3284 _object->exp_type = psStringCopy(exp_type); 3285 _object->imfiles = imfiles; 3571 3286 _object->filelevel = psStringCopy(filelevel); 3572 3287 _object->workdir = psStringCopy(workdir); 3573 _object->reduction = psStringCopy(reduction);3574 3288 _object->filter = psStringCopy(filter); 3575 3289 _object->airmass = airmass; … … 3607 3321 psFree(object->filelevel); 3608 3322 psFree(object->workdir); 3609 psFree(object->reduction);3610 3323 psFree(object->filter); 3611 3324 psFree(object->object); … … 3650 3363 return false; 3651 3364 } 3365 if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, 0)) { 3366 psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles"); 3367 psFree(md); 3368 return false; 3369 } 3652 3370 if (!psMetadataAdd(md, PS_LIST_TAIL, "filelevel", PS_DATA_STRING, NULL, "64")) { 3653 3371 psError(PS_ERR_UNKNOWN, false, "failed to add item filelevel"); … … 3660 3378 return false; 3661 3379 } 3662 if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, "Reduction class", "64")) {3663 psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");3664 psFree(md);3665 return false;3666 }3667 3380 if (!psMetadataAdd(md, PS_LIST_TAIL, "filter", PS_DATA_STRING, NULL, "64")) { 3668 3381 psError(PS_ERR_UNKNOWN, false, "failed to add item filter"); … … 3783 3496 } 3784 3497 3785 bool rawExpInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *reduction, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault)3498 bool rawExpInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, psS32 imfiles, const char *filelevel, const char *workdir, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault) 3786 3499 { 3787 3500 psMetadata *md = psMetadataAlloc(); … … 3821 3534 return false; 3822 3535 } 3536 if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, imfiles)) { 3537 psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles"); 3538 psFree(md); 3539 return false; 3540 } 3823 3541 if (!psMetadataAdd(md, PS_LIST_TAIL, "filelevel", PS_DATA_STRING, NULL, filelevel)) { 3824 3542 psError(PS_ERR_UNKNOWN, false, "failed to add item filelevel"); … … 3828 3546 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) { 3829 3547 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir"); 3830 psFree(md);3831 return false;3832 }3833 if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {3834 psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");3835 3548 psFree(md); 3836 3549 return false; … … 3964 3677 bool rawExpInsertObject(psDB *dbh, rawExpRow *object) 3965 3678 { 3966 return rawExpInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->exp_tag, object->exp_type, object-> filelevel, object->workdir, object->reduction, object->filter, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->solang, object->fault);3679 return rawExpInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->exp_tag, object->exp_type, object->imfiles, object->filelevel, object->workdir, object->filter, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->solang, object->fault); 3967 3680 } 3968 3681 … … 4072 3785 return false; 4073 3786 } 3787 if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, object->imfiles)) { 3788 psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles"); 3789 psFree(md); 3790 return false; 3791 } 4074 3792 if (!psMetadataAdd(md, PS_LIST_TAIL, "filelevel", PS_DATA_STRING, NULL, object->filelevel)) { 4075 3793 psError(PS_ERR_UNKNOWN, false, "failed to add item filelevel"); … … 4082 3800 return false; 4083 3801 } 4084 if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {4085 psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");4086 psFree(md);4087 return false;4088 }4089 3802 if (!psMetadataAdd(md, PS_LIST_TAIL, "filter", PS_DATA_STRING, NULL, object->filter)) { 4090 3803 psError(PS_ERR_UNKNOWN, false, "failed to add item filter"); … … 4236 3949 return false; 4237 3950 } 3951 psS32 imfiles = psMetadataLookupS32(&status, md, "imfiles"); 3952 if (!status) { 3953 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item imfiles"); 3954 return false; 3955 } 4238 3956 char* filelevel = psMetadataLookupPtr(&status, md, "filelevel"); 4239 3957 if (!status) { … … 4246 3964 return false; 4247 3965 } 4248 char* reduction = psMetadataLookupPtr(&status, md, "reduction");4249 if (!status) {4250 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");4251 return false;4252 }4253 3966 char* filter = psMetadataLookupPtr(&status, md, "filter"); 4254 3967 if (!status) { … … 4357 4070 } 4358 4071 4359 return rawExpRowAlloc(exp_id, exp_name, camera, telescope, dateobs, exp_tag, exp_type, filelevel, workdir, reduction, filter, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, user_1, user_2, user_3, user_4, user_5, object, solang, fault);4072 return rawExpRowAlloc(exp_id, exp_name, camera, telescope, dateobs, exp_tag, exp_type, imfiles, filelevel, workdir, filter, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, user_1, user_2, user_3, user_4, user_5, object, solang, fault); 4360 4073 } 4361 4074 psArray *rawExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 5678 5391 static void chipRunRowFree(chipRunRow *object); 5679 5392 5680 chipRunRow *chipRunRowAlloc(psS64 chip_id, psS64 exp_id,const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb)5393 chipRunRow *chipRunRowAlloc(psS64 chip_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb) 5681 5394 { 5682 5395 chipRunRow *_object; … … 5686 5399 5687 5400 _object->chip_id = chip_id; 5688 _object->exp_id = exp_id;5689 5401 _object->state = psStringCopy(state); 5690 5402 _object->workdir = psStringCopy(workdir); … … 5717 5429 return false; 5718 5430 } 5719 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Key INDEX(chip_id, exp_id) fkey (exp_id) ref rawExp(exp_id)", 64)) { 5720 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 5721 psFree(md); 5722 return false; 5723 } 5724 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) { 5431 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "key", "64")) { 5725 5432 psError(PS_ERR_UNKNOWN, false, "failed to add item state"); 5726 5433 psFree(md); … … 5732 5439 return false; 5733 5440 } 5734 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, " Key", "64")) {5441 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, "key", "64")) { 5735 5442 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state"); 5736 5443 psFree(md); 5737 5444 return false; 5738 5445 } 5739 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, " Key", "64")) {5446 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "key", "64")) { 5740 5447 psError(PS_ERR_UNKNOWN, false, "failed to add item label"); 5741 5448 psFree(md); … … 5747 5454 return false; 5748 5455 } 5749 if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, " Key", "64")) {5456 if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, "key", "64")) { 5750 5457 psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup"); 5751 5458 psFree(md); … … 5770 5477 } 5771 5478 5772 bool chipRunInsert(psDB * dbh, psS64 chip_id, psS64 exp_id,const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb)5479 bool chipRunInsert(psDB * dbh, psS64 chip_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb) 5773 5480 { 5774 5481 psMetadata *md = psMetadataAlloc(); 5775 5482 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) { 5776 5483 psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id"); 5777 psFree(md);5778 return false;5779 }5780 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {5781 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");5782 5484 psFree(md); 5783 5485 return false; … … 5841 5543 bool chipRunInsertObject(psDB *dbh, chipRunRow *object) 5842 5544 { 5843 return chipRunInsert(dbh, object->chip_id, object-> exp_id, object->state, object->workdir, object->workdir_state, object->label, object->reduction, object->expgroup, object->dvodb);5545 return chipRunInsert(dbh, object->chip_id, object->state, object->workdir, object->workdir_state, object->label, object->reduction, object->expgroup, object->dvodb); 5844 5546 } 5845 5547 … … 5919 5621 return false; 5920 5622 } 5921 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {5922 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");5923 psFree(md);5924 return false;5925 }5926 5623 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) { 5927 5624 psError(PS_ERR_UNKNOWN, false, "failed to add item state"); … … 5973 5670 return false; 5974 5671 } 5975 psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");5976 if (!status) {5977 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");5978 return false;5979 }5980 5672 char* state = psMetadataLookupPtr(&status, md, "state"); 5981 5673 if (!status) { … … 6014 5706 } 6015 5707 6016 return chipRunRowAlloc(chip_id, exp_id,state, workdir, workdir_state, label, reduction, expgroup, dvodb);5708 return chipRunRowAlloc(chip_id, state, workdir, workdir_state, label, reduction, expgroup, dvodb); 6017 5709 } 6018 5710 psArray *chipRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 6114 5806 6115 5807 psMetadata *md = chipRunMetadataFromObject(object); 5808 5809 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 5810 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 5811 psFree(md); 5812 } 5813 5814 psFree(md); 5815 5816 return true; 5817 } 5818 static void chipInputImfileRowFree(chipInputImfileRow *object); 5819 5820 chipInputImfileRow *chipInputImfileRowAlloc(psS64 chip_id, psS64 exp_id, const char *class_id) 5821 { 5822 chipInputImfileRow *_object; 5823 5824 _object = psAlloc(sizeof(chipInputImfileRow)); 5825 psMemSetDeallocator(_object, (psFreeFunc)chipInputImfileRowFree); 5826 5827 _object->chip_id = chip_id; 5828 _object->exp_id = exp_id; 5829 _object->class_id = psStringCopy(class_id); 5830 5831 return _object; 5832 } 5833 5834 static void chipInputImfileRowFree(chipInputImfileRow *object) 5835 { 5836 psFree(object->class_id); 5837 } 5838 5839 bool chipInputImfileCreateTable(psDB *dbh) 5840 { 5841 psMetadata *md = psMetadataAlloc(); 5842 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey (chip_id) ref chipRun(chip_id)", 0)) { 5843 psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id"); 5844 psFree(md); 5845 return false; 5846 } 5847 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)) { 5848 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 5849 psFree(md); 5850 return false; 5851 } 5852 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key", "64")) { 5853 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 5854 psFree(md); 5855 return false; 5856 } 5857 5858 bool status = psDBCreateTable(dbh, CHIPINPUTIMFILE_TABLE_NAME, md); 5859 5860 psFree(md); 5861 5862 return status; 5863 } 5864 5865 bool chipInputImfileDropTable(psDB *dbh) 5866 { 5867 return psDBDropTable(dbh, CHIPINPUTIMFILE_TABLE_NAME); 5868 } 5869 5870 bool chipInputImfileInsert(psDB * dbh, psS64 chip_id, psS64 exp_id, const char *class_id) 5871 { 5872 psMetadata *md = psMetadataAlloc(); 5873 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) { 5874 psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id"); 5875 psFree(md); 5876 return false; 5877 } 5878 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) { 5879 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 5880 psFree(md); 5881 return false; 5882 } 5883 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) { 5884 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 5885 psFree(md); 5886 return false; 5887 } 5888 5889 bool status = psDBInsertOneRow(dbh, CHIPINPUTIMFILE_TABLE_NAME, md); 5890 psFree(md); 5891 5892 return status; 5893 } 5894 5895 long long chipInputImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 5896 { 5897 long long deleted = 0; 5898 5899 long long count = psDBDeleteRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit); 5900 if (count < 0) { 5901 psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipInputImfile"); 5902 return count; 5903 5904 deleted += count; 5905 } 5906 5907 return deleted; 5908 } 5909 bool chipInputImfileInsertObject(psDB *dbh, chipInputImfileRow *object) 5910 { 5911 return chipInputImfileInsert(dbh, object->chip_id, object->exp_id, object->class_id); 5912 } 5913 5914 bool chipInputImfileInsertObjects(psDB *dbh, psArray *objects) 5915 { 5916 for (long i = 0; i < psArrayLength(objects); i++) { 5917 if (!chipInputImfileInsertObject(dbh, objects->data[i])) { 5918 return false; 5919 } 5920 } 5921 5922 return true; 5923 } 5924 5925 bool chipInputImfileInsertFits(psDB *dbh, const psFits *fits) 5926 { 5927 psArray *rowSet; 5928 5929 // move to (the first?) extension named CHIPINPUTIMFILE_TABLE_NAME 5930 if (!psFitsMoveExtName(fits, CHIPINPUTIMFILE_TABLE_NAME)) { 5931 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPINPUTIMFILE_TABLE_NAME); 5932 return false; 5933 } 5934 5935 // check HDU type 5936 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 5937 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 5938 return false; 5939 } 5940 5941 // read fits table 5942 rowSet = psFitsReadTable(fits); 5943 if (!rowSet) { 5944 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 5945 psFree(rowSet); 5946 return false; 5947 } 5948 5949 if (!psDBInsertRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, rowSet)) { 5950 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 5951 psFree(rowSet); 5952 return false; 5953 } 5954 5955 psFree(rowSet); 5956 5957 return true; 5958 } 5959 5960 bool chipInputImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 5961 { 5962 psArray *rowSet; 5963 5964 rowSet = psDBSelectRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit); 5965 if (!rowSet) { 5966 return false; 5967 } 5968 5969 // output to fits 5970 if (!psFitsWriteTable(fits, NULL, rowSet, CHIPINPUTIMFILE_TABLE_NAME)) { 5971 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 5972 psFree(rowSet); 5973 return false; 5974 } 5975 5976 psFree(rowSet); 5977 5978 return true; 5979 } 5980 5981 psMetadata *chipInputImfileMetadataFromObject(const chipInputImfileRow *object) 5982 { 5983 psMetadata *md = psMetadataAlloc(); 5984 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, object->chip_id)) { 5985 psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id"); 5986 psFree(md); 5987 return false; 5988 } 5989 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) { 5990 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 5991 psFree(md); 5992 return false; 5993 } 5994 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, object->class_id)) { 5995 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 5996 psFree(md); 5997 return false; 5998 } 5999 6000 6001 return md; 6002 } 6003 6004 chipInputImfileRow *chipInputImfileObjectFromMetadata(psMetadata *md) 6005 { 6006 6007 bool status = false; 6008 psS64 chip_id = psMetadataLookupS64(&status, md, "chip_id"); 6009 if (!status) { 6010 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item chip_id"); 6011 return false; 6012 } 6013 psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id"); 6014 if (!status) { 6015 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id"); 6016 return false; 6017 } 6018 char* class_id = psMetadataLookupPtr(&status, md, "class_id"); 6019 if (!status) { 6020 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id"); 6021 return false; 6022 } 6023 6024 return chipInputImfileRowAlloc(chip_id, exp_id, class_id); 6025 } 6026 psArray *chipInputImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 6027 { 6028 psArray *rowSet; 6029 psArray *returnSet; 6030 psU64 i; 6031 6032 rowSet = psDBSelectRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit); 6033 if (!rowSet) { 6034 return NULL; 6035 } 6036 6037 // convert psMetadata rows to row objects 6038 6039 returnSet = psArrayAllocEmpty(rowSet->n); 6040 6041 for (i = 0; i < rowSet->n; i++) { 6042 chipInputImfileRow *object = chipInputImfileObjectFromMetadata(rowSet->data[i]); 6043 psArrayAdd(returnSet, 0, object); 6044 psFree(object); 6045 } 6046 6047 psFree(rowSet); 6048 6049 return returnSet; 6050 } 6051 bool chipInputImfileDeleteObject(psDB *dbh, const chipInputImfileRow *object) 6052 { 6053 psMetadata *where = chipInputImfileMetadataFromObject(object); 6054 long long count = psDBDeleteRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, 0); 6055 psFree(where); 6056 if (count < 0) { 6057 psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipInputImfile"); 6058 return false; 6059 } 6060 if (count > 1) { 6061 // XXX should this be a psAbort() instead? It is possible that 6062 // having an object match multiple rows was by design. 6063 psError(PS_ERR_UNKNOWN, true, "chipInputImfileRow object matched more then one row. Check your database schema"); 6064 return false; 6065 } 6066 6067 return true; 6068 } 6069 long long chipInputImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 6070 { 6071 long long deleted = 0; 6072 6073 for (long long i = 0; i < objects->n; i++) { 6074 chipInputImfileRow *object = objects->data[i]; 6075 psMetadata *where = chipInputImfileMetadataFromObject(object); 6076 long long count = psDBDeleteRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit); 6077 psFree(where); 6078 if (count < 0) { 6079 psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipInputImfile"); 6080 return count; 6081 } 6082 6083 deleted += count; 6084 } 6085 6086 return deleted; 6087 } 6088 bool chipInputImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf) 6089 { 6090 PS_ASSERT_PTR_NON_NULL(objects, false); 6091 6092 psMetadata *output = psMetadataAlloc(); 6093 for (long i = 0; i < psArrayLength(objects); i++) { 6094 psMetadata *md = chipInputImfileMetadataFromObject(objects->data[i]); 6095 if (!psMetadataAddMetadata( 6096 output, 6097 PS_LIST_TAIL, 6098 CHIPINPUTIMFILE_TABLE_NAME, 6099 PS_META_DUPLICATE_OK, 6100 NULL, 6101 md 6102 )) { 6103 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 6104 psFree(md); 6105 psFree(output); 6106 return false; 6107 } 6108 psFree(md); 6109 } 6110 6111 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 6112 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 6113 psFree(output); 6114 } 6115 psFree(output); 6116 6117 return true; 6118 } 6119 bool chipInputImfilePrintObject(FILE *stream, chipInputImfileRow *object, bool mdcf) 6120 { 6121 PS_ASSERT_PTR_NON_NULL(object, false); 6122 6123 psMetadata *md = chipInputImfileMetadataFromObject(object); 6116 6124 6117 6125 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { … … 6171 6179 { 6172 6180 psMetadata *md = psMetadataAlloc(); 6173 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey (chip_id, exp_id ) ref chipRun(chip_id, exp_id)", 0)) {6181 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey (chip_id, exp_id, class_id) ref chipInputImfile(chip_id, exp_id, class_id)", 0)) { 6174 6182 psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id"); 6175 6183 psFree(md); 6176 6184 return false; 6177 6185 } 6178 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)) {6186 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) { 6179 6187 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 6180 6188 psFree(md); … … 6251 6259 return false; 6252 6260 } 6253 if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm", PS_DATA_F32, "# replace this with fwhm_major", 0.0)) {6261 if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm", PS_DATA_F32, NULL, 0.0)) { 6254 6262 psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm"); 6255 6263 psFree(md); 6256 6264 return false; 6257 6265 } 6258 if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_range", PS_DATA_F32, "# replace this with fwhm_minor", 0.0)) {6266 if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_range", PS_DATA_F32, NULL, 0.0)) { 6259 6267 psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm_range"); 6260 6268 psFree(md); … … 7198 7206 return false; 7199 7207 } 7200 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, " Key INDEX(cam_id, chip_id)fkey(chip_id) ref chipRun(chip_id)", 0)) {7208 if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) { 7201 7209 psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id"); 7202 7210 psFree(md); … … 9592 9600 static void warpSkyfileRowFree(warpSkyfileRow *object); 9593 9601 9594 warpSkyfileRow *warpSkyfileRowAlloc(psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev , psF64 pixel_fill, psS16 fault)9602 warpSkyfileRow *warpSkyfileRowAlloc(psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev) 9595 9603 { 9596 9604 warpSkyfileRow *_object; … … 9606 9614 _object->bg = bg; 9607 9615 _object->bg_stdev = bg_stdev; 9608 _object->pixel_fill = pixel_fill;9609 _object->fault = fault;9610 9616 9611 9617 return _object; … … 9658 9664 return false; 9659 9665 } 9660 if (!psMetadataAdd(md, PS_LIST_TAIL, "pixel_fill", PS_DATA_F64, "Key", 0.0)) {9661 psError(PS_ERR_UNKNOWN, false, "failed to add item pixel_fill");9662 psFree(md);9663 return false;9664 }9665 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key", 0)) {9666 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");9667 psFree(md);9668 return false;9669 }9670 9666 9671 9667 bool status = psDBCreateTable(dbh, WARPSKYFILE_TABLE_NAME, md); … … 9681 9677 } 9682 9678 9683 bool warpSkyfileInsert(psDB * dbh, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev , psF64 pixel_fill, psS16 fault)9679 bool warpSkyfileInsert(psDB * dbh, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev) 9684 9680 { 9685 9681 psMetadata *md = psMetadataAlloc(); … … 9716 9712 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_stdev", PS_DATA_F64, NULL, bg_stdev)) { 9717 9713 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev"); 9718 psFree(md);9719 return false;9720 }9721 if (!psMetadataAdd(md, PS_LIST_TAIL, "pixel_fill", PS_DATA_F64, NULL, pixel_fill)) {9722 psError(PS_ERR_UNKNOWN, false, "failed to add item pixel_fill");9723 psFree(md);9724 return false;9725 }9726 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {9727 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");9728 9714 psFree(md); 9729 9715 return false; … … 9752 9738 bool warpSkyfileInsertObject(psDB *dbh, warpSkyfileRow *object) 9753 9739 { 9754 return warpSkyfileInsert(dbh, object->warp_id, object->skycell_id, object->tess_id, object->uri, object->path_base, object->bg, object->bg_stdev , object->pixel_fill, object->fault);9740 return warpSkyfileInsert(dbh, object->warp_id, object->skycell_id, object->tess_id, object->uri, object->path_base, object->bg, object->bg_stdev); 9755 9741 } 9756 9742 … … 9860 9846 return false; 9861 9847 } 9862 if (!psMetadataAdd(md, PS_LIST_TAIL, "pixel_fill", PS_DATA_F64, NULL, object->pixel_fill)) {9863 psError(PS_ERR_UNKNOWN, false, "failed to add item pixel_fill");9864 psFree(md);9865 return false;9866 }9867 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {9868 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");9869 psFree(md);9870 return false;9871 }9872 9848 9873 9849 … … 9914 9890 return false; 9915 9891 } 9916 psF64 pixel_fill = psMetadataLookupF64(&status, md, "pixel_fill"); 9917 if (!status) { 9918 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item pixel_fill"); 9919 return false; 9920 } 9921 psS16 fault = psMetadataLookupS16(&status, md, "fault"); 9922 if (!status) { 9923 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault"); 9924 return false; 9925 } 9926 9927 return warpSkyfileRowAlloc(warp_id, skycell_id, tess_id, uri, path_base, bg, bg_stdev, pixel_fill, fault); 9892 9893 return warpSkyfileRowAlloc(warp_id, skycell_id, tess_id, uri, path_base, bg, bg_stdev); 9928 9894 } 9929 9895 psArray *warpSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 10442 10408 static void diffInputSkyfileRowFree(diffInputSkyfileRow *object); 10443 10409 10444 diffInputSkyfileRow *diffInputSkyfileRowAlloc(psS64 diff_id, bool template, psS64 stack_id, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *kind)10410 diffInputSkyfileRow *diffInputSkyfileRowAlloc(psS64 diff_id, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *kind, bool template) 10445 10411 { 10446 10412 diffInputSkyfileRow *_object; … … 10450 10416 10451 10417 _object->diff_id = diff_id; 10452 _object->template = template;10453 _object->stack_id = stack_id;10454 10418 _object->warp_id = warp_id; 10455 10419 _object->skycell_id = psStringCopy(skycell_id); 10456 10420 _object->tess_id = psStringCopy(tess_id); 10457 10421 _object->kind = psStringCopy(kind); 10422 _object->template = template; 10458 10423 10459 10424 return _object; … … 10475 10440 return false; 10476 10441 } 10477 if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, "Primary Key", 0)) { 10478 psError(PS_ERR_UNKNOWN, false, "failed to add item template"); 10479 psFree(md); 10480 return false; 10481 } 10482 if (!psMetadataAdd(md, PS_LIST_TAIL, "stack_id", PS_DATA_S64, "fkey(stack_id) ref stackSumSkyfile(stack_id)", 0)) { 10483 psError(PS_ERR_UNKNOWN, false, "failed to add item stack_id"); 10484 psFree(md); 10485 return false; 10486 } 10487 if (!psMetadataAdd(md, PS_LIST_TAIL, "warp_id", PS_DATA_S64, "fkey(warp_id, skycell_id, tess_id) ref warpSkyfile(warp_id, skycell_id, tess_id)", 0)) { 10442 if (!psMetadataAdd(md, PS_LIST_TAIL, "warp_id", PS_DATA_S64, "Primary Key fkey(warp_id, skycell_id, tess_id) ref warpSkyfile(warp_id, skycell_id, tess_id)", 0)) { 10488 10443 psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id"); 10489 10444 psFree(md); 10490 10445 return false; 10491 10446 } 10492 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, " Key", "64")) {10447 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, "Primary Key", "64")) { 10493 10448 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 10494 10449 psFree(md); 10495 10450 return false; 10496 10451 } 10497 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, " Key", "64")) {10452 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, "Primary Key", "64")) { 10498 10453 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 10499 10454 psFree(md); … … 10505 10460 return false; 10506 10461 } 10462 if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, 0)) { 10463 psError(PS_ERR_UNKNOWN, false, "failed to add item template"); 10464 psFree(md); 10465 return false; 10466 } 10507 10467 10508 10468 bool status = psDBCreateTable(dbh, DIFFINPUTSKYFILE_TABLE_NAME, md); … … 10518 10478 } 10519 10479 10520 bool diffInputSkyfileInsert(psDB * dbh, psS64 diff_id, bool template, psS64 stack_id, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *kind)10480 bool diffInputSkyfileInsert(psDB * dbh, psS64 diff_id, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *kind, bool template) 10521 10481 { 10522 10482 psMetadata *md = psMetadataAlloc(); … … 10526 10486 return false; 10527 10487 } 10488 if (!psMetadataAdd(md, PS_LIST_TAIL, "warp_id", PS_DATA_S64, NULL, warp_id)) { 10489 psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id"); 10490 psFree(md); 10491 return false; 10492 } 10493 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) { 10494 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 10495 psFree(md); 10496 return false; 10497 } 10498 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) { 10499 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 10500 psFree(md); 10501 return false; 10502 } 10503 if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, kind)) { 10504 psError(PS_ERR_UNKNOWN, false, "failed to add item kind"); 10505 psFree(md); 10506 return false; 10507 } 10528 10508 if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, template)) { 10529 10509 psError(PS_ERR_UNKNOWN, false, "failed to add item template"); 10530 psFree(md);10531 return false;10532 }10533 if (!psMetadataAdd(md, PS_LIST_TAIL, "stack_id", PS_DATA_S64, NULL, stack_id)) {10534 psError(PS_ERR_UNKNOWN, false, "failed to add item stack_id");10535 psFree(md);10536 return false;10537 }10538 if (!psMetadataAdd(md, PS_LIST_TAIL, "warp_id", PS_DATA_S64, NULL, warp_id)) {10539 psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");10540 psFree(md);10541 return false;10542 }10543 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) {10544 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");10545 psFree(md);10546 return false;10547 }10548 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) {10549 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");10550 psFree(md);10551 return false;10552 }10553 if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, kind)) {10554 psError(PS_ERR_UNKNOWN, false, "failed to add item kind");10555 10510 psFree(md); 10556 10511 return false; … … 10579 10534 bool diffInputSkyfileInsertObject(psDB *dbh, diffInputSkyfileRow *object) 10580 10535 { 10581 return diffInputSkyfileInsert(dbh, object->diff_id, object-> template, object->stack_id, object->warp_id, object->skycell_id, object->tess_id, object->kind);10536 return diffInputSkyfileInsert(dbh, object->diff_id, object->warp_id, object->skycell_id, object->tess_id, object->kind, object->template); 10582 10537 } 10583 10538 … … 10657 10612 return false; 10658 10613 } 10614 if (!psMetadataAdd(md, PS_LIST_TAIL, "warp_id", PS_DATA_S64, NULL, object->warp_id)) { 10615 psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id"); 10616 psFree(md); 10617 return false; 10618 } 10619 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) { 10620 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 10621 psFree(md); 10622 return false; 10623 } 10624 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) { 10625 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 10626 psFree(md); 10627 return false; 10628 } 10629 if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, object->kind)) { 10630 psError(PS_ERR_UNKNOWN, false, "failed to add item kind"); 10631 psFree(md); 10632 return false; 10633 } 10659 10634 if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, object->template)) { 10660 10635 psError(PS_ERR_UNKNOWN, false, "failed to add item template"); … … 10662 10637 return false; 10663 10638 } 10664 if (!psMetadataAdd(md, PS_LIST_TAIL, "stack_id", PS_DATA_S64, NULL, object->stack_id)) {10665 psError(PS_ERR_UNKNOWN, false, "failed to add item stack_id");10666 psFree(md);10667 return false;10668 }10669 if (!psMetadataAdd(md, PS_LIST_TAIL, "warp_id", PS_DATA_S64, NULL, object->warp_id)) {10670 psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");10671 psFree(md);10672 return false;10673 }10674 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) {10675 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");10676 psFree(md);10677 return false;10678 }10679 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) {10680 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");10681 psFree(md);10682 return false;10683 }10684 if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, object->kind)) {10685 psError(PS_ERR_UNKNOWN, false, "failed to add item kind");10686 psFree(md);10687 return false;10688 }10689 10639 10690 10640 … … 10701 10651 return false; 10702 10652 } 10653 psS64 warp_id = psMetadataLookupS64(&status, md, "warp_id"); 10654 if (!status) { 10655 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item warp_id"); 10656 return false; 10657 } 10658 char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id"); 10659 if (!status) { 10660 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id"); 10661 return false; 10662 } 10663 char* tess_id = psMetadataLookupPtr(&status, md, "tess_id"); 10664 if (!status) { 10665 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id"); 10666 return false; 10667 } 10668 char* kind = psMetadataLookupPtr(&status, md, "kind"); 10669 if (!status) { 10670 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kind"); 10671 return false; 10672 } 10703 10673 bool template = psMetadataLookupBool(&status, md, "template"); 10704 10674 if (!status) { … … 10706 10676 return false; 10707 10677 } 10708 psS64 stack_id = psMetadataLookupS64(&status, md, "stack_id"); 10709 if (!status) { 10710 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stack_id"); 10711 return false; 10712 } 10713 psS64 warp_id = psMetadataLookupS64(&status, md, "warp_id"); 10714 if (!status) { 10715 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item warp_id"); 10716 return false; 10717 } 10718 char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id"); 10719 if (!status) { 10720 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id"); 10721 return false; 10722 } 10723 char* tess_id = psMetadataLookupPtr(&status, md, "tess_id"); 10724 if (!status) { 10725 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id"); 10726 return false; 10727 } 10728 char* kind = psMetadataLookupPtr(&status, md, "kind"); 10729 if (!status) { 10730 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kind"); 10731 return false; 10732 } 10733 10734 return diffInputSkyfileRowAlloc(diff_id, template, stack_id, warp_id, skycell_id, tess_id, kind); 10678 10679 return diffInputSkyfileRowAlloc(diff_id, warp_id, skycell_id, tess_id, kind, template); 10735 10680 } 10736 10681 psArray *diffInputSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 10844 10789 static void diffSkyfileRowFree(diffSkyfileRow *object); 10845 10790 10846 diffSkyfileRow *diffSkyfileRowAlloc(psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev , psS16 fault)10791 diffSkyfileRow *diffSkyfileRowAlloc(psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev) 10847 10792 { 10848 10793 diffSkyfileRow *_object; … … 10856 10801 _object->bg = bg; 10857 10802 _object->bg_stdev = bg_stdev; 10858 _object->fault = fault;10859 10803 10860 10804 return _object; … … 10895 10839 return false; 10896 10840 } 10897 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key", 0)) {10898 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");10899 psFree(md);10900 return false;10901 }10902 10841 10903 10842 bool status = psDBCreateTable(dbh, DIFFSKYFILE_TABLE_NAME, md); … … 10913 10852 } 10914 10853 10915 bool diffSkyfileInsert(psDB * dbh, psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev , psS16 fault)10854 bool diffSkyfileInsert(psDB * dbh, psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev) 10916 10855 { 10917 10856 psMetadata *md = psMetadataAlloc(); … … 10938 10877 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_stdev", PS_DATA_F64, NULL, bg_stdev)) { 10939 10878 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev"); 10940 psFree(md);10941 return false;10942 }10943 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {10944 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");10945 10879 psFree(md); 10946 10880 return false; … … 10969 10903 bool diffSkyfileInsertObject(psDB *dbh, diffSkyfileRow *object) 10970 10904 { 10971 return diffSkyfileInsert(dbh, object->diff_id, object->uri, object->path_base, object->bg, object->bg_stdev , object->fault);10905 return diffSkyfileInsert(dbh, object->diff_id, object->uri, object->path_base, object->bg, object->bg_stdev); 10972 10906 } 10973 10907 … … 11067 11001 return false; 11068 11002 } 11069 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {11070 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");11071 psFree(md);11072 return false;11073 }11074 11003 11075 11004 … … 11106 11035 return false; 11107 11036 } 11108 psS16 fault = psMetadataLookupS16(&status, md, "fault"); 11109 if (!status) { 11110 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault"); 11111 return false; 11112 } 11113 11114 return diffSkyfileRowAlloc(diff_id, uri, path_base, bg, bg_stdev, fault); 11037 11038 return diffSkyfileRowAlloc(diff_id, uri, path_base, bg, bg_stdev); 11115 11039 } 11116 11040 psArray *diffSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 11923 11847 static void stackSumSkyfileRowFree(stackSumSkyfileRow *object); 11924 11848 11925 stackSumSkyfileRow *stackSumSkyfileRowAlloc(psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev , psS16 fault)11849 stackSumSkyfileRow *stackSumSkyfileRowAlloc(psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev) 11926 11850 { 11927 11851 stackSumSkyfileRow *_object; … … 11935 11859 _object->bg = bg; 11936 11860 _object->bg_stdev = bg_stdev; 11937 _object->fault = fault;11938 11861 11939 11862 return _object; … … 11974 11897 return false; 11975 11898 } 11976 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key", 0)) {11977 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");11978 psFree(md);11979 return false;11980 }11981 11899 11982 11900 bool status = psDBCreateTable(dbh, STACKSUMSKYFILE_TABLE_NAME, md); … … 11992 11910 } 11993 11911 11994 bool stackSumSkyfileInsert(psDB * dbh, psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev , psS16 fault)11912 bool stackSumSkyfileInsert(psDB * dbh, psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev) 11995 11913 { 11996 11914 psMetadata *md = psMetadataAlloc(); … … 12017 11935 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_stdev", PS_DATA_F64, NULL, bg_stdev)) { 12018 11936 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev"); 12019 psFree(md);12020 return false;12021 }12022 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {12023 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");12024 11937 psFree(md); 12025 11938 return false; … … 12048 11961 bool stackSumSkyfileInsertObject(psDB *dbh, stackSumSkyfileRow *object) 12049 11962 { 12050 return stackSumSkyfileInsert(dbh, object->stack_id, object->uri, object->path_base, object->bg, object->bg_stdev , object->fault);11963 return stackSumSkyfileInsert(dbh, object->stack_id, object->uri, object->path_base, object->bg, object->bg_stdev); 12051 11964 } 12052 11965 … … 12146 12059 return false; 12147 12060 } 12148 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {12149 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");12150 psFree(md);12151 return false;12152 }12153 12061 12154 12062 … … 12185 12093 return false; 12186 12094 } 12187 psS16 fault = psMetadataLookupS16(&status, md, "fault"); 12188 if (!status) { 12189 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault"); 12190 return false; 12191 } 12192 12193 return stackSumSkyfileRowAlloc(stack_id, uri, path_base, bg, bg_stdev, fault); 12095 12096 return stackSumSkyfileRowAlloc(stack_id, uri, path_base, bg, bg_stdev); 12194 12097 } 12195 12098 psArray *stackSumSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 12371 12274 return false; 12372 12275 } 12373 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Key INDEX(det_id, iteration)", 0)) {12276 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Key", 0)) { 12374 12277 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 12375 12278 psFree(md); … … 13202 13105 { 13203 13106 psMetadata *md = psMetadataAlloc(); 13204 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id) ref detRun(det_id)", 0)) {13107 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 13205 13108 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 13206 13109 psFree(md); 13207 13110 return false; 13208 13111 } 13209 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(exp_id) ref rawExp(exp_id)", 0)) {13112 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 13210 13113 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 13211 13114 psFree(md); 13212 13115 return false; 13213 13116 } 13214 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key INDEX(det_id, exp_id)", 64)) {13117 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) { 13215 13118 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 13216 13119 psFree(md); 13217 13120 return false; 13218 13121 } 13219 if (!psMetadataAdd(md, PS_LIST_TAIL, "include", PS_DATA_BOOL, "INDEX(det_id, iteration)", 0)) {13122 if (!psMetadataAdd(md, PS_LIST_TAIL, "include", PS_DATA_BOOL, NULL, 0)) { 13220 13123 psError(PS_ERR_UNKNOWN, false, "failed to add item include"); 13221 13124 psFree(md); … … 13556 13459 { 13557 13460 psMetadata *md = psMetadataAlloc(); 13558 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)) {13461 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 13559 13462 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 13560 13463 psFree(md); 13561 13464 return false; 13562 13465 } 13563 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)) {13466 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) { 13564 13467 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 13565 13468 psFree(md); 13566 13469 return false; 13567 13470 } 13568 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key INDEX(det_id, class_id)", "64")) {13471 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key", "64")) { 13569 13472 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 13570 13473 psFree(md); 13571 13474 return false; 13572 13475 } 13573 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, "INDEX(det_id, exp_id)", "255")) {13476 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) { 13574 13477 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 13575 13478 psFree(md); … … 14186 14089 { 14187 14090 psMetadata *md = psMetadataAlloc(); 14188 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)) {14091 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 14189 14092 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 14190 14093 psFree(md); 14191 14094 return false; 14192 14095 } 14193 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(det_id, exp_id) ref detProcessedImfile(det_id, exp_id)", 64)) {14096 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) { 14194 14097 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 14195 14098 psFree(md); … … 14775 14678 { 14776 14679 psMetadata *md = psMetadataAlloc(); 14777 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detInputExp(det_id, iteration)", 0)) {14680 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 14778 14681 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 14779 14682 psFree(md); 14780 14683 return false; 14781 14684 } 14782 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(det_id, class_id) ref detProcessedImfile(det_id, class_id)", 0)) {14685 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 14783 14686 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 14784 14687 psFree(md); … … 15313 15216 { 15314 15217 psMetadata *md = psMetadataAlloc(); 15315 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detInputExp(det_id, iteration)", 0)) {15218 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 15316 15219 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 15317 15220 psFree(md); 15318 15221 return false; 15319 15222 } 15320 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(det_id, iteration, class_id) ref detStackedImfile(det_id, iteration, class_id)", 0)) {15223 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 15321 15224 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 15322 15225 psFree(md); … … 15682 15585 { 15683 15586 psMetadata *md = psMetadataAlloc(); 15684 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id) ref detInputExp(det_id)", 0)) {15587 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 15685 15588 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 15686 15589 psFree(md); 15687 15590 return false; 15688 15591 } 15689 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(det_id, iteration, class_id) ref detNormalizedStatImfile(det_id, iteration, class_id)", 0)) {15592 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 15690 15593 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 15691 15594 psFree(md); 15692 15595 return false; 15693 15596 } 15694 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key INDEX(det_id, iteration)", "64")) {15597 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key", "64")) { 15695 15598 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 15696 15599 psFree(md); … … 16229 16132 { 16230 16133 psMetadata *md = psMetadataAlloc(); 16231 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detInputExp(det_id, iteration)", 0)) {16134 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 16232 16135 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 16233 16136 psFree(md); 16234 16137 return false; 16235 16138 } 16236 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(det_id, iteration) ref detNormalizedImfile(det_id, iteration)", 0)) {16139 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 16237 16140 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 16238 16141 psFree(md); … … 16723 16626 static void detResidImfileRowFree(detResidImfileRow *object); 16724 16627 16725 detResidImfileRow *detResidImfileRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 b g_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)16628 detResidImfileRow *detResidImfileRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault) 16726 16629 { 16727 16630 detResidImfileRow *_object; … … 16739 16642 _object->bg_stdev = bg_stdev; 16740 16643 _object->bg_mean_stdev = bg_mean_stdev; 16741 _object->bg_skewness = bg_skewness;16742 _object->bg_kurtosis = bg_kurtosis;16743 16644 _object->bin_stdev = bin_stdev; 16744 16645 _object->fringe_0 = fringe_0; 16745 16646 _object->fringe_1 = fringe_1; 16746 16647 _object->fringe_2 = fringe_2; 16747 _object->fringe_resid_0 = fringe_resid_0;16748 _object->fringe_resid_1 = fringe_resid_1;16749 _object->fringe_resid_2 = fringe_resid_2;16750 16648 _object->user_1 = user_1; 16751 16649 _object->user_2 = user_2; … … 16770 16668 { 16771 16669 psMetadata *md = psMetadataAlloc(); 16772 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration, exp_id) ref detInputExp(det_id, iteration, exp_id)", 0)) {16670 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 16773 16671 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 16774 16672 psFree(md); 16775 16673 return false; 16776 16674 } 16777 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(det_id, exp_id, class_id) ref detProcessedImfile(det_id, exp_id, class_id)", 0)) {16675 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 16778 16676 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 16779 16677 psFree(md); 16780 16678 return false; 16781 16679 } 16782 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detNormalizedExp(det_id, iteration)", 64)) {16680 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) { 16783 16681 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 16784 16682 psFree(md); 16785 16683 return false; 16786 16684 } 16787 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key INDEX(det_id, iteration, exp_id)", "64")) {16685 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key", "64")) { 16788 16686 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id"); 16789 16687 psFree(md); … … 16815 16713 return false; 16816 16714 } 16817 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_skewness", PS_DATA_F64, NULL, 0.0)) {16818 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_skewness");16819 psFree(md);16820 return false;16821 }16822 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_kurtosis", PS_DATA_F64, NULL, 0.0)) {16823 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_kurtosis");16824 psFree(md);16825 return false;16826 }16827 16715 if (!psMetadataAdd(md, PS_LIST_TAIL, "bin_stdev", PS_DATA_F64, NULL, 0.0)) { 16828 16716 psError(PS_ERR_UNKNOWN, false, "failed to add item bin_stdev"); … … 16845 16733 return false; 16846 16734 } 16847 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_0", PS_DATA_F64, NULL, 0.0)) {16848 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_0");16849 psFree(md);16850 return false;16851 }16852 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_1", PS_DATA_F64, NULL, 0.0)) {16853 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_1");16854 psFree(md);16855 return false;16856 }16857 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_2", PS_DATA_F64, NULL, 0.0)) {16858 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_2");16859 psFree(md);16860 return false;16861 }16862 16735 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_1", PS_DATA_F64, NULL, 0.0)) { 16863 16736 psError(PS_ERR_UNKNOWN, false, "failed to add item user_1"); … … 16908 16781 } 16909 16782 16910 bool detResidImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 b g_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)16783 bool detResidImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault) 16911 16784 { 16912 16785 psMetadata *md = psMetadataAlloc(); … … 16956 16829 return false; 16957 16830 } 16958 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_skewness", PS_DATA_F64, NULL, bg_skewness)) {16959 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_skewness");16960 psFree(md);16961 return false;16962 }16963 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_kurtosis", PS_DATA_F64, NULL, bg_kurtosis)) {16964 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_kurtosis");16965 psFree(md);16966 return false;16967 }16968 16831 if (!psMetadataAdd(md, PS_LIST_TAIL, "bin_stdev", PS_DATA_F64, NULL, bin_stdev)) { 16969 16832 psError(PS_ERR_UNKNOWN, false, "failed to add item bin_stdev"); … … 16983 16846 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_2", PS_DATA_F64, NULL, fringe_2)) { 16984 16847 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_2"); 16985 psFree(md);16986 return false;16987 }16988 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_0", PS_DATA_F64, NULL, fringe_resid_0)) {16989 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_0");16990 psFree(md);16991 return false;16992 }16993 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_1", PS_DATA_F64, NULL, fringe_resid_1)) {16994 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_1");16995 psFree(md);16996 return false;16997 }16998 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_2", PS_DATA_F64, NULL, fringe_resid_2)) {16999 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_2");17000 16848 psFree(md); 17001 16849 return false; … … 17059 16907 bool detResidImfileInsertObject(psDB *dbh, detResidImfileRow *object) 17060 16908 { 17061 return detResidImfileInsert(dbh, object->det_id, object->iteration, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->b g_skewness, object->bg_kurtosis, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->fringe_resid_0, object->fringe_resid_1, object->fringe_resid_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);16909 return detResidImfileInsert(dbh, object->det_id, object->iteration, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault); 17062 16910 } 17063 16911 … … 17177 17025 return false; 17178 17026 } 17179 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_skewness", PS_DATA_F64, NULL, object->bg_skewness)) {17180 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_skewness");17181 psFree(md);17182 return false;17183 }17184 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_kurtosis", PS_DATA_F64, NULL, object->bg_kurtosis)) {17185 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_kurtosis");17186 psFree(md);17187 return false;17188 }17189 17027 if (!psMetadataAdd(md, PS_LIST_TAIL, "bin_stdev", PS_DATA_F64, NULL, object->bin_stdev)) { 17190 17028 psError(PS_ERR_UNKNOWN, false, "failed to add item bin_stdev"); … … 17207 17045 return false; 17208 17046 } 17209 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_0", PS_DATA_F64, NULL, object->fringe_resid_0)) {17210 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_0");17211 psFree(md);17212 return false;17213 }17214 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_1", PS_DATA_F64, NULL, object->fringe_resid_1)) {17215 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_1");17216 psFree(md);17217 return false;17218 }17219 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_2", PS_DATA_F64, NULL, object->fringe_resid_2)) {17220 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_2");17221 psFree(md);17222 return false;17223 }17224 17047 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_1", PS_DATA_F64, NULL, object->user_1)) { 17225 17048 psError(PS_ERR_UNKNOWN, false, "failed to add item user_1"); … … 17311 17134 return false; 17312 17135 } 17313 psF64 bg_skewness = psMetadataLookupF64(&status, md, "bg_skewness");17314 if (!status) {17315 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_skewness");17316 return false;17317 }17318 psF64 bg_kurtosis = psMetadataLookupF64(&status, md, "bg_kurtosis");17319 if (!status) {17320 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_kurtosis");17321 return false;17322 }17323 17136 psF64 bin_stdev = psMetadataLookupF64(&status, md, "bin_stdev"); 17324 17137 if (!status) { … … 17341 17154 return false; 17342 17155 } 17343 psF64 fringe_resid_0 = psMetadataLookupF64(&status, md, "fringe_resid_0");17344 if (!status) {17345 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fringe_resid_0");17346 return false;17347 }17348 psF64 fringe_resid_1 = psMetadataLookupF64(&status, md, "fringe_resid_1");17349 if (!status) {17350 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fringe_resid_1");17351 return false;17352 }17353 psF64 fringe_resid_2 = psMetadataLookupF64(&status, md, "fringe_resid_2");17354 if (!status) {17355 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fringe_resid_2");17356 return false;17357 }17358 17156 psF64 user_1 = psMetadataLookupF64(&status, md, "user_1"); 17359 17157 if (!status) { … … 17392 17190 } 17393 17191 17394 return detResidImfileRowAlloc(det_id, iteration, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, b g_skewness, bg_kurtosis, bin_stdev, fringe_0, fringe_1, fringe_2, fringe_resid_0, fringe_resid_1, fringe_resid_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);17192 return detResidImfileRowAlloc(det_id, iteration, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, bin_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault); 17395 17193 } 17396 17194 psArray *detResidImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 17504 17302 static void detResidExpRowFree(detResidExpRow *object); 17505 17303 17506 detResidExpRow *detResidExpRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 b g_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)17304 detResidExpRow *detResidExpRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault) 17507 17305 { 17508 17306 detResidExpRow *_object; … … 17518 17316 _object->bg_stdev = bg_stdev; 17519 17317 _object->bg_mean_stdev = bg_mean_stdev; 17520 _object->bg_skewness = bg_skewness;17521 _object->bg_kurtosis = bg_kurtosis;17522 17318 _object->bin_stdev = bin_stdev; 17523 17319 _object->fringe_0 = fringe_0; 17524 17320 _object->fringe_1 = fringe_1; 17525 17321 _object->fringe_2 = fringe_2; 17526 _object->fringe_resid_0 = fringe_resid_0;17527 _object->fringe_resid_1 = fringe_resid_1;17528 _object->fringe_resid_2 = fringe_resid_2;17529 17322 _object->user_1 = user_1; 17530 17323 _object->user_2 = user_2; … … 17548 17341 { 17549 17342 psMetadata *md = psMetadataAlloc(); 17550 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration, exp_id) ref detInputExp(det_id, iteration, exp_id)", 0)) {17343 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 17551 17344 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 17552 17345 psFree(md); 17553 17346 return false; 17554 17347 } 17555 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(det_id, iteration, exp_id) ref detResidImfile(det_id, iteration, exp_id)", 0)) {17348 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 17556 17349 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 17557 17350 psFree(md); 17558 17351 return false; 17559 17352 } 17560 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key INDEX(det_id, iteration)", 64)) {17353 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) { 17561 17354 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id"); 17562 17355 psFree(md); … … 17583 17376 return false; 17584 17377 } 17585 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_skewness", PS_DATA_F64, NULL, 0.0)) {17586 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_skewness");17587 psFree(md);17588 return false;17589 }17590 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_kurtosis", PS_DATA_F64, NULL, 0.0)) {17591 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_kurtosis");17592 psFree(md);17593 return false;17594 }17595 17378 if (!psMetadataAdd(md, PS_LIST_TAIL, "bin_stdev", PS_DATA_F64, NULL, 0.0)) { 17596 17379 psError(PS_ERR_UNKNOWN, false, "failed to add item bin_stdev"); … … 17613 17396 return false; 17614 17397 } 17615 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_0", PS_DATA_F64, NULL, 0.0)) {17616 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_0");17617 psFree(md);17618 return false;17619 }17620 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_1", PS_DATA_F64, NULL, 0.0)) {17621 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_1");17622 psFree(md);17623 return false;17624 }17625 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_2", PS_DATA_F64, NULL, 0.0)) {17626 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_2");17627 psFree(md);17628 return false;17629 }17630 17398 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_1", PS_DATA_F64, NULL, 0.0)) { 17631 17399 psError(PS_ERR_UNKNOWN, false, "failed to add item user_1"); … … 17681 17449 } 17682 17450 17683 bool detResidExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 b g_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)17451 bool detResidExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault) 17684 17452 { 17685 17453 psMetadata *md = psMetadataAlloc(); … … 17719 17487 return false; 17720 17488 } 17721 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_skewness", PS_DATA_F64, NULL, bg_skewness)) {17722 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_skewness");17723 psFree(md);17724 return false;17725 }17726 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_kurtosis", PS_DATA_F64, NULL, bg_kurtosis)) {17727 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_kurtosis");17728 psFree(md);17729 return false;17730 }17731 17489 if (!psMetadataAdd(md, PS_LIST_TAIL, "bin_stdev", PS_DATA_F64, NULL, bin_stdev)) { 17732 17490 psError(PS_ERR_UNKNOWN, false, "failed to add item bin_stdev"); … … 17746 17504 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_2", PS_DATA_F64, NULL, fringe_2)) { 17747 17505 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_2"); 17748 psFree(md);17749 return false;17750 }17751 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_0", PS_DATA_F64, NULL, fringe_resid_0)) {17752 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_0");17753 psFree(md);17754 return false;17755 }17756 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_1", PS_DATA_F64, NULL, fringe_resid_1)) {17757 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_1");17758 psFree(md);17759 return false;17760 }17761 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_2", PS_DATA_F64, NULL, fringe_resid_2)) {17762 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_2");17763 17506 psFree(md); 17764 17507 return false; … … 17827 17570 bool detResidExpInsertObject(psDB *dbh, detResidExpRow *object) 17828 17571 { 17829 return detResidExpInsert(dbh, object->det_id, object->iteration, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->b g_skewness, object->bg_kurtosis, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->fringe_resid_0, object->fringe_resid_1, object->fringe_resid_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->accept, object->fault);17572 return detResidExpInsert(dbh, object->det_id, object->iteration, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->accept, object->fault); 17830 17573 } 17831 17574 … … 17935 17678 return false; 17936 17679 } 17937 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_skewness", PS_DATA_F64, NULL, object->bg_skewness)) {17938 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_skewness");17939 psFree(md);17940 return false;17941 }17942 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_kurtosis", PS_DATA_F64, NULL, object->bg_kurtosis)) {17943 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_kurtosis");17944 psFree(md);17945 return false;17946 }17947 17680 if (!psMetadataAdd(md, PS_LIST_TAIL, "bin_stdev", PS_DATA_F64, NULL, object->bin_stdev)) { 17948 17681 psError(PS_ERR_UNKNOWN, false, "failed to add item bin_stdev"); … … 17965 17698 return false; 17966 17699 } 17967 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_0", PS_DATA_F64, NULL, object->fringe_resid_0)) {17968 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_0");17969 psFree(md);17970 return false;17971 }17972 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_1", PS_DATA_F64, NULL, object->fringe_resid_1)) {17973 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_1");17974 psFree(md);17975 return false;17976 }17977 if (!psMetadataAdd(md, PS_LIST_TAIL, "fringe_resid_2", PS_DATA_F64, NULL, object->fringe_resid_2)) {17978 psError(PS_ERR_UNKNOWN, false, "failed to add item fringe_resid_2");17979 psFree(md);17980 return false;17981 }17982 17700 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_1", PS_DATA_F64, NULL, object->user_1)) { 17983 17701 psError(PS_ERR_UNKNOWN, false, "failed to add item user_1"); … … 18064 17782 return false; 18065 17783 } 18066 psF64 bg_skewness = psMetadataLookupF64(&status, md, "bg_skewness");18067 if (!status) {18068 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_skewness");18069 return false;18070 }18071 psF64 bg_kurtosis = psMetadataLookupF64(&status, md, "bg_kurtosis");18072 if (!status) {18073 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_kurtosis");18074 return false;18075 }18076 17784 psF64 bin_stdev = psMetadataLookupF64(&status, md, "bin_stdev"); 18077 17785 if (!status) { … … 18094 17802 return false; 18095 17803 } 18096 psF64 fringe_resid_0 = psMetadataLookupF64(&status, md, "fringe_resid_0");18097 if (!status) {18098 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fringe_resid_0");18099 return false;18100 }18101 psF64 fringe_resid_1 = psMetadataLookupF64(&status, md, "fringe_resid_1");18102 if (!status) {18103 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fringe_resid_1");18104 return false;18105 }18106 psF64 fringe_resid_2 = psMetadataLookupF64(&status, md, "fringe_resid_2");18107 if (!status) {18108 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fringe_resid_2");18109 return false;18110 }18111 17804 psF64 user_1 = psMetadataLookupF64(&status, md, "user_1"); 18112 17805 if (!status) { … … 18150 17843 } 18151 17844 18152 return detResidExpRowAlloc(det_id, iteration, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, b g_skewness, bg_kurtosis, bin_stdev, fringe_0, fringe_1, fringe_2, fringe_resid_0, fringe_resid_1, fringe_resid_2, user_1, user_2, user_3, user_4, user_5, path_base, accept, fault);17845 return detResidExpRowAlloc(det_id, iteration, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, bin_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, accept, fault); 18153 17846 } 18154 17847 psArray *detResidExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) … … 18287 17980 { 18288 17981 psMetadata *md = psMetadataAlloc(); 18289 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detInputExp(det_id, iteration)", 0)) {17982 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key", 0)) { 18290 17983 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id"); 18291 17984 psFree(md); 18292 17985 return false; 18293 17986 } 18294 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key fkey(det_id, iteration) ref detResidExp(det_id, iteration)", 0)) {17987 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) { 18295 17988 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration"); 18296 17989 psFree(md); … … 18659 18352 return true; 18660 18353 } 18661 static void detRegisteredImfileRowFree(detRegisteredImfileRow *object);18662 18663 detRegisteredImfileRow *detRegisteredImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)18664 {18665 detRegisteredImfileRow *_object;18666 18667 _object = psAlloc(sizeof(detRegisteredImfileRow));18668 psMemSetDeallocator(_object, (psFreeFunc)detRegisteredImfileRowFree);18669 18670 _object->det_id = det_id;18671 _object->iteration = iteration;18672 _object->class_id = psStringCopy(class_id);18673 _object->uri = psStringCopy(uri);18674 _object->bg = bg;18675 _object->bg_stdev = bg_stdev;18676 _object->bg_mean_stdev = bg_mean_stdev;18677 _object->user_1 = user_1;18678 _object->user_2 = user_2;18679 _object->user_3 = user_3;18680 _object->user_4 = user_4;18681 _object->user_5 = user_5;18682 _object->path_base = psStringCopy(path_base);18683 _object->fault = fault;18684 18685 return _object;18686 }18687 18688 static void detRegisteredImfileRowFree(detRegisteredImfileRow *object)18689 {18690 psFree(object->class_id);18691 psFree(object->uri);18692 psFree(object->path_base);18693 }18694 18695 bool detRegisteredImfileCreateTable(psDB *dbh)18696 {18697 psMetadata *md = psMetadataAlloc();18698 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detRun(det_id, iteration)", 0)) {18699 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");18700 psFree(md);18701 return false;18702 }18703 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, "Primary Key", 0)) {18704 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");18705 psFree(md);18706 return false;18707 }18708 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key", "64")) {18709 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");18710 psFree(md);18711 return false;18712 }18713 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {18714 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");18715 psFree(md);18716 return false;18717 }18718 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {18719 psError(PS_ERR_UNKNOWN, false, "failed to add item bg");18720 psFree(md);18721 return false;18722 }18723 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_stdev", PS_DATA_F64, NULL, 0.0)) {18724 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");18725 psFree(md);18726 return false;18727 }18728 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, 0.0)) {18729 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");18730 psFree(md);18731 return false;18732 }18733 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_1", PS_DATA_F64, NULL, 0.0)) {18734 psError(PS_ERR_UNKNOWN, false, "failed to add item user_1");18735 psFree(md);18736 return false;18737 }18738 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_2", PS_DATA_F64, NULL, 0.0)) {18739 psError(PS_ERR_UNKNOWN, false, "failed to add item user_2");18740 psFree(md);18741 return false;18742 }18743 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_3", PS_DATA_F64, NULL, 0.0)) {18744 psError(PS_ERR_UNKNOWN, false, "failed to add item user_3");18745 psFree(md);18746 return false;18747 }18748 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_4", PS_DATA_F64, NULL, 0.0)) {18749 psError(PS_ERR_UNKNOWN, false, "failed to add item user_4");18750 psFree(md);18751 return false;18752 }18753 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_5", PS_DATA_F64, NULL, 0.0)) {18754 psError(PS_ERR_UNKNOWN, false, "failed to add item user_5");18755 psFree(md);18756 return false;18757 }18758 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, "255")) {18759 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");18760 psFree(md);18761 return false;18762 }18763 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {18764 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");18765 psFree(md);18766 return false;18767 }18768 18769 bool status = psDBCreateTable(dbh, DETREGISTEREDIMFILE_TABLE_NAME, md);18770 18771 psFree(md);18772 18773 return status;18774 }18775 18776 bool detRegisteredImfileDropTable(psDB *dbh)18777 {18778 return psDBDropTable(dbh, DETREGISTEREDIMFILE_TABLE_NAME);18779 }18780 18781 bool detRegisteredImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)18782 {18783 psMetadata *md = psMetadataAlloc();18784 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, det_id)) {18785 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");18786 psFree(md);18787 return false;18788 }18789 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, NULL, iteration)) {18790 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");18791 psFree(md);18792 return false;18793 }18794 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) {18795 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");18796 psFree(md);18797 return false;18798 }18799 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {18800 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");18801 psFree(md);18802 return false;18803 }18804 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, bg)) {18805 psError(PS_ERR_UNKNOWN, false, "failed to add item bg");18806 psFree(md);18807 return false;18808 }18809 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_stdev", PS_DATA_F64, NULL, bg_stdev)) {18810 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");18811 psFree(md);18812 return false;18813 }18814 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, bg_mean_stdev)) {18815 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");18816 psFree(md);18817 return false;18818 }18819 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_1", PS_DATA_F64, NULL, user_1)) {18820 psError(PS_ERR_UNKNOWN, false, "failed to add item user_1");18821 psFree(md);18822 return false;18823 }18824 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_2", PS_DATA_F64, NULL, user_2)) {18825 psError(PS_ERR_UNKNOWN, false, "failed to add item user_2");18826 psFree(md);18827 return false;18828 }18829 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_3", PS_DATA_F64, NULL, user_3)) {18830 psError(PS_ERR_UNKNOWN, false, "failed to add item user_3");18831 psFree(md);18832 return false;18833 }18834 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_4", PS_DATA_F64, NULL, user_4)) {18835 psError(PS_ERR_UNKNOWN, false, "failed to add item user_4");18836 psFree(md);18837 return false;18838 }18839 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_5", PS_DATA_F64, NULL, user_5)) {18840 psError(PS_ERR_UNKNOWN, false, "failed to add item user_5");18841 psFree(md);18842 return false;18843 }18844 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {18845 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");18846 psFree(md);18847 return false;18848 }18849 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {18850 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");18851 psFree(md);18852 return false;18853 }18854 18855 bool status = psDBInsertOneRow(dbh, DETREGISTEREDIMFILE_TABLE_NAME, md);18856 psFree(md);18857 18858 return status;18859 }18860 18861 long long detRegisteredImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)18862 {18863 long long deleted = 0;18864 18865 long long count = psDBDeleteRows(dbh, DETREGISTEREDIMFILE_TABLE_NAME, where, limit);18866 if (count < 0) {18867 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detRegisteredImfile");18868 return count;18869 18870 deleted += count;18871 }18872 18873 return deleted;18874 }18875 bool detRegisteredImfileInsertObject(psDB *dbh, detRegisteredImfileRow *object)18876 {18877 return detRegisteredImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);18878 }18879 18880 bool detRegisteredImfileInsertObjects(psDB *dbh, psArray *objects)18881 {18882 for (long i = 0; i < psArrayLength(objects); i++) {18883 if (!detRegisteredImfileInsertObject(dbh, objects->data[i])) {18884 return false;18885 }18886 }18887 18888 return true;18889 }18890 18891 bool detRegisteredImfileInsertFits(psDB *dbh, const psFits *fits)18892 {18893 psArray *rowSet;18894 18895 // move to (the first?) extension named DETREGISTEREDIMFILE_TABLE_NAME18896 if (!psFitsMoveExtName(fits, DETREGISTEREDIMFILE_TABLE_NAME)) {18897 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", DETREGISTEREDIMFILE_TABLE_NAME);18898 return false;18899 }18900 18901 // check HDU type18902 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) {18903 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");18904 return false;18905 }18906 18907 // read fits table18908 rowSet = psFitsReadTable(fits);18909 if (!rowSet) {18910 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");18911 psFree(rowSet);18912 return false;18913 }18914 18915 if (!psDBInsertRows(dbh, DETREGISTEREDIMFILE_TABLE_NAME, rowSet)) {18916 psError(PS_ERR_UNKNOWN, false, "databse insert failed");18917 psFree(rowSet);18918 return false;18919 }18920 18921 psFree(rowSet);18922 18923 return true;18924 }18925 18926 bool detRegisteredImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)18927 {18928 psArray *rowSet;18929 18930 rowSet = psDBSelectRows(dbh, DETREGISTEREDIMFILE_TABLE_NAME, where, limit);18931 if (!rowSet) {18932 return false;18933 }18934 18935 // output to fits18936 if (!psFitsWriteTable(fits, NULL, rowSet, DETREGISTEREDIMFILE_TABLE_NAME)) {18937 psError(PS_ERR_UNKNOWN, false, "FITS table write failed");18938 psFree(rowSet);18939 return false;18940 }18941 18942 psFree(rowSet);18943 18944 return true;18945 }18946 18947 psMetadata *detRegisteredImfileMetadataFromObject(const detRegisteredImfileRow *object)18948 {18949 psMetadata *md = psMetadataAlloc();18950 if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, object->det_id)) {18951 psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");18952 psFree(md);18953 return false;18954 }18955 if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, NULL, object->iteration)) {18956 psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");18957 psFree(md);18958 return false;18959 }18960 if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, object->class_id)) {18961 psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");18962 psFree(md);18963 return false;18964 }18965 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {18966 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");18967 psFree(md);18968 return false;18969 }18970 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {18971 psError(PS_ERR_UNKNOWN, false, "failed to add item bg");18972 psFree(md);18973 return false;18974 }18975 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_stdev", PS_DATA_F64, NULL, object->bg_stdev)) {18976 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");18977 psFree(md);18978 return false;18979 }18980 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, object->bg_mean_stdev)) {18981 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");18982 psFree(md);18983 return false;18984 }18985 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_1", PS_DATA_F64, NULL, object->user_1)) {18986 psError(PS_ERR_UNKNOWN, false, "failed to add item user_1");18987 psFree(md);18988 return false;18989 }18990 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_2", PS_DATA_F64, NULL, object->user_2)) {18991 psError(PS_ERR_UNKNOWN, false, "failed to add item user_2");18992 psFree(md);18993 return false;18994 }18995 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_3", PS_DATA_F64, NULL, object->user_3)) {18996 psError(PS_ERR_UNKNOWN, false, "failed to add item user_3");18997 psFree(md);18998 return false;18999 }19000 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_4", PS_DATA_F64, NULL, object->user_4)) {19001 psError(PS_ERR_UNKNOWN, false, "failed to add item user_4");19002 psFree(md);19003 return false;19004 }19005 if (!psMetadataAdd(md, PS_LIST_TAIL, "user_5", PS_DATA_F64, NULL, object->user_5)) {19006 psError(PS_ERR_UNKNOWN, false, "failed to add item user_5");19007 psFree(md);19008 return false;19009 }19010 if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, object->path_base)) {19011 psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");19012 psFree(md);19013 return false;19014 }19015 if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {19016 psError(PS_ERR_UNKNOWN, false, "failed to add item fault");19017 psFree(md);19018 return false;19019 }19020 19021 19022 return md;19023 }19024 19025 detRegisteredImfileRow *detRegisteredImfileObjectFromMetadata(psMetadata *md)19026 {19027 19028 bool status = false;19029 psS64 det_id = psMetadataLookupS64(&status, md, "det_id");19030 if (!status) {19031 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item det_id");19032 return false;19033 }19034 psS32 iteration = psMetadataLookupS32(&status, md, "iteration");19035 if (!status) {19036 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iteration");19037 return false;19038 }19039 char* class_id = psMetadataLookupPtr(&status, md, "class_id");19040 if (!status) {19041 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");19042 return false;19043 }19044 char* uri = psMetadataLookupPtr(&status, md, "uri");19045 if (!status) {19046 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");19047 return false;19048 }19049 psF64 bg = psMetadataLookupF64(&status, md, "bg");19050 if (!status) {19051 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg");19052 return false;19053 }19054 psF64 bg_stdev = psMetadataLookupF64(&status, md, "bg_stdev");19055 if (!status) {19056 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_stdev");19057 return false;19058 }19059 psF64 bg_mean_stdev = psMetadataLookupF64(&status, md, "bg_mean_stdev");19060 if (!status) {19061 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev");19062 return false;19063 }19064 psF64 user_1 = psMetadataLookupF64(&status, md, "user_1");19065 if (!status) {19066 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item user_1");19067 return false;19068 }19069 psF64 user_2 = psMetadataLookupF64(&status, md, "user_2");19070 if (!status) {19071 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item user_2");19072 return false;19073 }19074 psF64 user_3 = psMetadataLookupF64(&status, md, "user_3");19075 if (!status) {19076 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item user_3");19077 return false;19078 }19079 psF64 user_4 = psMetadataLookupF64(&status, md, "user_4");19080 if (!status) {19081 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item user_4");19082 return false;19083 }19084 psF64 user_5 = psMetadataLookupF64(&status, md, "user_5");19085 if (!status) {19086 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item user_5");19087 return false;19088 }19089 char* path_base = psMetadataLookupPtr(&status, md, "path_base");19090 if (!status) {19091 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item path_base");19092 return false;19093 }19094 psS16 fault = psMetadataLookupS16(&status, md, "fault");19095 if (!status) {19096 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault");19097 return false;19098 }19099 19100 return detRegisteredImfileRowAlloc(det_id, iteration, class_id, uri, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, path_base, fault);19101 }19102 psArray *detRegisteredImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)19103 {19104 psArray *rowSet;19105 psArray *returnSet;19106 psU64 i;19107 19108 rowSet = psDBSelectRows(dbh, DETREGISTEREDIMFILE_TABLE_NAME, where, limit);19109 if (!rowSet) {19110 return NULL;19111 }19112 19113 // convert psMetadata rows to row objects19114 19115 returnSet = psArrayAllocEmpty(rowSet->n);19116 19117 for (i = 0; i < rowSet->n; i++) {19118 detRegisteredImfileRow *object = detRegisteredImfileObjectFromMetadata(rowSet->data[i]);19119 psArrayAdd(returnSet, 0, object);19120 psFree(object);19121 }19122 19123 psFree(rowSet);19124 19125 return returnSet;19126 }19127 bool detRegisteredImfileDeleteObject(psDB *dbh, const detRegisteredImfileRow *object)19128 {19129 psMetadata *where = detRegisteredImfileMetadataFromObject(object);19130 long long count = psDBDeleteRows(dbh, DETREGISTEREDIMFILE_TABLE_NAME, where, 0);19131 psFree(where);19132 if (count < 0) {19133 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detRegisteredImfile");19134 return false;19135 }19136 if (count > 1) {19137 // XXX should this be a psAbort() instead? It is possible that19138 // having an object match multiple rows was by design.19139 psError(PS_ERR_UNKNOWN, true, "detRegisteredImfileRow object matched more then one row. Check your database schema");19140 return false;19141 }19142 19143 return true;19144 }19145 long long detRegisteredImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)19146 {19147 long long deleted = 0;19148 19149 for (long long i = 0; i < objects->n; i++) {19150 detRegisteredImfileRow *object = objects->data[i];19151 psMetadata *where = detRegisteredImfileMetadataFromObject(object);19152 long long count = psDBDeleteRows(dbh, DETREGISTEREDIMFILE_TABLE_NAME, where, limit);19153 psFree(where);19154 if (count < 0) {19155 psError(PS_ERR_UNKNOWN, true, "failed to delete row from detRegisteredImfile");19156 return count;19157 }19158 19159 deleted += count;19160 }19161 19162 return deleted;19163 }19164 bool detRegisteredImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)19165 {19166 PS_ASSERT_PTR_NON_NULL(objects, false);19167 19168 psMetadata *output = psMetadataAlloc();19169 for (long i = 0; i < psArrayLength(objects); i++) {19170 psMetadata *md = detRegisteredImfileMetadataFromObject(objects->data[i]);19171 if (!psMetadataAddMetadata(19172 output,19173 PS_LIST_TAIL,19174 DETREGISTEREDIMFILE_TABLE_NAME,19175 PS_META_DUPLICATE_OK,19176 NULL,19177 md19178 )) {19179 psError(PS_ERR_UNKNOWN, false, "failed to add metadata");19180 psFree(md);19181 psFree(output);19182 return false;19183 }19184 psFree(md);19185 }19186 19187 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {19188 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");19189 psFree(output);19190 }19191 psFree(output);19192 19193 return true;19194 }19195 bool detRegisteredImfilePrintObject(FILE *stream, detRegisteredImfileRow *object, bool mdcf)19196 {19197 PS_ASSERT_PTR_NON_NULL(object, false);19198 19199 psMetadata *md = detRegisteredImfileMetadataFromObject(object);19200 19201 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {19202 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");19203 psFree(md);19204 }19205 19206 psFree(md);19207 19208 return true;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_NAME19380 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 type19386 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 table19392 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 fits19420 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 objects19538 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 that19562 // 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 md19602 )) {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_NAME19781 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 type19787 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 table19793 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 fits19821 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 objects19919 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 that19943 // 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 md19983 )) {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 }20015 static void magicRunRowFree(magicRunRow *object);20016 20017 magicRunRow *magicRunRowAlloc(psS64 magic_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *dvodb, psTime* registered)20018 {20019 magicRunRow *_object;20020 20021 _object = psAlloc(sizeof(magicRunRow));20022 psMemSetDeallocator(_object, (psFreeFunc)magicRunRowFree);20023 20024 _object->magic_id = magic_id;20025 _object->state = psStringCopy(state);20026 _object->workdir = psStringCopy(workdir);20027 _object->workdir_state = psStringCopy(workdir_state);20028 _object->label = psStringCopy(label);20029 _object->dvodb = psStringCopy(dvodb);20030 _object->registered = psTimeCopy(registered);20031 20032 return _object;20033 }20034 20035 static void magicRunRowFree(magicRunRow *object)20036 {20037 psFree(object->state);20038 psFree(object->workdir);20039 psFree(object->workdir_state);20040 psFree(object->label);20041 psFree(object->dvodb);20042 psFree(object->registered);20043 }20044 20045 bool magicRunCreateTable(psDB *dbh)20046 {20047 psMetadata *md = psMetadataAlloc();20048 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Primary Key AUTO_INCREMENT", 0)) {20049 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20050 psFree(md);20051 return false;20052 }20053 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) {20054 psError(PS_ERR_UNKNOWN, false, "failed to add item state");20055 psFree(md);20056 return false;20057 }20058 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {20059 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");20060 psFree(md);20061 return false;20062 }20063 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, "Key", "255")) {20064 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");20065 psFree(md);20066 return false;20067 }20068 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "key", "64")) {20069 psError(PS_ERR_UNKNOWN, false, "failed to add item label");20070 psFree(md);20071 return false;20072 }20073 if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "255")) {20074 psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");20075 psFree(md);20076 return false;20077 }20078 if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, NULL)) {20079 psError(PS_ERR_UNKNOWN, false, "failed to add item registered");20080 psFree(md);20081 return false;20082 }20083 20084 bool status = psDBCreateTable(dbh, MAGICRUN_TABLE_NAME, md);20085 20086 psFree(md);20087 20088 return status;20089 }20090 20091 bool magicRunDropTable(psDB *dbh)20092 {20093 return psDBDropTable(dbh, MAGICRUN_TABLE_NAME);20094 }20095 20096 bool magicRunInsert(psDB * dbh, psS64 magic_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *dvodb, psTime* registered)20097 {20098 psMetadata *md = psMetadataAlloc();20099 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, magic_id)) {20100 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20101 psFree(md);20102 return false;20103 }20104 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {20105 psError(PS_ERR_UNKNOWN, false, "failed to add item state");20106 psFree(md);20107 return false;20108 }20109 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {20110 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");20111 psFree(md);20112 return false;20113 }20114 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, workdir_state)) {20115 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");20116 psFree(md);20117 return false;20118 }20119 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {20120 psError(PS_ERR_UNKNOWN, false, "failed to add item label");20121 psFree(md);20122 return false;20123 }20124 if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, dvodb)) {20125 psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");20126 psFree(md);20127 return false;20128 }20129 if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, registered)) {20130 psError(PS_ERR_UNKNOWN, false, "failed to add item registered");20131 psFree(md);20132 return false;20133 }20134 20135 bool status = psDBInsertOneRow(dbh, MAGICRUN_TABLE_NAME, md);20136 psFree(md);20137 20138 return status;20139 }20140 20141 long long magicRunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)20142 {20143 long long deleted = 0;20144 20145 long long count = psDBDeleteRows(dbh, MAGICRUN_TABLE_NAME, where, limit);20146 if (count < 0) {20147 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicRun");20148 return count;20149 20150 deleted += count;20151 }20152 20153 return deleted;20154 }20155 bool magicRunInsertObject(psDB *dbh, magicRunRow *object)20156 {20157 return magicRunInsert(dbh, object->magic_id, object->state, object->workdir, object->workdir_state, object->label, object->dvodb, object->registered);20158 }20159 20160 bool magicRunInsertObjects(psDB *dbh, psArray *objects)20161 {20162 for (long i = 0; i < psArrayLength(objects); i++) {20163 if (!magicRunInsertObject(dbh, objects->data[i])) {20164 return false;20165 }20166 }20167 20168 return true;20169 }20170 20171 bool magicRunInsertFits(psDB *dbh, const psFits *fits)20172 {20173 psArray *rowSet;20174 20175 // move to (the first?) extension named MAGICRUN_TABLE_NAME20176 if (!psFitsMoveExtName(fits, MAGICRUN_TABLE_NAME)) {20177 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", MAGICRUN_TABLE_NAME);20178 return false;20179 }20180 20181 // check HDU type20182 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) {20183 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");20184 return false;20185 }20186 20187 // read fits table20188 rowSet = psFitsReadTable(fits);20189 if (!rowSet) {20190 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");20191 psFree(rowSet);20192 return false;20193 }20194 20195 if (!psDBInsertRows(dbh, MAGICRUN_TABLE_NAME, rowSet)) {20196 psError(PS_ERR_UNKNOWN, false, "databse insert failed");20197 psFree(rowSet);20198 return false;20199 }20200 20201 psFree(rowSet);20202 20203 return true;20204 }20205 20206 bool magicRunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)20207 {20208 psArray *rowSet;20209 20210 rowSet = psDBSelectRows(dbh, MAGICRUN_TABLE_NAME, where, limit);20211 if (!rowSet) {20212 return false;20213 }20214 20215 // output to fits20216 if (!psFitsWriteTable(fits, NULL, rowSet, MAGICRUN_TABLE_NAME)) {20217 psError(PS_ERR_UNKNOWN, false, "FITS table write failed");20218 psFree(rowSet);20219 return false;20220 }20221 20222 psFree(rowSet);20223 20224 return true;20225 }20226 20227 psMetadata *magicRunMetadataFromObject(const magicRunRow *object)20228 {20229 psMetadata *md = psMetadataAlloc();20230 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, object->magic_id)) {20231 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20232 psFree(md);20233 return false;20234 }20235 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {20236 psError(PS_ERR_UNKNOWN, false, "failed to add item state");20237 psFree(md);20238 return false;20239 }20240 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {20241 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");20242 psFree(md);20243 return false;20244 }20245 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, object->workdir_state)) {20246 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");20247 psFree(md);20248 return false;20249 }20250 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {20251 psError(PS_ERR_UNKNOWN, false, "failed to add item label");20252 psFree(md);20253 return false;20254 }20255 if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {20256 psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");20257 psFree(md);20258 return false;20259 }20260 if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, object->registered)) {20261 psError(PS_ERR_UNKNOWN, false, "failed to add item registered");20262 psFree(md);20263 return false;20264 }20265 20266 20267 return md;20268 }20269 20270 magicRunRow *magicRunObjectFromMetadata(psMetadata *md)20271 {20272 20273 bool status = false;20274 psS64 magic_id = psMetadataLookupS64(&status, md, "magic_id");20275 if (!status) {20276 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic_id");20277 return false;20278 }20279 char* state = psMetadataLookupPtr(&status, md, "state");20280 if (!status) {20281 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");20282 return false;20283 }20284 char* workdir = psMetadataLookupPtr(&status, md, "workdir");20285 if (!status) {20286 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");20287 return false;20288 }20289 char* workdir_state = psMetadataLookupPtr(&status, md, "workdir_state");20290 if (!status) {20291 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir_state");20292 return false;20293 }20294 char* label = psMetadataLookupPtr(&status, md, "label");20295 if (!status) {20296 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");20297 return false;20298 }20299 char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");20300 if (!status) {20301 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dvodb");20302 return false;20303 }20304 psTime* registered = psMetadataLookupPtr(&status, md, "registered");20305 if (!status) {20306 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item registered");20307 return false;20308 }20309 20310 return magicRunRowAlloc(magic_id, state, workdir, workdir_state, label, dvodb, registered);20311 }20312 psArray *magicRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)20313 {20314 psArray *rowSet;20315 psArray *returnSet;20316 psU64 i;20317 20318 rowSet = psDBSelectRows(dbh, MAGICRUN_TABLE_NAME, where, limit);20319 if (!rowSet) {20320 return NULL;20321 }20322 20323 // convert psMetadata rows to row objects20324 20325 returnSet = psArrayAllocEmpty(rowSet->n);20326 20327 for (i = 0; i < rowSet->n; i++) {20328 magicRunRow *object = magicRunObjectFromMetadata(rowSet->data[i]);20329 psArrayAdd(returnSet, 0, object);20330 psFree(object);20331 }20332 20333 psFree(rowSet);20334 20335 return returnSet;20336 }20337 bool magicRunDeleteObject(psDB *dbh, const magicRunRow *object)20338 {20339 psMetadata *where = magicRunMetadataFromObject(object);20340 long long count = psDBDeleteRows(dbh, MAGICRUN_TABLE_NAME, where, 0);20341 psFree(where);20342 if (count < 0) {20343 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicRun");20344 return false;20345 }20346 if (count > 1) {20347 // XXX should this be a psAbort() instead? It is possible that20348 // having an object match multiple rows was by design.20349 psError(PS_ERR_UNKNOWN, true, "magicRunRow object matched more then one row. Check your database schema");20350 return false;20351 }20352 20353 return true;20354 }20355 long long magicRunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)20356 {20357 long long deleted = 0;20358 20359 for (long long i = 0; i < objects->n; i++) {20360 magicRunRow *object = objects->data[i];20361 psMetadata *where = magicRunMetadataFromObject(object);20362 long long count = psDBDeleteRows(dbh, MAGICRUN_TABLE_NAME, where, limit);20363 psFree(where);20364 if (count < 0) {20365 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicRun");20366 return count;20367 }20368 20369 deleted += count;20370 }20371 20372 return deleted;20373 }20374 bool magicRunPrintObjects(FILE *stream, psArray *objects, bool mdcf)20375 {20376 PS_ASSERT_PTR_NON_NULL(objects, false);20377 20378 psMetadata *output = psMetadataAlloc();20379 for (long i = 0; i < psArrayLength(objects); i++) {20380 psMetadata *md = magicRunMetadataFromObject(objects->data[i]);20381 if (!psMetadataAddMetadata(20382 output,20383 PS_LIST_TAIL,20384 MAGICRUN_TABLE_NAME,20385 PS_META_DUPLICATE_OK,20386 NULL,20387 md20388 )) {20389 psError(PS_ERR_UNKNOWN, false, "failed to add metadata");20390 psFree(md);20391 psFree(output);20392 return false;20393 }20394 psFree(md);20395 }20396 20397 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {20398 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");20399 psFree(output);20400 }20401 psFree(output);20402 20403 return true;20404 }20405 bool magicRunPrintObject(FILE *stream, magicRunRow *object, bool mdcf)20406 {20407 PS_ASSERT_PTR_NON_NULL(object, false);20408 20409 psMetadata *md = magicRunMetadataFromObject(object);20410 20411 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {20412 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");20413 psFree(md);20414 }20415 20416 psFree(md);20417 20418 return true;20419 }20420 static void magicInputSkyfileRowFree(magicInputSkyfileRow *object);20421 20422 magicInputSkyfileRow *magicInputSkyfileRowAlloc(psS64 magic_id, psS64 diff_id, const char *node)20423 {20424 magicInputSkyfileRow *_object;20425 20426 _object = psAlloc(sizeof(magicInputSkyfileRow));20427 psMemSetDeallocator(_object, (psFreeFunc)magicInputSkyfileRowFree);20428 20429 _object->magic_id = magic_id;20430 _object->diff_id = diff_id;20431 _object->node = psStringCopy(node);20432 20433 return _object;20434 }20435 20436 static void magicInputSkyfileRowFree(magicInputSkyfileRow *object)20437 {20438 psFree(object->node);20439 }20440 20441 bool magicInputSkyfileCreateTable(psDB *dbh)20442 {20443 psMetadata *md = psMetadataAlloc();20444 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Primary Key fkey(magic_id) ref magicRun(magic_id)", 0)) {20445 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20446 psFree(md);20447 return false;20448 }20449 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, "Primary Key fkey(diff_id) ref diffRun(diff_id)", 0)) {20450 psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");20451 psFree(md);20452 return false;20453 }20454 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, "64")) {20455 psError(PS_ERR_UNKNOWN, false, "failed to add item node");20456 psFree(md);20457 return false;20458 }20459 20460 bool status = psDBCreateTable(dbh, MAGICINPUTSKYFILE_TABLE_NAME, md);20461 20462 psFree(md);20463 20464 return status;20465 }20466 20467 bool magicInputSkyfileDropTable(psDB *dbh)20468 {20469 return psDBDropTable(dbh, MAGICINPUTSKYFILE_TABLE_NAME);20470 }20471 20472 bool magicInputSkyfileInsert(psDB * dbh, psS64 magic_id, psS64 diff_id, const char *node)20473 {20474 psMetadata *md = psMetadataAlloc();20475 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, magic_id)) {20476 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20477 psFree(md);20478 return false;20479 }20480 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, NULL, diff_id)) {20481 psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");20482 psFree(md);20483 return false;20484 }20485 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, node)) {20486 psError(PS_ERR_UNKNOWN, false, "failed to add item node");20487 psFree(md);20488 return false;20489 }20490 20491 bool status = psDBInsertOneRow(dbh, MAGICINPUTSKYFILE_TABLE_NAME, md);20492 psFree(md);20493 20494 return status;20495 }20496 20497 long long magicInputSkyfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)20498 {20499 long long deleted = 0;20500 20501 long long count = psDBDeleteRows(dbh, MAGICINPUTSKYFILE_TABLE_NAME, where, limit);20502 if (count < 0) {20503 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicInputSkyfile");20504 return count;20505 20506 deleted += count;20507 }20508 20509 return deleted;20510 }20511 bool magicInputSkyfileInsertObject(psDB *dbh, magicInputSkyfileRow *object)20512 {20513 return magicInputSkyfileInsert(dbh, object->magic_id, object->diff_id, object->node);20514 }20515 20516 bool magicInputSkyfileInsertObjects(psDB *dbh, psArray *objects)20517 {20518 for (long i = 0; i < psArrayLength(objects); i++) {20519 if (!magicInputSkyfileInsertObject(dbh, objects->data[i])) {20520 return false;20521 }20522 }20523 20524 return true;20525 }20526 20527 bool magicInputSkyfileInsertFits(psDB *dbh, const psFits *fits)20528 {20529 psArray *rowSet;20530 20531 // move to (the first?) extension named MAGICINPUTSKYFILE_TABLE_NAME20532 if (!psFitsMoveExtName(fits, MAGICINPUTSKYFILE_TABLE_NAME)) {20533 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", MAGICINPUTSKYFILE_TABLE_NAME);20534 return false;20535 }20536 20537 // check HDU type20538 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) {20539 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");20540 return false;20541 }20542 20543 // read fits table20544 rowSet = psFitsReadTable(fits);20545 if (!rowSet) {20546 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");20547 psFree(rowSet);20548 return false;20549 }20550 20551 if (!psDBInsertRows(dbh, MAGICINPUTSKYFILE_TABLE_NAME, rowSet)) {20552 psError(PS_ERR_UNKNOWN, false, "databse insert failed");20553 psFree(rowSet);20554 return false;20555 }20556 20557 psFree(rowSet);20558 20559 return true;20560 }20561 20562 bool magicInputSkyfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)20563 {20564 psArray *rowSet;20565 20566 rowSet = psDBSelectRows(dbh, MAGICINPUTSKYFILE_TABLE_NAME, where, limit);20567 if (!rowSet) {20568 return false;20569 }20570 20571 // output to fits20572 if (!psFitsWriteTable(fits, NULL, rowSet, MAGICINPUTSKYFILE_TABLE_NAME)) {20573 psError(PS_ERR_UNKNOWN, false, "FITS table write failed");20574 psFree(rowSet);20575 return false;20576 }20577 20578 psFree(rowSet);20579 20580 return true;20581 }20582 20583 psMetadata *magicInputSkyfileMetadataFromObject(const magicInputSkyfileRow *object)20584 {20585 psMetadata *md = psMetadataAlloc();20586 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, object->magic_id)) {20587 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20588 psFree(md);20589 return false;20590 }20591 if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, NULL, object->diff_id)) {20592 psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");20593 psFree(md);20594 return false;20595 }20596 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, object->node)) {20597 psError(PS_ERR_UNKNOWN, false, "failed to add item node");20598 psFree(md);20599 return false;20600 }20601 20602 20603 return md;20604 }20605 20606 magicInputSkyfileRow *magicInputSkyfileObjectFromMetadata(psMetadata *md)20607 {20608 20609 bool status = false;20610 psS64 magic_id = psMetadataLookupS64(&status, md, "magic_id");20611 if (!status) {20612 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic_id");20613 return false;20614 }20615 psS64 diff_id = psMetadataLookupS64(&status, md, "diff_id");20616 if (!status) {20617 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item diff_id");20618 return false;20619 }20620 char* node = psMetadataLookupPtr(&status, md, "node");20621 if (!status) {20622 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item node");20623 return false;20624 }20625 20626 return magicInputSkyfileRowAlloc(magic_id, diff_id, node);20627 }20628 psArray *magicInputSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)20629 {20630 psArray *rowSet;20631 psArray *returnSet;20632 psU64 i;20633 20634 rowSet = psDBSelectRows(dbh, MAGICINPUTSKYFILE_TABLE_NAME, where, limit);20635 if (!rowSet) {20636 return NULL;20637 }20638 20639 // convert psMetadata rows to row objects20640 20641 returnSet = psArrayAllocEmpty(rowSet->n);20642 20643 for (i = 0; i < rowSet->n; i++) {20644 magicInputSkyfileRow *object = magicInputSkyfileObjectFromMetadata(rowSet->data[i]);20645 psArrayAdd(returnSet, 0, object);20646 psFree(object);20647 }20648 20649 psFree(rowSet);20650 20651 return returnSet;20652 }20653 bool magicInputSkyfileDeleteObject(psDB *dbh, const magicInputSkyfileRow *object)20654 {20655 psMetadata *where = magicInputSkyfileMetadataFromObject(object);20656 long long count = psDBDeleteRows(dbh, MAGICINPUTSKYFILE_TABLE_NAME, where, 0);20657 psFree(where);20658 if (count < 0) {20659 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicInputSkyfile");20660 return false;20661 }20662 if (count > 1) {20663 // XXX should this be a psAbort() instead? It is possible that20664 // having an object match multiple rows was by design.20665 psError(PS_ERR_UNKNOWN, true, "magicInputSkyfileRow object matched more then one row. Check your database schema");20666 return false;20667 }20668 20669 return true;20670 }20671 long long magicInputSkyfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)20672 {20673 long long deleted = 0;20674 20675 for (long long i = 0; i < objects->n; i++) {20676 magicInputSkyfileRow *object = objects->data[i];20677 psMetadata *where = magicInputSkyfileMetadataFromObject(object);20678 long long count = psDBDeleteRows(dbh, MAGICINPUTSKYFILE_TABLE_NAME, where, limit);20679 psFree(where);20680 if (count < 0) {20681 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicInputSkyfile");20682 return count;20683 }20684 20685 deleted += count;20686 }20687 20688 return deleted;20689 }20690 bool magicInputSkyfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)20691 {20692 PS_ASSERT_PTR_NON_NULL(objects, false);20693 20694 psMetadata *output = psMetadataAlloc();20695 for (long i = 0; i < psArrayLength(objects); i++) {20696 psMetadata *md = magicInputSkyfileMetadataFromObject(objects->data[i]);20697 if (!psMetadataAddMetadata(20698 output,20699 PS_LIST_TAIL,20700 MAGICINPUTSKYFILE_TABLE_NAME,20701 PS_META_DUPLICATE_OK,20702 NULL,20703 md20704 )) {20705 psError(PS_ERR_UNKNOWN, false, "failed to add metadata");20706 psFree(md);20707 psFree(output);20708 return false;20709 }20710 psFree(md);20711 }20712 20713 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {20714 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");20715 psFree(output);20716 }20717 psFree(output);20718 20719 return true;20720 }20721 bool magicInputSkyfilePrintObject(FILE *stream, magicInputSkyfileRow *object, bool mdcf)20722 {20723 PS_ASSERT_PTR_NON_NULL(object, false);20724 20725 psMetadata *md = magicInputSkyfileMetadataFromObject(object);20726 20727 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {20728 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");20729 psFree(md);20730 }20731 20732 psFree(md);20733 20734 return true;20735 }20736 static void magicTreeRowFree(magicTreeRow *object);20737 20738 magicTreeRow *magicTreeRowAlloc(psS64 magic_id, const char *node, const char *dep)20739 {20740 magicTreeRow *_object;20741 20742 _object = psAlloc(sizeof(magicTreeRow));20743 psMemSetDeallocator(_object, (psFreeFunc)magicTreeRowFree);20744 20745 _object->magic_id = magic_id;20746 _object->node = psStringCopy(node);20747 _object->dep = psStringCopy(dep);20748 20749 return _object;20750 }20751 20752 static void magicTreeRowFree(magicTreeRow *object)20753 {20754 psFree(object->node);20755 psFree(object->dep);20756 }20757 20758 bool magicTreeCreateTable(psDB *dbh)20759 {20760 psMetadata *md = psMetadataAlloc();20761 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Key fkey(magic_id) ref magicRun(magic_id)", 0)) {20762 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20763 psFree(md);20764 return false;20765 }20766 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Key INDEX(magic_id, node)", "64")) {20767 psError(PS_ERR_UNKNOWN, false, "failed to add item node");20768 psFree(md);20769 return false;20770 }20771 if (!psMetadataAdd(md, PS_LIST_TAIL, "dep", PS_DATA_STRING, "Key", "64")) {20772 psError(PS_ERR_UNKNOWN, false, "failed to add item dep");20773 psFree(md);20774 return false;20775 }20776 20777 bool status = psDBCreateTable(dbh, MAGICTREE_TABLE_NAME, md);20778 20779 psFree(md);20780 20781 return status;20782 }20783 20784 bool magicTreeDropTable(psDB *dbh)20785 {20786 return psDBDropTable(dbh, MAGICTREE_TABLE_NAME);20787 }20788 20789 bool magicTreeInsert(psDB * dbh, psS64 magic_id, const char *node, const char *dep)20790 {20791 psMetadata *md = psMetadataAlloc();20792 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, magic_id)) {20793 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20794 psFree(md);20795 return false;20796 }20797 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, node)) {20798 psError(PS_ERR_UNKNOWN, false, "failed to add item node");20799 psFree(md);20800 return false;20801 }20802 if (!psMetadataAdd(md, PS_LIST_TAIL, "dep", PS_DATA_STRING, NULL, dep)) {20803 psError(PS_ERR_UNKNOWN, false, "failed to add item dep");20804 psFree(md);20805 return false;20806 }20807 20808 bool status = psDBInsertOneRow(dbh, MAGICTREE_TABLE_NAME, md);20809 psFree(md);20810 20811 return status;20812 }20813 20814 long long magicTreeDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)20815 {20816 long long deleted = 0;20817 20818 long long count = psDBDeleteRows(dbh, MAGICTREE_TABLE_NAME, where, limit);20819 if (count < 0) {20820 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicTree");20821 return count;20822 20823 deleted += count;20824 }20825 20826 return deleted;20827 }20828 bool magicTreeInsertObject(psDB *dbh, magicTreeRow *object)20829 {20830 return magicTreeInsert(dbh, object->magic_id, object->node, object->dep);20831 }20832 20833 bool magicTreeInsertObjects(psDB *dbh, psArray *objects)20834 {20835 for (long i = 0; i < psArrayLength(objects); i++) {20836 if (!magicTreeInsertObject(dbh, objects->data[i])) {20837 return false;20838 }20839 }20840 20841 return true;20842 }20843 20844 bool magicTreeInsertFits(psDB *dbh, const psFits *fits)20845 {20846 psArray *rowSet;20847 20848 // move to (the first?) extension named MAGICTREE_TABLE_NAME20849 if (!psFitsMoveExtName(fits, MAGICTREE_TABLE_NAME)) {20850 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", MAGICTREE_TABLE_NAME);20851 return false;20852 }20853 20854 // check HDU type20855 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) {20856 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");20857 return false;20858 }20859 20860 // read fits table20861 rowSet = psFitsReadTable(fits);20862 if (!rowSet) {20863 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");20864 psFree(rowSet);20865 return false;20866 }20867 20868 if (!psDBInsertRows(dbh, MAGICTREE_TABLE_NAME, rowSet)) {20869 psError(PS_ERR_UNKNOWN, false, "databse insert failed");20870 psFree(rowSet);20871 return false;20872 }20873 20874 psFree(rowSet);20875 20876 return true;20877 }20878 20879 bool magicTreeSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)20880 {20881 psArray *rowSet;20882 20883 rowSet = psDBSelectRows(dbh, MAGICTREE_TABLE_NAME, where, limit);20884 if (!rowSet) {20885 return false;20886 }20887 20888 // output to fits20889 if (!psFitsWriteTable(fits, NULL, rowSet, MAGICTREE_TABLE_NAME)) {20890 psError(PS_ERR_UNKNOWN, false, "FITS table write failed");20891 psFree(rowSet);20892 return false;20893 }20894 20895 psFree(rowSet);20896 20897 return true;20898 }20899 20900 psMetadata *magicTreeMetadataFromObject(const magicTreeRow *object)20901 {20902 psMetadata *md = psMetadataAlloc();20903 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, object->magic_id)) {20904 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");20905 psFree(md);20906 return false;20907 }20908 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, object->node)) {20909 psError(PS_ERR_UNKNOWN, false, "failed to add item node");20910 psFree(md);20911 return false;20912 }20913 if (!psMetadataAdd(md, PS_LIST_TAIL, "dep", PS_DATA_STRING, NULL, object->dep)) {20914 psError(PS_ERR_UNKNOWN, false, "failed to add item dep");20915 psFree(md);20916 return false;20917 }20918 20919 20920 return md;20921 }20922 20923 magicTreeRow *magicTreeObjectFromMetadata(psMetadata *md)20924 {20925 20926 bool status = false;20927 psS64 magic_id = psMetadataLookupS64(&status, md, "magic_id");20928 if (!status) {20929 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic_id");20930 return false;20931 }20932 char* node = psMetadataLookupPtr(&status, md, "node");20933 if (!status) {20934 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item node");20935 return false;20936 }20937 char* dep = psMetadataLookupPtr(&status, md, "dep");20938 if (!status) {20939 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dep");20940 return false;20941 }20942 20943 return magicTreeRowAlloc(magic_id, node, dep);20944 }20945 psArray *magicTreeSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)20946 {20947 psArray *rowSet;20948 psArray *returnSet;20949 psU64 i;20950 20951 rowSet = psDBSelectRows(dbh, MAGICTREE_TABLE_NAME, where, limit);20952 if (!rowSet) {20953 return NULL;20954 }20955 20956 // convert psMetadata rows to row objects20957 20958 returnSet = psArrayAllocEmpty(rowSet->n);20959 20960 for (i = 0; i < rowSet->n; i++) {20961 magicTreeRow *object = magicTreeObjectFromMetadata(rowSet->data[i]);20962 psArrayAdd(returnSet, 0, object);20963 psFree(object);20964 }20965 20966 psFree(rowSet);20967 20968 return returnSet;20969 }20970 bool magicTreeDeleteObject(psDB *dbh, const magicTreeRow *object)20971 {20972 psMetadata *where = magicTreeMetadataFromObject(object);20973 long long count = psDBDeleteRows(dbh, MAGICTREE_TABLE_NAME, where, 0);20974 psFree(where);20975 if (count < 0) {20976 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicTree");20977 return false;20978 }20979 if (count > 1) {20980 // XXX should this be a psAbort() instead? It is possible that20981 // having an object match multiple rows was by design.20982 psError(PS_ERR_UNKNOWN, true, "magicTreeRow object matched more then one row. Check your database schema");20983 return false;20984 }20985 20986 return true;20987 }20988 long long magicTreeDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)20989 {20990 long long deleted = 0;20991 20992 for (long long i = 0; i < objects->n; i++) {20993 magicTreeRow *object = objects->data[i];20994 psMetadata *where = magicTreeMetadataFromObject(object);20995 long long count = psDBDeleteRows(dbh, MAGICTREE_TABLE_NAME, where, limit);20996 psFree(where);20997 if (count < 0) {20998 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicTree");20999 return count;21000 }21001 21002 deleted += count;21003 }21004 21005 return deleted;21006 }21007 bool magicTreePrintObjects(FILE *stream, psArray *objects, bool mdcf)21008 {21009 PS_ASSERT_PTR_NON_NULL(objects, false);21010 21011 psMetadata *output = psMetadataAlloc();21012 for (long i = 0; i < psArrayLength(objects); i++) {21013 psMetadata *md = magicTreeMetadataFromObject(objects->data[i]);21014 if (!psMetadataAddMetadata(21015 output,21016 PS_LIST_TAIL,21017 MAGICTREE_TABLE_NAME,21018 PS_META_DUPLICATE_OK,21019 NULL,21020 md21021 )) {21022 psError(PS_ERR_UNKNOWN, false, "failed to add metadata");21023 psFree(md);21024 psFree(output);21025 return false;21026 }21027 psFree(md);21028 }21029 21030 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {21031 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");21032 psFree(output);21033 }21034 psFree(output);21035 21036 return true;21037 }21038 bool magicTreePrintObject(FILE *stream, magicTreeRow *object, bool mdcf)21039 {21040 PS_ASSERT_PTR_NON_NULL(object, false);21041 21042 psMetadata *md = magicTreeMetadataFromObject(object);21043 21044 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {21045 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");21046 psFree(md);21047 }21048 21049 psFree(md);21050 21051 return true;21052 }21053 static void magicNodeResultRowFree(magicNodeResultRow *object);21054 21055 magicNodeResultRow *magicNodeResultRowAlloc(psS64 magic_id, const char *node, const char *uri)21056 {21057 magicNodeResultRow *_object;21058 21059 _object = psAlloc(sizeof(magicNodeResultRow));21060 psMemSetDeallocator(_object, (psFreeFunc)magicNodeResultRowFree);21061 21062 _object->magic_id = magic_id;21063 _object->node = psStringCopy(node);21064 _object->uri = psStringCopy(uri);21065 21066 return _object;21067 }21068 21069 static void magicNodeResultRowFree(magicNodeResultRow *object)21070 {21071 psFree(object->node);21072 psFree(object->uri);21073 }21074 21075 bool magicNodeResultCreateTable(psDB *dbh)21076 {21077 psMetadata *md = psMetadataAlloc();21078 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Primary Key fkey(magic_id) ref magicRun(magic_id)", 0)) {21079 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");21080 psFree(md);21081 return false;21082 }21083 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Primary Key fkey(magic_id, node) ref magicTree(magic_id, node)", "64")) {21084 psError(PS_ERR_UNKNOWN, false, "failed to add item node");21085 psFree(md);21086 return false;21087 }21088 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {21089 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");21090 psFree(md);21091 return false;21092 }21093 21094 bool status = psDBCreateTable(dbh, MAGICNODERESULT_TABLE_NAME, md);21095 21096 psFree(md);21097 21098 return status;21099 }21100 21101 bool magicNodeResultDropTable(psDB *dbh)21102 {21103 return psDBDropTable(dbh, MAGICNODERESULT_TABLE_NAME);21104 }21105 21106 bool magicNodeResultInsert(psDB * dbh, psS64 magic_id, const char *node, const char *uri)21107 {21108 psMetadata *md = psMetadataAlloc();21109 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, magic_id)) {21110 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");21111 psFree(md);21112 return false;21113 }21114 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, node)) {21115 psError(PS_ERR_UNKNOWN, false, "failed to add item node");21116 psFree(md);21117 return false;21118 }21119 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {21120 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");21121 psFree(md);21122 return false;21123 }21124 21125 bool status = psDBInsertOneRow(dbh, MAGICNODERESULT_TABLE_NAME, md);21126 psFree(md);21127 21128 return status;21129 }21130 21131 long long magicNodeResultDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)21132 {21133 long long deleted = 0;21134 21135 long long count = psDBDeleteRows(dbh, MAGICNODERESULT_TABLE_NAME, where, limit);21136 if (count < 0) {21137 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicNodeResult");21138 return count;21139 21140 deleted += count;21141 }21142 21143 return deleted;21144 }21145 bool magicNodeResultInsertObject(psDB *dbh, magicNodeResultRow *object)21146 {21147 return magicNodeResultInsert(dbh, object->magic_id, object->node, object->uri);21148 }21149 21150 bool magicNodeResultInsertObjects(psDB *dbh, psArray *objects)21151 {21152 for (long i = 0; i < psArrayLength(objects); i++) {21153 if (!magicNodeResultInsertObject(dbh, objects->data[i])) {21154 return false;21155 }21156 }21157 21158 return true;21159 }21160 21161 bool magicNodeResultInsertFits(psDB *dbh, const psFits *fits)21162 {21163 psArray *rowSet;21164 21165 // move to (the first?) extension named MAGICNODERESULT_TABLE_NAME21166 if (!psFitsMoveExtName(fits, MAGICNODERESULT_TABLE_NAME)) {21167 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", MAGICNODERESULT_TABLE_NAME);21168 return false;21169 }21170 21171 // check HDU type21172 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) {21173 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");21174 return false;21175 }21176 21177 // read fits table21178 rowSet = psFitsReadTable(fits);21179 if (!rowSet) {21180 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");21181 psFree(rowSet);21182 return false;21183 }21184 21185 if (!psDBInsertRows(dbh, MAGICNODERESULT_TABLE_NAME, rowSet)) {21186 psError(PS_ERR_UNKNOWN, false, "databse insert failed");21187 psFree(rowSet);21188 return false;21189 }21190 21191 psFree(rowSet);21192 21193 return true;21194 }21195 21196 bool magicNodeResultSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)21197 {21198 psArray *rowSet;21199 21200 rowSet = psDBSelectRows(dbh, MAGICNODERESULT_TABLE_NAME, where, limit);21201 if (!rowSet) {21202 return false;21203 }21204 21205 // output to fits21206 if (!psFitsWriteTable(fits, NULL, rowSet, MAGICNODERESULT_TABLE_NAME)) {21207 psError(PS_ERR_UNKNOWN, false, "FITS table write failed");21208 psFree(rowSet);21209 return false;21210 }21211 21212 psFree(rowSet);21213 21214 return true;21215 }21216 21217 psMetadata *magicNodeResultMetadataFromObject(const magicNodeResultRow *object)21218 {21219 psMetadata *md = psMetadataAlloc();21220 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, object->magic_id)) {21221 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");21222 psFree(md);21223 return false;21224 }21225 if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, object->node)) {21226 psError(PS_ERR_UNKNOWN, false, "failed to add item node");21227 psFree(md);21228 return false;21229 }21230 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {21231 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");21232 psFree(md);21233 return false;21234 }21235 21236 21237 return md;21238 }21239 21240 magicNodeResultRow *magicNodeResultObjectFromMetadata(psMetadata *md)21241 {21242 21243 bool status = false;21244 psS64 magic_id = psMetadataLookupS64(&status, md, "magic_id");21245 if (!status) {21246 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic_id");21247 return false;21248 }21249 char* node = psMetadataLookupPtr(&status, md, "node");21250 if (!status) {21251 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item node");21252 return false;21253 }21254 char* uri = psMetadataLookupPtr(&status, md, "uri");21255 if (!status) {21256 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");21257 return false;21258 }21259 21260 return magicNodeResultRowAlloc(magic_id, node, uri);21261 }21262 psArray *magicNodeResultSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)21263 {21264 psArray *rowSet;21265 psArray *returnSet;21266 psU64 i;21267 21268 rowSet = psDBSelectRows(dbh, MAGICNODERESULT_TABLE_NAME, where, limit);21269 if (!rowSet) {21270 return NULL;21271 }21272 21273 // convert psMetadata rows to row objects21274 21275 returnSet = psArrayAllocEmpty(rowSet->n);21276 21277 for (i = 0; i < rowSet->n; i++) {21278 magicNodeResultRow *object = magicNodeResultObjectFromMetadata(rowSet->data[i]);21279 psArrayAdd(returnSet, 0, object);21280 psFree(object);21281 }21282 21283 psFree(rowSet);21284 21285 return returnSet;21286 }21287 bool magicNodeResultDeleteObject(psDB *dbh, const magicNodeResultRow *object)21288 {21289 psMetadata *where = magicNodeResultMetadataFromObject(object);21290 long long count = psDBDeleteRows(dbh, MAGICNODERESULT_TABLE_NAME, where, 0);21291 psFree(where);21292 if (count < 0) {21293 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicNodeResult");21294 return false;21295 }21296 if (count > 1) {21297 // XXX should this be a psAbort() instead? It is possible that21298 // having an object match multiple rows was by design.21299 psError(PS_ERR_UNKNOWN, true, "magicNodeResultRow object matched more then one row. Check your database schema");21300 return false;21301 }21302 21303 return true;21304 }21305 long long magicNodeResultDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)21306 {21307 long long deleted = 0;21308 21309 for (long long i = 0; i < objects->n; i++) {21310 magicNodeResultRow *object = objects->data[i];21311 psMetadata *where = magicNodeResultMetadataFromObject(object);21312 long long count = psDBDeleteRows(dbh, MAGICNODERESULT_TABLE_NAME, where, limit);21313 psFree(where);21314 if (count < 0) {21315 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicNodeResult");21316 return count;21317 }21318 21319 deleted += count;21320 }21321 21322 return deleted;21323 }21324 bool magicNodeResultPrintObjects(FILE *stream, psArray *objects, bool mdcf)21325 {21326 PS_ASSERT_PTR_NON_NULL(objects, false);21327 21328 psMetadata *output = psMetadataAlloc();21329 for (long i = 0; i < psArrayLength(objects); i++) {21330 psMetadata *md = magicNodeResultMetadataFromObject(objects->data[i]);21331 if (!psMetadataAddMetadata(21332 output,21333 PS_LIST_TAIL,21334 MAGICNODERESULT_TABLE_NAME,21335 PS_META_DUPLICATE_OK,21336 NULL,21337 md21338 )) {21339 psError(PS_ERR_UNKNOWN, false, "failed to add metadata");21340 psFree(md);21341 psFree(output);21342 return false;21343 }21344 psFree(md);21345 }21346 21347 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {21348 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");21349 psFree(output);21350 }21351 psFree(output);21352 21353 return true;21354 }21355 bool magicNodeResultPrintObject(FILE *stream, magicNodeResultRow *object, bool mdcf)21356 {21357 PS_ASSERT_PTR_NON_NULL(object, false);21358 21359 psMetadata *md = magicNodeResultMetadataFromObject(object);21360 21361 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {21362 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");21363 psFree(md);21364 }21365 21366 psFree(md);21367 21368 return true;21369 }21370 static void magicMaskRowFree(magicMaskRow *object);21371 21372 magicMaskRow *magicMaskRowAlloc(psS64 magic_id, const char *uri)21373 {21374 magicMaskRow *_object;21375 21376 _object = psAlloc(sizeof(magicMaskRow));21377 psMemSetDeallocator(_object, (psFreeFunc)magicMaskRowFree);21378 21379 _object->magic_id = magic_id;21380 _object->uri = psStringCopy(uri);21381 21382 return _object;21383 }21384 21385 static void magicMaskRowFree(magicMaskRow *object)21386 {21387 psFree(object->uri);21388 }21389 21390 bool magicMaskCreateTable(psDB *dbh)21391 {21392 psMetadata *md = psMetadataAlloc();21393 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Primary Key fkey(magic_id) ref magicRun(magic_id)", 0)) {21394 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");21395 psFree(md);21396 return false;21397 }21398 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {21399 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");21400 psFree(md);21401 return false;21402 }21403 21404 bool status = psDBCreateTable(dbh, MAGICMASK_TABLE_NAME, md);21405 21406 psFree(md);21407 21408 return status;21409 }21410 21411 bool magicMaskDropTable(psDB *dbh)21412 {21413 return psDBDropTable(dbh, MAGICMASK_TABLE_NAME);21414 }21415 21416 bool magicMaskInsert(psDB * dbh, psS64 magic_id, const char *uri)21417 {21418 psMetadata *md = psMetadataAlloc();21419 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, magic_id)) {21420 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");21421 psFree(md);21422 return false;21423 }21424 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {21425 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");21426 psFree(md);21427 return false;21428 }21429 21430 bool status = psDBInsertOneRow(dbh, MAGICMASK_TABLE_NAME, md);21431 psFree(md);21432 21433 return status;21434 }21435 21436 long long magicMaskDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)21437 {21438 long long deleted = 0;21439 21440 long long count = psDBDeleteRows(dbh, MAGICMASK_TABLE_NAME, where, limit);21441 if (count < 0) {21442 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicMask");21443 return count;21444 21445 deleted += count;21446 }21447 21448 return deleted;21449 }21450 bool magicMaskInsertObject(psDB *dbh, magicMaskRow *object)21451 {21452 return magicMaskInsert(dbh, object->magic_id, object->uri);21453 }21454 21455 bool magicMaskInsertObjects(psDB *dbh, psArray *objects)21456 {21457 for (long i = 0; i < psArrayLength(objects); i++) {21458 if (!magicMaskInsertObject(dbh, objects->data[i])) {21459 return false;21460 }21461 }21462 21463 return true;21464 }21465 21466 bool magicMaskInsertFits(psDB *dbh, const psFits *fits)21467 {21468 psArray *rowSet;21469 21470 // move to (the first?) extension named MAGICMASK_TABLE_NAME21471 if (!psFitsMoveExtName(fits, MAGICMASK_TABLE_NAME)) {21472 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", MAGICMASK_TABLE_NAME);21473 return false;21474 }21475 21476 // check HDU type21477 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) {21478 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");21479 return false;21480 }21481 21482 // read fits table21483 rowSet = psFitsReadTable(fits);21484 if (!rowSet) {21485 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");21486 psFree(rowSet);21487 return false;21488 }21489 21490 if (!psDBInsertRows(dbh, MAGICMASK_TABLE_NAME, rowSet)) {21491 psError(PS_ERR_UNKNOWN, false, "databse insert failed");21492 psFree(rowSet);21493 return false;21494 }21495 21496 psFree(rowSet);21497 21498 return true;21499 }21500 21501 bool magicMaskSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)21502 {21503 psArray *rowSet;21504 21505 rowSet = psDBSelectRows(dbh, MAGICMASK_TABLE_NAME, where, limit);21506 if (!rowSet) {21507 return false;21508 }21509 21510 // output to fits21511 if (!psFitsWriteTable(fits, NULL, rowSet, MAGICMASK_TABLE_NAME)) {21512 psError(PS_ERR_UNKNOWN, false, "FITS table write failed");21513 psFree(rowSet);21514 return false;21515 }21516 21517 psFree(rowSet);21518 21519 return true;21520 }21521 21522 psMetadata *magicMaskMetadataFromObject(const magicMaskRow *object)21523 {21524 psMetadata *md = psMetadataAlloc();21525 if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, object->magic_id)) {21526 psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");21527 psFree(md);21528 return false;21529 }21530 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {21531 psError(PS_ERR_UNKNOWN, false, "failed to add item uri");21532 psFree(md);21533 return false;21534 }21535 21536 21537 return md;21538 }21539 21540 magicMaskRow *magicMaskObjectFromMetadata(psMetadata *md)21541 {21542 21543 bool status = false;21544 psS64 magic_id = psMetadataLookupS64(&status, md, "magic_id");21545 if (!status) {21546 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic_id");21547 return false;21548 }21549 char* uri = psMetadataLookupPtr(&status, md, "uri");21550 if (!status) {21551 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");21552 return false;21553 }21554 21555 return magicMaskRowAlloc(magic_id, uri);21556 }21557 psArray *magicMaskSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)21558 {21559 psArray *rowSet;21560 psArray *returnSet;21561 psU64 i;21562 21563 rowSet = psDBSelectRows(dbh, MAGICMASK_TABLE_NAME, where, limit);21564 if (!rowSet) {21565 return NULL;21566 }21567 21568 // convert psMetadata rows to row objects21569 21570 returnSet = psArrayAllocEmpty(rowSet->n);21571 21572 for (i = 0; i < rowSet->n; i++) {21573 magicMaskRow *object = magicMaskObjectFromMetadata(rowSet->data[i]);21574 psArrayAdd(returnSet, 0, object);21575 psFree(object);21576 }21577 21578 psFree(rowSet);21579 21580 return returnSet;21581 }21582 bool magicMaskDeleteObject(psDB *dbh, const magicMaskRow *object)21583 {21584 psMetadata *where = magicMaskMetadataFromObject(object);21585 long long count = psDBDeleteRows(dbh, MAGICMASK_TABLE_NAME, where, 0);21586 psFree(where);21587 if (count < 0) {21588 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicMask");21589 return false;21590 }21591 if (count > 1) {21592 // XXX should this be a psAbort() instead? It is possible that21593 // having an object match multiple rows was by design.21594 psError(PS_ERR_UNKNOWN, true, "magicMaskRow object matched more then one row. Check your database schema");21595 return false;21596 }21597 21598 return true;21599 }21600 long long magicMaskDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)21601 {21602 long long deleted = 0;21603 21604 for (long long i = 0; i < objects->n; i++) {21605 magicMaskRow *object = objects->data[i];21606 psMetadata *where = magicMaskMetadataFromObject(object);21607 long long count = psDBDeleteRows(dbh, MAGICMASK_TABLE_NAME, where, limit);21608 psFree(where);21609 if (count < 0) {21610 psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicMask");21611 return count;21612 }21613 21614 deleted += count;21615 }21616 21617 return deleted;21618 }21619 bool magicMaskPrintObjects(FILE *stream, psArray *objects, bool mdcf)21620 {21621 PS_ASSERT_PTR_NON_NULL(objects, false);21622 21623 psMetadata *output = psMetadataAlloc();21624 for (long i = 0; i < psArrayLength(objects); i++) {21625 psMetadata *md = magicMaskMetadataFromObject(objects->data[i]);21626 if (!psMetadataAddMetadata(21627 output,21628 PS_LIST_TAIL,21629 MAGICMASK_TABLE_NAME,21630 PS_META_DUPLICATE_OK,21631 NULL,21632 md21633 )) {21634 psError(PS_ERR_UNKNOWN, false, "failed to add metadata");21635 psFree(md);21636 psFree(output);21637 return false;21638 }21639 psFree(md);21640 }21641 21642 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {21643 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");21644 psFree(output);21645 }21646 psFree(output);21647 21648 return true;21649 }21650 bool magicMaskPrintObject(FILE *stream, magicMaskRow *object, bool mdcf)21651 {21652 PS_ASSERT_PTR_NON_NULL(object, false);21653 21654 psMetadata *md = magicMaskMetadataFromObject(object);21655 21656 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {21657 psError(PS_ERR_UNKNOWN, false, "failed to print metadata");21658 psFree(md);21659 }21660 21661 psFree(md);21662 21663 return true;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(magic_id, 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_NAME21777 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 type21783 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 table21789 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 fits21817 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 objects21885 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 that21909 // 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 md21949 )) {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 } -
trunk/ippdb/src/ippdb.h
r15343 r15420 20 20 /* 21 21 * 22 * This file was generated by glueforge 1.0 122 * This file was generated by glueforge 1.03 23 23 * 24 24 * Do NOT directly edit this file. … … 125 125 ); 126 126 127 /** pzDataStoreRow data structure128 *129 * Structure for representing a single row of pzDataStore table data.130 */131 132 typedef struct {133 char *camera;134 char *telescope;135 char *uri;136 } pzDataStoreRow;137 138 /** Creates a new pzDataStoreRow object139 *140 * @return A new pzDataStoreRow object or NULL on failure.141 */142 143 pzDataStoreRow *pzDataStoreRowAlloc(144 const char *camera,145 const char *telescope,146 const char *uri147 );148 149 /** Creates a new pzDataStore table150 *151 * @return true on success152 */153 154 bool pzDataStoreCreateTable(155 psDB *dbh ///< Database handle156 );157 158 /** Deletes a pzDataStore table159 *160 * @return true on success161 */162 163 bool pzDataStoreDropTable(164 psDB *dbh ///< Database handle165 );166 167 /** Insert a single row into a table168 *169 * This function constructs and inserts a single row based on it's parameters.170 *171 * @return true on success172 */173 174 bool pzDataStoreInsert(175 psDB *dbh, ///< Database handle176 const char *camera,177 const char *telescope,178 const char *uri179 );180 181 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.182 *183 * @return A The number of rows removed or a negative value on error184 */185 186 long long pzDataStoreDelete(187 psDB *dbh, ///< Database handle188 const psMetadata *where, ///< Row match criteria189 unsigned long long limit ///< Maximum number of elements to delete190 );191 192 /** Insert a single pzDataStoreRow object into a table193 *194 * This function constructs and inserts a single row based on it's parameters.195 *196 * @return true on success197 */198 199 bool pzDataStoreInsertObject(200 psDB *dbh, ///< Database handle201 pzDataStoreRow *object ///< pzDataStoreRow object202 );203 204 /** Insert an array of pzDataStoreRow object into a table205 *206 * This function constructs and inserts multiple rows based on it's parameters.207 *208 * @return true on success209 */210 211 bool pzDataStoreInsertObjects(212 psDB *dbh, ///< Database handle213 psArray *objects ///< array of pzDataStoreRow objects214 );215 216 /** Insert data from a binary FITS table pzDataStoreRow into the database217 *218 * This function expects a psFits object with a FITS table as the first219 * extension. The table must have at least one row of data in it, that is of220 * the appropriate format (number of columns and their type). All other221 * extensions are ignored.222 *223 * @return true on success224 */225 226 bool pzDataStoreInsertFits(227 psDB *dbh, ///< Database handle228 const psFits *fits ///< psFits object229 );230 231 /** Selects up to limit from the database and returns them in a binary FITS table232 *233 * This function assumes an empty psFits object and will create a FITS table234 * as the first extension.235 *236 * See psDBSelectRows() for documentation on the format of where.237 *238 * @return true on success239 */240 241 bool pzDataStoreSelectRowsFits(242 psDB *dbh, ///< Database handle243 psFits *fits, ///< psFits object244 const psMetadata *where, ///< Row match criteria245 unsigned long long limit ///< Maximum number of elements to return246 );247 248 /** Convert a pzDataStoreRow into an equivalent psMetadata249 *250 * @return A psMetadata pointer or NULL on error251 */252 253 psMetadata *pzDataStoreMetadataFromObject(254 const pzDataStoreRow *object ///< fooRow to convert into a psMetadata255 );256 257 /** Convert a psMetadata into an equivalent fooRow258 *259 * @return A pzDataStoreRow pointer or NULL on error260 */261 262 pzDataStoreRow *pzDataStoreObjectFromMetadata(263 psMetadata *md ///< psMetadata to convert into a fooRow264 );265 /** Selects up to limit rows from the database and returns as pzDataStoreRow objects in a psArray266 *267 * See psDBSelectRows() for documentation on the format of where.268 *269 * @return A psArray pointer or NULL on error270 */271 272 psArray *pzDataStoreSelectRowObjects(273 psDB *dbh, ///< Database handle274 const psMetadata *where, ///< Row match criteria275 unsigned long long limit ///< Maximum number of elements to return276 );277 /** Deletes a row from the database coresponding to an pzDataStore278 *279 * Note that a 'where' search psMetadata is constructed from each object and280 * used to find rows to delete.281 *282 * @return A The number of rows removed or a negative value on error283 */284 285 bool pzDataStoreDeleteObject(286 psDB *dbh, ///< Database handle287 const pzDataStoreRow *object ///< Object to delete288 );289 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.290 *291 * Note that a 'where' search psMetadata is constructed from each object and292 * used to find rows to delete.293 *294 * @return A The number of rows removed or a negative value on error295 */296 297 long long pzDataStoreDeleteRowObjects(298 psDB *dbh, ///< Database handle299 const psArray *objects, ///< Array of objects to delete300 unsigned long long limit ///< Maximum number of elements to delete301 );302 /** Formats and prints an array of pzDataStoreRow objects303 *304 * When mdcf is set the formated output is in psMetadataConfig305 * format, otherwise it is in a simple tabular format.306 *307 * @return true on success308 */309 310 bool pzDataStorePrintObjects(311 FILE *stream, ///< a stream312 psArray *objects, ///< An array of pzDataStoreRow objects313 bool mdcf ///< format as mdconfig or simple314 );315 /** Formats and prints an pzDataStoreRow object316 *317 * When mdcf is set the formated output is in psMetadataConfig318 * format, otherwise it is in a simple tabular format.319 *320 * @return true on success321 */322 323 bool pzDataStorePrintObject(324 FILE *stream, ///< a stream325 pzDataStoreRow *object, ///< an pzDataStoreRow object326 bool mdcf ///< format as mdconfig or simple327 );328 127 /** summitExpRow data structure 329 128 * … … 970 769 char *class; 971 770 char *class_id; 771 psS64 exp_id; 972 772 } pzPendingImfileRow; 973 773 … … 982 782 const char *telescope, 983 783 const char *class, 984 const char *class_id 784 const char *class_id, 785 psS64 exp_id 985 786 ); 986 787 … … 1016 817 const char *telescope, 1017 818 const char *class, 1018 const char *class_id 819 const char *class_id, 820 psS64 exp_id 1019 821 ); 1020 822 … … 1378 1180 char *class; 1379 1181 char *class_id; 1182 psS64 exp_id; 1380 1183 char *uri; 1381 1184 } pzDoneImfileRow; … … 1392 1195 const char *class, 1393 1196 const char *class_id, 1197 psS64 exp_id, 1394 1198 const char *uri 1395 1199 ); … … 1427 1231 const char *class, 1428 1232 const char *class_id, 1233 psS64 exp_id, 1429 1234 const char *uri 1430 1235 ); … … 1588 1393 char *tmp_telescope; 1589 1394 char *state; 1395 psS32 imfiles; 1590 1396 char *workdir; 1591 1397 char *workdir_state; 1592 char *reduction;1593 1398 } newExpRow; 1594 1399 … … 1604 1409 const char *tmp_telescope, 1605 1410 const char *state, 1411 psS32 imfiles, 1606 1412 const char *workdir, 1607 const char *workdir_state, 1608 const char *reduction 1413 const char *workdir_state 1609 1414 ); 1610 1415 … … 1641 1446 const char *tmp_telescope, 1642 1447 const char *state, 1448 psS32 imfiles, 1643 1449 const char *workdir, 1644 const char *workdir_state, 1645 const char *reduction 1450 const char *workdir_state 1646 1451 ); 1647 1452 … … 2007 1812 char *exp_tag; 2008 1813 char *exp_type; 1814 psS32 imfiles; 2009 1815 char *filelevel; 2010 1816 char *workdir; 2011 char *reduction;2012 1817 char *filter; 2013 1818 psF32 airmass; … … 2046 1851 const char *exp_tag, 2047 1852 const char *exp_type, 1853 psS32 imfiles, 2048 1854 const char *filelevel, 2049 1855 const char *workdir, 2050 const char *reduction,2051 1856 const char *filter, 2052 1857 psF32 airmass, … … 2106 1911 const char *exp_tag, 2107 1912 const char *exp_type, 1913 psS32 imfiles, 2108 1914 const char *filelevel, 2109 1915 const char *workdir, 2110 const char *reduction,2111 1916 const char *filter, 2112 1917 psF32 airmass, … … 2769 2574 typedef struct { 2770 2575 psS64 chip_id; 2771 psS64 exp_id;2772 2576 char *state; 2773 2577 char *workdir; … … 2786 2590 chipRunRow *chipRunRowAlloc( 2787 2591 psS64 chip_id, 2788 psS64 exp_id,2789 2592 const char *state, 2790 2593 const char *workdir, … … 2824 2627 psDB *dbh, ///< Database handle 2825 2628 psS64 chip_id, 2826 psS64 exp_id,2827 2629 const char *state, 2828 2630 const char *workdir, … … 2979 2781 FILE *stream, ///< a stream 2980 2782 chipRunRow *object, ///< an chipRunRow object 2783 bool mdcf ///< format as mdconfig or simple 2784 ); 2785 /** chipInputImfileRow data structure 2786 * 2787 * Structure for representing a single row of chipInputImfile table data. 2788 */ 2789 2790 typedef struct { 2791 psS64 chip_id; 2792 psS64 exp_id; 2793 char *class_id; 2794 } chipInputImfileRow; 2795 2796 /** Creates a new chipInputImfileRow object 2797 * 2798 * @return A new chipInputImfileRow object or NULL on failure. 2799 */ 2800 2801 chipInputImfileRow *chipInputImfileRowAlloc( 2802 psS64 chip_id, 2803 psS64 exp_id, 2804 const char *class_id 2805 ); 2806 2807 /** Creates a new chipInputImfile table 2808 * 2809 * @return true on success 2810 */ 2811 2812 bool chipInputImfileCreateTable( 2813 psDB *dbh ///< Database handle 2814 ); 2815 2816 /** Deletes a chipInputImfile table 2817 * 2818 * @return true on success 2819 */ 2820 2821 bool chipInputImfileDropTable( 2822 psDB *dbh ///< Database handle 2823 ); 2824 2825 /** Insert a single row into a table 2826 * 2827 * This function constructs and inserts a single row based on it's parameters. 2828 * 2829 * @return true on success 2830 */ 2831 2832 bool chipInputImfileInsert( 2833 psDB *dbh, ///< Database handle 2834 psS64 chip_id, 2835 psS64 exp_id, 2836 const char *class_id 2837 ); 2838 2839 /** Deletes up to limit rows from the database and returns the number of rows actually deleted. 2840 * 2841 * @return A The number of rows removed or a negative value on error 2842 */ 2843 2844 long long chipInputImfileDelete( 2845 psDB *dbh, ///< Database handle 2846 const psMetadata *where, ///< Row match criteria 2847 unsigned long long limit ///< Maximum number of elements to delete 2848 ); 2849 2850 /** Insert a single chipInputImfileRow object into a table 2851 * 2852 * This function constructs and inserts a single row based on it's parameters. 2853 * 2854 * @return true on success 2855 */ 2856 2857 bool chipInputImfileInsertObject( 2858 psDB *dbh, ///< Database handle 2859 chipInputImfileRow *object ///< chipInputImfileRow object 2860 ); 2861 2862 /** Insert an array of chipInputImfileRow object into a table 2863 * 2864 * This function constructs and inserts multiple rows based on it's parameters. 2865 * 2866 * @return true on success 2867 */ 2868 2869 bool chipInputImfileInsertObjects( 2870 psDB *dbh, ///< Database handle 2871 psArray *objects ///< array of chipInputImfileRow objects 2872 ); 2873 2874 /** Insert data from a binary FITS table chipInputImfileRow into the database 2875 * 2876 * This function expects a psFits object with a FITS table as the first 2877 * extension. The table must have at least one row of data in it, that is of 2878 * the appropriate format (number of columns and their type). All other 2879 * extensions are ignored. 2880 * 2881 * @return true on success 2882 */ 2883 2884 bool chipInputImfileInsertFits( 2885 psDB *dbh, ///< Database handle 2886 const psFits *fits ///< psFits object 2887 ); 2888 2889 /** Selects up to limit from the database and returns them in a binary FITS table 2890 * 2891 * This function assumes an empty psFits object and will create a FITS table 2892 * as the first extension. 2893 * 2894 * See psDBSelectRows() for documentation on the format of where. 2895 * 2896 * @return true on success 2897 */ 2898 2899 bool chipInputImfileSelectRowsFits( 2900 psDB *dbh, ///< Database handle 2901 psFits *fits, ///< psFits object 2902 const psMetadata *where, ///< Row match criteria 2903 unsigned long long limit ///< Maximum number of elements to return 2904 ); 2905 2906 /** Convert a chipInputImfileRow into an equivalent psMetadata 2907 * 2908 * @return A psMetadata pointer or NULL on error 2909 */ 2910 2911 psMetadata *chipInputImfileMetadataFromObject( 2912 const chipInputImfileRow *object ///< fooRow to convert into a psMetadata 2913 ); 2914 2915 /** Convert a psMetadata into an equivalent fooRow 2916 * 2917 * @return A chipInputImfileRow pointer or NULL on error 2918 */ 2919 2920 chipInputImfileRow *chipInputImfileObjectFromMetadata( 2921 psMetadata *md ///< psMetadata to convert into a fooRow 2922 ); 2923 /** Selects up to limit rows from the database and returns as chipInputImfileRow objects in a psArray 2924 * 2925 * See psDBSelectRows() for documentation on the format of where. 2926 * 2927 * @return A psArray pointer or NULL on error 2928 */ 2929 2930 psArray *chipInputImfileSelectRowObjects( 2931 psDB *dbh, ///< Database handle 2932 const psMetadata *where, ///< Row match criteria 2933 unsigned long long limit ///< Maximum number of elements to return 2934 ); 2935 /** Deletes a row from the database coresponding to an chipInputImfile 2936 * 2937 * Note that a 'where' search psMetadata is constructed from each object and 2938 * used to find rows to delete. 2939 * 2940 * @return A The number of rows removed or a negative value on error 2941 */ 2942 2943 bool chipInputImfileDeleteObject( 2944 psDB *dbh, ///< Database handle 2945 const chipInputImfileRow *object ///< Object to delete 2946 ); 2947 /** Deletes up to limit rows from the database and returns the number of rows actually deleted. 2948 * 2949 * Note that a 'where' search psMetadata is constructed from each object and 2950 * used to find rows to delete. 2951 * 2952 * @return A The number of rows removed or a negative value on error 2953 */ 2954 2955 long long chipInputImfileDeleteRowObjects( 2956 psDB *dbh, ///< Database handle 2957 const psArray *objects, ///< Array of objects to delete 2958 unsigned long long limit ///< Maximum number of elements to delete 2959 ); 2960 /** Formats and prints an array of chipInputImfileRow objects 2961 * 2962 * When mdcf is set the formated output is in psMetadataConfig 2963 * format, otherwise it is in a simple tabular format. 2964 * 2965 * @return true on success 2966 */ 2967 2968 bool chipInputImfilePrintObjects( 2969 FILE *stream, ///< a stream 2970 psArray *objects, ///< An array of chipInputImfileRow objects 2971 bool mdcf ///< format as mdconfig or simple 2972 ); 2973 /** Formats and prints an chipInputImfileRow object 2974 * 2975 * When mdcf is set the formated output is in psMetadataConfig 2976 * format, otherwise it is in a simple tabular format. 2977 * 2978 * @return true on success 2979 */ 2980 2981 bool chipInputImfilePrintObject( 2982 FILE *stream, ///< a stream 2983 chipInputImfileRow *object, ///< an chipInputImfileRow object 2981 2984 bool mdcf ///< format as mdconfig or simple 2982 2985 ); … … 4734 4737 psF64 bg; 4735 4738 psF64 bg_stdev; 4736 psF64 pixel_fill;4737 psS16 fault;4738 4739 } warpSkyfileRow; 4739 4740 … … 4750 4751 const char *path_base, 4751 4752 psF64 bg, 4752 psF64 bg_stdev, 4753 psF64 pixel_fill, 4754 psS16 fault 4753 psF64 bg_stdev 4755 4754 ); 4756 4755 … … 4788 4787 const char *path_base, 4789 4788 psF64 bg, 4790 psF64 bg_stdev, 4791 psF64 pixel_fill, 4792 psS16 fault 4789 psF64 bg_stdev 4793 4790 ); 4794 4791 … … 5160 5157 typedef struct { 5161 5158 psS64 diff_id; 5162 bool template;5163 psS64 stack_id;5164 5159 psS64 warp_id; 5165 5160 char *skycell_id; 5166 5161 char *tess_id; 5167 5162 char *kind; 5163 bool template; 5168 5164 } diffInputSkyfileRow; 5169 5165 … … 5175 5171 diffInputSkyfileRow *diffInputSkyfileRowAlloc( 5176 5172 psS64 diff_id, 5177 bool template,5178 psS64 stack_id,5179 5173 psS64 warp_id, 5180 5174 const char *skycell_id, 5181 5175 const char *tess_id, 5182 const char *kind 5176 const char *kind, 5177 bool template 5183 5178 ); 5184 5179 … … 5211 5206 psDB *dbh, ///< Database handle 5212 5207 psS64 diff_id, 5213 bool template,5214 psS64 stack_id,5215 5208 psS64 warp_id, 5216 5209 const char *skycell_id, 5217 5210 const char *tess_id, 5218 const char *kind 5211 const char *kind, 5212 bool template 5219 5213 ); 5220 5214 … … 5377 5371 psF64 bg; 5378 5372 psF64 bg_stdev; 5379 psS16 fault;5380 5373 } diffSkyfileRow; 5381 5374 … … 5390 5383 const char *path_base, 5391 5384 psF64 bg, 5392 psF64 bg_stdev, 5393 psS16 fault 5385 psF64 bg_stdev 5394 5386 ); 5395 5387 … … 5425 5417 const char *path_base, 5426 5418 psF64 bg, 5427 psF64 bg_stdev, 5428 psS16 fault 5419 psF64 bg_stdev 5429 5420 ); 5430 5421 … … 5998 5989 psF64 bg; 5999 5990 psF64 bg_stdev; 6000 psS16 fault;6001 5991 } stackSumSkyfileRow; 6002 5992 … … 6011 6001 const char *path_base, 6012 6002 psF64 bg, 6013 psF64 bg_stdev, 6014 psS16 fault 6003 psF64 bg_stdev 6015 6004 ); 6016 6005 … … 6046 6035 const char *path_base, 6047 6036 psF64 bg, 6048 psF64 bg_stdev, 6049 psS16 fault 6037 psF64 bg_stdev 6050 6038 ); 6051 6039 … … 8087 8075 psF64 bg_stdev; 8088 8076 psF64 bg_mean_stdev; 8089 psF64 bg_skewness;8090 psF64 bg_kurtosis;8091 8077 psF64 bin_stdev; 8092 8078 psF64 fringe_0; 8093 8079 psF64 fringe_1; 8094 8080 psF64 fringe_2; 8095 psF64 fringe_resid_0;8096 psF64 fringe_resid_1;8097 psF64 fringe_resid_2;8098 8081 psF64 user_1; 8099 8082 psF64 user_2; … … 8120 8103 psF64 bg_stdev, 8121 8104 psF64 bg_mean_stdev, 8122 psF64 bg_skewness,8123 psF64 bg_kurtosis,8124 8105 psF64 bin_stdev, 8125 8106 psF64 fringe_0, 8126 8107 psF64 fringe_1, 8127 8108 psF64 fringe_2, 8128 psF64 fringe_resid_0,8129 psF64 fringe_resid_1,8130 psF64 fringe_resid_2,8131 8109 psF64 user_1, 8132 8110 psF64 user_2, … … 8174 8152 psF64 bg_stdev, 8175 8153 psF64 bg_mean_stdev, 8176 psF64 bg_skewness,8177 psF64 bg_kurtosis,8178 8154 psF64 bin_stdev, 8179 8155 psF64 fringe_0, 8180 8156 psF64 fringe_1, 8181 8157 psF64 fringe_2, 8182 psF64 fringe_resid_0,8183 psF64 fringe_resid_1,8184 psF64 fringe_resid_2,8185 8158 psF64 user_1, 8186 8159 psF64 user_2, … … 8352 8325 psF64 bg_stdev; 8353 8326 psF64 bg_mean_stdev; 8354 psF64 bg_skewness;8355 psF64 bg_kurtosis;8356 8327 psF64 bin_stdev; 8357 8328 psF64 fringe_0; 8358 8329 psF64 fringe_1; 8359 8330 psF64 fringe_2; 8360 psF64 fringe_resid_0;8361 psF64 fringe_resid_1;8362 psF64 fringe_resid_2;8363 8331 psF64 user_1; 8364 8332 psF64 user_2; … … 8384 8352 psF64 bg_stdev, 8385 8353 psF64 bg_mean_stdev, 8386 psF64 bg_skewness,8387 psF64 bg_kurtosis,8388 8354 psF64 bin_stdev, 8389 8355 psF64 fringe_0, 8390 8356 psF64 fringe_1, 8391 8357 psF64 fringe_2, 8392 psF64 fringe_resid_0,8393 psF64 fringe_resid_1,8394 psF64 fringe_resid_2,8395 8358 psF64 user_1, 8396 8359 psF64 user_2, … … 8437 8400 psF64 bg_stdev, 8438 8401 psF64 bg_mean_stdev, 8439 psF64 bg_skewness,8440 psF64 bg_kurtosis,8441 8402 psF64 bin_stdev, 8442 8403 psF64 fringe_0, 8443 8404 psF64 fringe_1, 8444 8405 psF64 fringe_2, 8445 psF64 fringe_resid_0,8446 psF64 fringe_resid_1,8447 psF64 fringe_resid_2,8448 8406 psF64 user_1, 8449 8407 psF64 user_2, … … 8816 8774 bool mdcf ///< format as mdconfig or simple 8817 8775 ); 8818 /** detRegisteredImfileRow data structure8819 *8820 * Structure for representing a single row of detRegisteredImfile table data.8821 */8822 8823 typedef struct {8824 psS64 det_id;8825 psS32 iteration;8826 char *class_id;8827 char *uri;8828 psF64 bg;8829 psF64 bg_stdev;8830 psF64 bg_mean_stdev;8831 psF64 user_1;8832 psF64 user_2;8833 psF64 user_3;8834 psF64 user_4;8835 psF64 user_5;8836 char *path_base;8837 psS16 fault;8838 } detRegisteredImfileRow;8839 8840 /** Creates a new detRegisteredImfileRow object8841 *8842 * @return A new detRegisteredImfileRow object or NULL on failure.8843 */8844 8845 detRegisteredImfileRow *detRegisteredImfileRowAlloc(8846 psS64 det_id,8847 psS32 iteration,8848 const char *class_id,8849 const char *uri,8850 psF64 bg,8851 psF64 bg_stdev,8852 psF64 bg_mean_stdev,8853 psF64 user_1,8854 psF64 user_2,8855 psF64 user_3,8856 psF64 user_4,8857 psF64 user_5,8858 const char *path_base,8859 psS16 fault8860 );8861 8862 /** Creates a new detRegisteredImfile table8863 *8864 * @return true on success8865 */8866 8867 bool detRegisteredImfileCreateTable(8868 psDB *dbh ///< Database handle8869 );8870 8871 /** Deletes a detRegisteredImfile table8872 *8873 * @return true on success8874 */8875 8876 bool detRegisteredImfileDropTable(8877 psDB *dbh ///< Database handle8878 );8879 8880 /** Insert a single row into a table8881 *8882 * This function constructs and inserts a single row based on it's parameters.8883 *8884 * @return true on success8885 */8886 8887 bool detRegisteredImfileInsert(8888 psDB *dbh, ///< Database handle8889 psS64 det_id,8890 psS32 iteration,8891 const char *class_id,8892 const char *uri,8893 psF64 bg,8894 psF64 bg_stdev,8895 psF64 bg_mean_stdev,8896 psF64 user_1,8897 psF64 user_2,8898 psF64 user_3,8899 psF64 user_4,8900 psF64 user_5,8901 const char *path_base,8902 psS16 fault8903 );8904 8905 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.8906 *8907 * @return A The number of rows removed or a negative value on error8908 */8909 8910 long long detRegisteredImfileDelete(8911 psDB *dbh, ///< Database handle8912 const psMetadata *where, ///< Row match criteria8913 unsigned long long limit ///< Maximum number of elements to delete8914 );8915 8916 /** Insert a single detRegisteredImfileRow object into a table8917 *8918 * This function constructs and inserts a single row based on it's parameters.8919 *8920 * @return true on success8921 */8922 8923 bool detRegisteredImfileInsertObject(8924 psDB *dbh, ///< Database handle8925 detRegisteredImfileRow *object ///< detRegisteredImfileRow object8926 );8927 8928 /** Insert an array of detRegisteredImfileRow object into a table8929 *8930 * This function constructs and inserts multiple rows based on it's parameters.8931 *8932 * @return true on success8933 */8934 8935 bool detRegisteredImfileInsertObjects(8936 psDB *dbh, ///< Database handle8937 psArray *objects ///< array of detRegisteredImfileRow objects8938 );8939 8940 /** Insert data from a binary FITS table detRegisteredImfileRow into the database8941 *8942 * This function expects a psFits object with a FITS table as the first8943 * extension. The table must have at least one row of data in it, that is of8944 * the appropriate format (number of columns and their type). All other8945 * extensions are ignored.8946 *8947 * @return true on success8948 */8949 8950 bool detRegisteredImfileInsertFits(8951 psDB *dbh, ///< Database handle8952 const psFits *fits ///< psFits object8953 );8954 8955 /** Selects up to limit from the database and returns them in a binary FITS table8956 *8957 * This function assumes an empty psFits object and will create a FITS table8958 * as the first extension.8959 *8960 * See psDBSelectRows() for documentation on the format of where.8961 *8962 * @return true on success8963 */8964 8965 bool detRegisteredImfileSelectRowsFits(8966 psDB *dbh, ///< Database handle8967 psFits *fits, ///< psFits object8968 const psMetadata *where, ///< Row match criteria8969 unsigned long long limit ///< Maximum number of elements to return8970 );8971 8972 /** Convert a detRegisteredImfileRow into an equivalent psMetadata8973 *8974 * @return A psMetadata pointer or NULL on error8975 */8976 8977 psMetadata *detRegisteredImfileMetadataFromObject(8978 const detRegisteredImfileRow *object ///< fooRow to convert into a psMetadata8979 );8980 8981 /** Convert a psMetadata into an equivalent fooRow8982 *8983 * @return A detRegisteredImfileRow pointer or NULL on error8984 */8985 8986 detRegisteredImfileRow *detRegisteredImfileObjectFromMetadata(8987 psMetadata *md ///< psMetadata to convert into a fooRow8988 );8989 /** Selects up to limit rows from the database and returns as detRegisteredImfileRow objects in a psArray8990 *8991 * See psDBSelectRows() for documentation on the format of where.8992 *8993 * @return A psArray pointer or NULL on error8994 */8995 8996 psArray *detRegisteredImfileSelectRowObjects(8997 psDB *dbh, ///< Database handle8998 const psMetadata *where, ///< Row match criteria8999 unsigned long long limit ///< Maximum number of elements to return9000 );9001 /** Deletes a row from the database coresponding to an detRegisteredImfile9002 *9003 * Note that a 'where' search psMetadata is constructed from each object and9004 * used to find rows to delete.9005 *9006 * @return A The number of rows removed or a negative value on error9007 */9008 9009 bool detRegisteredImfileDeleteObject(9010 psDB *dbh, ///< Database handle9011 const detRegisteredImfileRow *object ///< Object to delete9012 );9013 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9014 *9015 * Note that a 'where' search psMetadata is constructed from each object and9016 * used to find rows to delete.9017 *9018 * @return A The number of rows removed or a negative value on error9019 */9020 9021 long long detRegisteredImfileDeleteRowObjects(9022 psDB *dbh, ///< Database handle9023 const psArray *objects, ///< Array of objects to delete9024 unsigned long long limit ///< Maximum number of elements to delete9025 );9026 /** Formats and prints an array of detRegisteredImfileRow objects9027 *9028 * When mdcf is set the formated output is in psMetadataConfig9029 * format, otherwise it is in a simple tabular format.9030 *9031 * @return true on success9032 */9033 9034 bool detRegisteredImfilePrintObjects(9035 FILE *stream, ///< a stream9036 psArray *objects, ///< An array of detRegisteredImfileRow objects9037 bool mdcf ///< format as mdconfig or simple9038 );9039 /** Formats and prints an detRegisteredImfileRow object9040 *9041 * When mdcf is set the formated output is in psMetadataConfig9042 * format, otherwise it is in a simple tabular format.9043 *9044 * @return true on success9045 */9046 9047 bool detRegisteredImfilePrintObject(9048 FILE *stream, ///< a stream9049 detRegisteredImfileRow *object, ///< an detRegisteredImfileRow object9050 bool mdcf ///< format as mdconfig or simple9051 );9052 /** detCorrectedExpRow data structure9053 *9054 * Structure for representing a single row of detCorrectedExp table data.9055 */9056 9057 typedef struct {9058 psS64 det_id;9059 psS64 exp_id;9060 char *uri;9061 psS64 corr_id;9062 char *corr_type;9063 char *recipe;9064 char *path_base;9065 psS16 fault;9066 } detCorrectedExpRow;9067 9068 /** Creates a new detCorrectedExpRow object9069 *9070 * @return A new detCorrectedExpRow object or NULL on failure.9071 */9072 9073 detCorrectedExpRow *detCorrectedExpRowAlloc(9074 psS64 det_id,9075 psS64 exp_id,9076 const char *uri,9077 psS64 corr_id,9078 const char *corr_type,9079 const char *recipe,9080 const char *path_base,9081 psS16 fault9082 );9083 9084 /** Creates a new detCorrectedExp table9085 *9086 * @return true on success9087 */9088 9089 bool detCorrectedExpCreateTable(9090 psDB *dbh ///< Database handle9091 );9092 9093 /** Deletes a detCorrectedExp table9094 *9095 * @return true on success9096 */9097 9098 bool detCorrectedExpDropTable(9099 psDB *dbh ///< Database handle9100 );9101 9102 /** Insert a single row into a table9103 *9104 * This function constructs and inserts a single row based on it's parameters.9105 *9106 * @return true on success9107 */9108 9109 bool detCorrectedExpInsert(9110 psDB *dbh, ///< Database handle9111 psS64 det_id,9112 psS64 exp_id,9113 const char *uri,9114 psS64 corr_id,9115 const char *corr_type,9116 const char *recipe,9117 const char *path_base,9118 psS16 fault9119 );9120 9121 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9122 *9123 * @return A The number of rows removed or a negative value on error9124 */9125 9126 long long detCorrectedExpDelete(9127 psDB *dbh, ///< Database handle9128 const psMetadata *where, ///< Row match criteria9129 unsigned long long limit ///< Maximum number of elements to delete9130 );9131 9132 /** Insert a single detCorrectedExpRow object into a table9133 *9134 * This function constructs and inserts a single row based on it's parameters.9135 *9136 * @return true on success9137 */9138 9139 bool detCorrectedExpInsertObject(9140 psDB *dbh, ///< Database handle9141 detCorrectedExpRow *object ///< detCorrectedExpRow object9142 );9143 9144 /** Insert an array of detCorrectedExpRow object into a table9145 *9146 * This function constructs and inserts multiple rows based on it's parameters.9147 *9148 * @return true on success9149 */9150 9151 bool detCorrectedExpInsertObjects(9152 psDB *dbh, ///< Database handle9153 psArray *objects ///< array of detCorrectedExpRow objects9154 );9155 9156 /** Insert data from a binary FITS table detCorrectedExpRow into the database9157 *9158 * This function expects a psFits object with a FITS table as the first9159 * extension. The table must have at least one row of data in it, that is of9160 * the appropriate format (number of columns and their type). All other9161 * extensions are ignored.9162 *9163 * @return true on success9164 */9165 9166 bool detCorrectedExpInsertFits(9167 psDB *dbh, ///< Database handle9168 const psFits *fits ///< psFits object9169 );9170 9171 /** Selects up to limit from the database and returns them in a binary FITS table9172 *9173 * This function assumes an empty psFits object and will create a FITS table9174 * as the first extension.9175 *9176 * See psDBSelectRows() for documentation on the format of where.9177 *9178 * @return true on success9179 */9180 9181 bool detCorrectedExpSelectRowsFits(9182 psDB *dbh, ///< Database handle9183 psFits *fits, ///< psFits object9184 const psMetadata *where, ///< Row match criteria9185 unsigned long long limit ///< Maximum number of elements to return9186 );9187 9188 /** Convert a detCorrectedExpRow into an equivalent psMetadata9189 *9190 * @return A psMetadata pointer or NULL on error9191 */9192 9193 psMetadata *detCorrectedExpMetadataFromObject(9194 const detCorrectedExpRow *object ///< fooRow to convert into a psMetadata9195 );9196 9197 /** Convert a psMetadata into an equivalent fooRow9198 *9199 * @return A detCorrectedExpRow pointer or NULL on error9200 */9201 9202 detCorrectedExpRow *detCorrectedExpObjectFromMetadata(9203 psMetadata *md ///< psMetadata to convert into a fooRow9204 );9205 /** Selects up to limit rows from the database and returns as detCorrectedExpRow objects in a psArray9206 *9207 * See psDBSelectRows() for documentation on the format of where.9208 *9209 * @return A psArray pointer or NULL on error9210 */9211 9212 psArray *detCorrectedExpSelectRowObjects(9213 psDB *dbh, ///< Database handle9214 const psMetadata *where, ///< Row match criteria9215 unsigned long long limit ///< Maximum number of elements to return9216 );9217 /** Deletes a row from the database coresponding to an detCorrectedExp9218 *9219 * Note that a 'where' search psMetadata is constructed from each object and9220 * used to find rows to delete.9221 *9222 * @return A The number of rows removed or a negative value on error9223 */9224 9225 bool detCorrectedExpDeleteObject(9226 psDB *dbh, ///< Database handle9227 const detCorrectedExpRow *object ///< Object to delete9228 );9229 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9230 *9231 * Note that a 'where' search psMetadata is constructed from each object and9232 * used to find rows to delete.9233 *9234 * @return A The number of rows removed or a negative value on error9235 */9236 9237 long long detCorrectedExpDeleteRowObjects(9238 psDB *dbh, ///< Database handle9239 const psArray *objects, ///< Array of objects to delete9240 unsigned long long limit ///< Maximum number of elements to delete9241 );9242 /** Formats and prints an array of detCorrectedExpRow objects9243 *9244 * When mdcf is set the formated output is in psMetadataConfig9245 * format, otherwise it is in a simple tabular format.9246 *9247 * @return true on success9248 */9249 9250 bool detCorrectedExpPrintObjects(9251 FILE *stream, ///< a stream9252 psArray *objects, ///< An array of detCorrectedExpRow objects9253 bool mdcf ///< format as mdconfig or simple9254 );9255 /** Formats and prints an detCorrectedExpRow object9256 *9257 * When mdcf is set the formated output is in psMetadataConfig9258 * format, otherwise it is in a simple tabular format.9259 *9260 * @return true on success9261 */9262 9263 bool detCorrectedExpPrintObject(9264 FILE *stream, ///< a stream9265 detCorrectedExpRow *object, ///< an detCorrectedExpRow object9266 bool mdcf ///< format as mdconfig or simple9267 );9268 /** detCorrectedImfileRow data structure9269 *9270 * Structure for representing a single row of detCorrectedImfile table data.9271 */9272 9273 typedef struct {9274 psS64 det_id;9275 psS64 exp_id;9276 char *class_id;9277 char *uri;9278 char *path_base;9279 psS16 fault;9280 } detCorrectedImfileRow;9281 9282 /** Creates a new detCorrectedImfileRow object9283 *9284 * @return A new detCorrectedImfileRow object or NULL on failure.9285 */9286 9287 detCorrectedImfileRow *detCorrectedImfileRowAlloc(9288 psS64 det_id,9289 psS64 exp_id,9290 const char *class_id,9291 const char *uri,9292 const char *path_base,9293 psS16 fault9294 );9295 9296 /** Creates a new detCorrectedImfile table9297 *9298 * @return true on success9299 */9300 9301 bool detCorrectedImfileCreateTable(9302 psDB *dbh ///< Database handle9303 );9304 9305 /** Deletes a detCorrectedImfile table9306 *9307 * @return true on success9308 */9309 9310 bool detCorrectedImfileDropTable(9311 psDB *dbh ///< Database handle9312 );9313 9314 /** Insert a single row into a table9315 *9316 * This function constructs and inserts a single row based on it's parameters.9317 *9318 * @return true on success9319 */9320 9321 bool detCorrectedImfileInsert(9322 psDB *dbh, ///< Database handle9323 psS64 det_id,9324 psS64 exp_id,9325 const char *class_id,9326 const char *uri,9327 const char *path_base,9328 psS16 fault9329 );9330 9331 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9332 *9333 * @return A The number of rows removed or a negative value on error9334 */9335 9336 long long detCorrectedImfileDelete(9337 psDB *dbh, ///< Database handle9338 const psMetadata *where, ///< Row match criteria9339 unsigned long long limit ///< Maximum number of elements to delete9340 );9341 9342 /** Insert a single detCorrectedImfileRow object into a table9343 *9344 * This function constructs and inserts a single row based on it's parameters.9345 *9346 * @return true on success9347 */9348 9349 bool detCorrectedImfileInsertObject(9350 psDB *dbh, ///< Database handle9351 detCorrectedImfileRow *object ///< detCorrectedImfileRow object9352 );9353 9354 /** Insert an array of detCorrectedImfileRow object into a table9355 *9356 * This function constructs and inserts multiple rows based on it's parameters.9357 *9358 * @return true on success9359 */9360 9361 bool detCorrectedImfileInsertObjects(9362 psDB *dbh, ///< Database handle9363 psArray *objects ///< array of detCorrectedImfileRow objects9364 );9365 9366 /** Insert data from a binary FITS table detCorrectedImfileRow into the database9367 *9368 * This function expects a psFits object with a FITS table as the first9369 * extension. The table must have at least one row of data in it, that is of9370 * the appropriate format (number of columns and their type). All other9371 * extensions are ignored.9372 *9373 * @return true on success9374 */9375 9376 bool detCorrectedImfileInsertFits(9377 psDB *dbh, ///< Database handle9378 const psFits *fits ///< psFits object9379 );9380 9381 /** Selects up to limit from the database and returns them in a binary FITS table9382 *9383 * This function assumes an empty psFits object and will create a FITS table9384 * as the first extension.9385 *9386 * See psDBSelectRows() for documentation on the format of where.9387 *9388 * @return true on success9389 */9390 9391 bool detCorrectedImfileSelectRowsFits(9392 psDB *dbh, ///< Database handle9393 psFits *fits, ///< psFits object9394 const psMetadata *where, ///< Row match criteria9395 unsigned long long limit ///< Maximum number of elements to return9396 );9397 9398 /** Convert a detCorrectedImfileRow into an equivalent psMetadata9399 *9400 * @return A psMetadata pointer or NULL on error9401 */9402 9403 psMetadata *detCorrectedImfileMetadataFromObject(9404 const detCorrectedImfileRow *object ///< fooRow to convert into a psMetadata9405 );9406 9407 /** Convert a psMetadata into an equivalent fooRow9408 *9409 * @return A detCorrectedImfileRow pointer or NULL on error9410 */9411 9412 detCorrectedImfileRow *detCorrectedImfileObjectFromMetadata(9413 psMetadata *md ///< psMetadata to convert into a fooRow9414 );9415 /** Selects up to limit rows from the database and returns as detCorrectedImfileRow objects in a psArray9416 *9417 * See psDBSelectRows() for documentation on the format of where.9418 *9419 * @return A psArray pointer or NULL on error9420 */9421 9422 psArray *detCorrectedImfileSelectRowObjects(9423 psDB *dbh, ///< Database handle9424 const psMetadata *where, ///< Row match criteria9425 unsigned long long limit ///< Maximum number of elements to return9426 );9427 /** Deletes a row from the database coresponding to an detCorrectedImfile9428 *9429 * Note that a 'where' search psMetadata is constructed from each object and9430 * used to find rows to delete.9431 *9432 * @return A The number of rows removed or a negative value on error9433 */9434 9435 bool detCorrectedImfileDeleteObject(9436 psDB *dbh, ///< Database handle9437 const detCorrectedImfileRow *object ///< Object to delete9438 );9439 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9440 *9441 * Note that a 'where' search psMetadata is constructed from each object and9442 * used to find rows to delete.9443 *9444 * @return A The number of rows removed or a negative value on error9445 */9446 9447 long long detCorrectedImfileDeleteRowObjects(9448 psDB *dbh, ///< Database handle9449 const psArray *objects, ///< Array of objects to delete9450 unsigned long long limit ///< Maximum number of elements to delete9451 );9452 /** Formats and prints an array of detCorrectedImfileRow objects9453 *9454 * When mdcf is set the formated output is in psMetadataConfig9455 * format, otherwise it is in a simple tabular format.9456 *9457 * @return true on success9458 */9459 9460 bool detCorrectedImfilePrintObjects(9461 FILE *stream, ///< a stream9462 psArray *objects, ///< An array of detCorrectedImfileRow objects9463 bool mdcf ///< format as mdconfig or simple9464 );9465 /** Formats and prints an detCorrectedImfileRow object9466 *9467 * When mdcf is set the formated output is in psMetadataConfig9468 * format, otherwise it is in a simple tabular format.9469 *9470 * @return true on success9471 */9472 9473 bool detCorrectedImfilePrintObject(9474 FILE *stream, ///< a stream9475 detCorrectedImfileRow *object, ///< an detCorrectedImfileRow object9476 bool mdcf ///< format as mdconfig or simple9477 );9478 /** magicRunRow data structure9479 *9480 * Structure for representing a single row of magicRun table data.9481 */9482 9483 typedef struct {9484 psS64 magic_id;9485 char *state;9486 char *workdir;9487 char *workdir_state;9488 char *label;9489 char *dvodb;9490 psTime* registered;9491 } magicRunRow;9492 9493 /** Creates a new magicRunRow object9494 *9495 * @return A new magicRunRow object or NULL on failure.9496 */9497 9498 magicRunRow *magicRunRowAlloc(9499 psS64 magic_id,9500 const char *state,9501 const char *workdir,9502 const char *workdir_state,9503 const char *label,9504 const char *dvodb,9505 psTime* registered9506 );9507 9508 /** Creates a new magicRun table9509 *9510 * @return true on success9511 */9512 9513 bool magicRunCreateTable(9514 psDB *dbh ///< Database handle9515 );9516 9517 /** Deletes a magicRun table9518 *9519 * @return true on success9520 */9521 9522 bool magicRunDropTable(9523 psDB *dbh ///< Database handle9524 );9525 9526 /** Insert a single row into a table9527 *9528 * This function constructs and inserts a single row based on it's parameters.9529 *9530 * @return true on success9531 */9532 9533 bool magicRunInsert(9534 psDB *dbh, ///< Database handle9535 psS64 magic_id,9536 const char *state,9537 const char *workdir,9538 const char *workdir_state,9539 const char *label,9540 const char *dvodb,9541 psTime* registered9542 );9543 9544 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9545 *9546 * @return A The number of rows removed or a negative value on error9547 */9548 9549 long long magicRunDelete(9550 psDB *dbh, ///< Database handle9551 const psMetadata *where, ///< Row match criteria9552 unsigned long long limit ///< Maximum number of elements to delete9553 );9554 9555 /** Insert a single magicRunRow object into a table9556 *9557 * This function constructs and inserts a single row based on it's parameters.9558 *9559 * @return true on success9560 */9561 9562 bool magicRunInsertObject(9563 psDB *dbh, ///< Database handle9564 magicRunRow *object ///< magicRunRow object9565 );9566 9567 /** Insert an array of magicRunRow object into a table9568 *9569 * This function constructs and inserts multiple rows based on it's parameters.9570 *9571 * @return true on success9572 */9573 9574 bool magicRunInsertObjects(9575 psDB *dbh, ///< Database handle9576 psArray *objects ///< array of magicRunRow objects9577 );9578 9579 /** Insert data from a binary FITS table magicRunRow into the database9580 *9581 * This function expects a psFits object with a FITS table as the first9582 * extension. The table must have at least one row of data in it, that is of9583 * the appropriate format (number of columns and their type). All other9584 * extensions are ignored.9585 *9586 * @return true on success9587 */9588 9589 bool magicRunInsertFits(9590 psDB *dbh, ///< Database handle9591 const psFits *fits ///< psFits object9592 );9593 9594 /** Selects up to limit from the database and returns them in a binary FITS table9595 *9596 * This function assumes an empty psFits object and will create a FITS table9597 * as the first extension.9598 *9599 * See psDBSelectRows() for documentation on the format of where.9600 *9601 * @return true on success9602 */9603 9604 bool magicRunSelectRowsFits(9605 psDB *dbh, ///< Database handle9606 psFits *fits, ///< psFits object9607 const psMetadata *where, ///< Row match criteria9608 unsigned long long limit ///< Maximum number of elements to return9609 );9610 9611 /** Convert a magicRunRow into an equivalent psMetadata9612 *9613 * @return A psMetadata pointer or NULL on error9614 */9615 9616 psMetadata *magicRunMetadataFromObject(9617 const magicRunRow *object ///< fooRow to convert into a psMetadata9618 );9619 9620 /** Convert a psMetadata into an equivalent fooRow9621 *9622 * @return A magicRunRow pointer or NULL on error9623 */9624 9625 magicRunRow *magicRunObjectFromMetadata(9626 psMetadata *md ///< psMetadata to convert into a fooRow9627 );9628 /** Selects up to limit rows from the database and returns as magicRunRow objects in a psArray9629 *9630 * See psDBSelectRows() for documentation on the format of where.9631 *9632 * @return A psArray pointer or NULL on error9633 */9634 9635 psArray *magicRunSelectRowObjects(9636 psDB *dbh, ///< Database handle9637 const psMetadata *where, ///< Row match criteria9638 unsigned long long limit ///< Maximum number of elements to return9639 );9640 /** Deletes a row from the database coresponding to an magicRun9641 *9642 * Note that a 'where' search psMetadata is constructed from each object and9643 * used to find rows to delete.9644 *9645 * @return A The number of rows removed or a negative value on error9646 */9647 9648 bool magicRunDeleteObject(9649 psDB *dbh, ///< Database handle9650 const magicRunRow *object ///< Object to delete9651 );9652 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9653 *9654 * Note that a 'where' search psMetadata is constructed from each object and9655 * used to find rows to delete.9656 *9657 * @return A The number of rows removed or a negative value on error9658 */9659 9660 long long magicRunDeleteRowObjects(9661 psDB *dbh, ///< Database handle9662 const psArray *objects, ///< Array of objects to delete9663 unsigned long long limit ///< Maximum number of elements to delete9664 );9665 /** Formats and prints an array of magicRunRow objects9666 *9667 * When mdcf is set the formated output is in psMetadataConfig9668 * format, otherwise it is in a simple tabular format.9669 *9670 * @return true on success9671 */9672 9673 bool magicRunPrintObjects(9674 FILE *stream, ///< a stream9675 psArray *objects, ///< An array of magicRunRow objects9676 bool mdcf ///< format as mdconfig or simple9677 );9678 /** Formats and prints an magicRunRow object9679 *9680 * When mdcf is set the formated output is in psMetadataConfig9681 * format, otherwise it is in a simple tabular format.9682 *9683 * @return true on success9684 */9685 9686 bool magicRunPrintObject(9687 FILE *stream, ///< a stream9688 magicRunRow *object, ///< an magicRunRow object9689 bool mdcf ///< format as mdconfig or simple9690 );9691 /** magicInputSkyfileRow data structure9692 *9693 * Structure for representing a single row of magicInputSkyfile table data.9694 */9695 9696 typedef struct {9697 psS64 magic_id;9698 psS64 diff_id;9699 char *node;9700 } magicInputSkyfileRow;9701 9702 /** Creates a new magicInputSkyfileRow object9703 *9704 * @return A new magicInputSkyfileRow object or NULL on failure.9705 */9706 9707 magicInputSkyfileRow *magicInputSkyfileRowAlloc(9708 psS64 magic_id,9709 psS64 diff_id,9710 const char *node9711 );9712 9713 /** Creates a new magicInputSkyfile table9714 *9715 * @return true on success9716 */9717 9718 bool magicInputSkyfileCreateTable(9719 psDB *dbh ///< Database handle9720 );9721 9722 /** Deletes a magicInputSkyfile table9723 *9724 * @return true on success9725 */9726 9727 bool magicInputSkyfileDropTable(9728 psDB *dbh ///< Database handle9729 );9730 9731 /** Insert a single row into a table9732 *9733 * This function constructs and inserts a single row based on it's parameters.9734 *9735 * @return true on success9736 */9737 9738 bool magicInputSkyfileInsert(9739 psDB *dbh, ///< Database handle9740 psS64 magic_id,9741 psS64 diff_id,9742 const char *node9743 );9744 9745 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9746 *9747 * @return A The number of rows removed or a negative value on error9748 */9749 9750 long long magicInputSkyfileDelete(9751 psDB *dbh, ///< Database handle9752 const psMetadata *where, ///< Row match criteria9753 unsigned long long limit ///< Maximum number of elements to delete9754 );9755 9756 /** Insert a single magicInputSkyfileRow object into a table9757 *9758 * This function constructs and inserts a single row based on it's parameters.9759 *9760 * @return true on success9761 */9762 9763 bool magicInputSkyfileInsertObject(9764 psDB *dbh, ///< Database handle9765 magicInputSkyfileRow *object ///< magicInputSkyfileRow object9766 );9767 9768 /** Insert an array of magicInputSkyfileRow object into a table9769 *9770 * This function constructs and inserts multiple rows based on it's parameters.9771 *9772 * @return true on success9773 */9774 9775 bool magicInputSkyfileInsertObjects(9776 psDB *dbh, ///< Database handle9777 psArray *objects ///< array of magicInputSkyfileRow objects9778 );9779 9780 /** Insert data from a binary FITS table magicInputSkyfileRow into the database9781 *9782 * This function expects a psFits object with a FITS table as the first9783 * extension. The table must have at least one row of data in it, that is of9784 * the appropriate format (number of columns and their type). All other9785 * extensions are ignored.9786 *9787 * @return true on success9788 */9789 9790 bool magicInputSkyfileInsertFits(9791 psDB *dbh, ///< Database handle9792 const psFits *fits ///< psFits object9793 );9794 9795 /** Selects up to limit from the database and returns them in a binary FITS table9796 *9797 * This function assumes an empty psFits object and will create a FITS table9798 * as the first extension.9799 *9800 * See psDBSelectRows() for documentation on the format of where.9801 *9802 * @return true on success9803 */9804 9805 bool magicInputSkyfileSelectRowsFits(9806 psDB *dbh, ///< Database handle9807 psFits *fits, ///< psFits object9808 const psMetadata *where, ///< Row match criteria9809 unsigned long long limit ///< Maximum number of elements to return9810 );9811 9812 /** Convert a magicInputSkyfileRow into an equivalent psMetadata9813 *9814 * @return A psMetadata pointer or NULL on error9815 */9816 9817 psMetadata *magicInputSkyfileMetadataFromObject(9818 const magicInputSkyfileRow *object ///< fooRow to convert into a psMetadata9819 );9820 9821 /** Convert a psMetadata into an equivalent fooRow9822 *9823 * @return A magicInputSkyfileRow pointer or NULL on error9824 */9825 9826 magicInputSkyfileRow *magicInputSkyfileObjectFromMetadata(9827 psMetadata *md ///< psMetadata to convert into a fooRow9828 );9829 /** Selects up to limit rows from the database and returns as magicInputSkyfileRow objects in a psArray9830 *9831 * See psDBSelectRows() for documentation on the format of where.9832 *9833 * @return A psArray pointer or NULL on error9834 */9835 9836 psArray *magicInputSkyfileSelectRowObjects(9837 psDB *dbh, ///< Database handle9838 const psMetadata *where, ///< Row match criteria9839 unsigned long long limit ///< Maximum number of elements to return9840 );9841 /** Deletes a row from the database coresponding to an magicInputSkyfile9842 *9843 * Note that a 'where' search psMetadata is constructed from each object and9844 * used to find rows to delete.9845 *9846 * @return A The number of rows removed or a negative value on error9847 */9848 9849 bool magicInputSkyfileDeleteObject(9850 psDB *dbh, ///< Database handle9851 const magicInputSkyfileRow *object ///< Object to delete9852 );9853 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9854 *9855 * Note that a 'where' search psMetadata is constructed from each object and9856 * used to find rows to delete.9857 *9858 * @return A The number of rows removed or a negative value on error9859 */9860 9861 long long magicInputSkyfileDeleteRowObjects(9862 psDB *dbh, ///< Database handle9863 const psArray *objects, ///< Array of objects to delete9864 unsigned long long limit ///< Maximum number of elements to delete9865 );9866 /** Formats and prints an array of magicInputSkyfileRow objects9867 *9868 * When mdcf is set the formated output is in psMetadataConfig9869 * format, otherwise it is in a simple tabular format.9870 *9871 * @return true on success9872 */9873 9874 bool magicInputSkyfilePrintObjects(9875 FILE *stream, ///< a stream9876 psArray *objects, ///< An array of magicInputSkyfileRow objects9877 bool mdcf ///< format as mdconfig or simple9878 );9879 /** Formats and prints an magicInputSkyfileRow object9880 *9881 * When mdcf is set the formated output is in psMetadataConfig9882 * format, otherwise it is in a simple tabular format.9883 *9884 * @return true on success9885 */9886 9887 bool magicInputSkyfilePrintObject(9888 FILE *stream, ///< a stream9889 magicInputSkyfileRow *object, ///< an magicInputSkyfileRow object9890 bool mdcf ///< format as mdconfig or simple9891 );9892 /** magicTreeRow data structure9893 *9894 * Structure for representing a single row of magicTree table data.9895 */9896 9897 typedef struct {9898 psS64 magic_id;9899 char *node;9900 char *dep;9901 } magicTreeRow;9902 9903 /** Creates a new magicTreeRow object9904 *9905 * @return A new magicTreeRow object or NULL on failure.9906 */9907 9908 magicTreeRow *magicTreeRowAlloc(9909 psS64 magic_id,9910 const char *node,9911 const char *dep9912 );9913 9914 /** Creates a new magicTree table9915 *9916 * @return true on success9917 */9918 9919 bool magicTreeCreateTable(9920 psDB *dbh ///< Database handle9921 );9922 9923 /** Deletes a magicTree table9924 *9925 * @return true on success9926 */9927 9928 bool magicTreeDropTable(9929 psDB *dbh ///< Database handle9930 );9931 9932 /** Insert a single row into a table9933 *9934 * This function constructs and inserts a single row based on it's parameters.9935 *9936 * @return true on success9937 */9938 9939 bool magicTreeInsert(9940 psDB *dbh, ///< Database handle9941 psS64 magic_id,9942 const char *node,9943 const char *dep9944 );9945 9946 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.9947 *9948 * @return A The number of rows removed or a negative value on error9949 */9950 9951 long long magicTreeDelete(9952 psDB *dbh, ///< Database handle9953 const psMetadata *where, ///< Row match criteria9954 unsigned long long limit ///< Maximum number of elements to delete9955 );9956 9957 /** Insert a single magicTreeRow object into a table9958 *9959 * This function constructs and inserts a single row based on it's parameters.9960 *9961 * @return true on success9962 */9963 9964 bool magicTreeInsertObject(9965 psDB *dbh, ///< Database handle9966 magicTreeRow *object ///< magicTreeRow object9967 );9968 9969 /** Insert an array of magicTreeRow object into a table9970 *9971 * This function constructs and inserts multiple rows based on it's parameters.9972 *9973 * @return true on success9974 */9975 9976 bool magicTreeInsertObjects(9977 psDB *dbh, ///< Database handle9978 psArray *objects ///< array of magicTreeRow objects9979 );9980 9981 /** Insert data from a binary FITS table magicTreeRow into the database9982 *9983 * This function expects a psFits object with a FITS table as the first9984 * extension. The table must have at least one row of data in it, that is of9985 * the appropriate format (number of columns and their type). All other9986 * extensions are ignored.9987 *9988 * @return true on success9989 */9990 9991 bool magicTreeInsertFits(9992 psDB *dbh, ///< Database handle9993 const psFits *fits ///< psFits object9994 );9995 9996 /** Selects up to limit from the database and returns them in a binary FITS table9997 *9998 * This function assumes an empty psFits object and will create a FITS table9999 * as the first extension.10000 *10001 * See psDBSelectRows() for documentation on the format of where.10002 *10003 * @return true on success10004 */10005 10006 bool magicTreeSelectRowsFits(10007 psDB *dbh, ///< Database handle10008 psFits *fits, ///< psFits object10009 const psMetadata *where, ///< Row match criteria10010 unsigned long long limit ///< Maximum number of elements to return10011 );10012 10013 /** Convert a magicTreeRow into an equivalent psMetadata10014 *10015 * @return A psMetadata pointer or NULL on error10016 */10017 10018 psMetadata *magicTreeMetadataFromObject(10019 const magicTreeRow *object ///< fooRow to convert into a psMetadata10020 );10021 10022 /** Convert a psMetadata into an equivalent fooRow10023 *10024 * @return A magicTreeRow pointer or NULL on error10025 */10026 10027 magicTreeRow *magicTreeObjectFromMetadata(10028 psMetadata *md ///< psMetadata to convert into a fooRow10029 );10030 /** Selects up to limit rows from the database and returns as magicTreeRow objects in a psArray10031 *10032 * See psDBSelectRows() for documentation on the format of where.10033 *10034 * @return A psArray pointer or NULL on error10035 */10036 10037 psArray *magicTreeSelectRowObjects(10038 psDB *dbh, ///< Database handle10039 const psMetadata *where, ///< Row match criteria10040 unsigned long long limit ///< Maximum number of elements to return10041 );10042 /** Deletes a row from the database coresponding to an magicTree10043 *10044 * Note that a 'where' search psMetadata is constructed from each object and10045 * used to find rows to delete.10046 *10047 * @return A The number of rows removed or a negative value on error10048 */10049 10050 bool magicTreeDeleteObject(10051 psDB *dbh, ///< Database handle10052 const magicTreeRow *object ///< Object to delete10053 );10054 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.10055 *10056 * Note that a 'where' search psMetadata is constructed from each object and10057 * used to find rows to delete.10058 *10059 * @return A The number of rows removed or a negative value on error10060 */10061 10062 long long magicTreeDeleteRowObjects(10063 psDB *dbh, ///< Database handle10064 const psArray *objects, ///< Array of objects to delete10065 unsigned long long limit ///< Maximum number of elements to delete10066 );10067 /** Formats and prints an array of magicTreeRow objects10068 *10069 * When mdcf is set the formated output is in psMetadataConfig10070 * format, otherwise it is in a simple tabular format.10071 *10072 * @return true on success10073 */10074 10075 bool magicTreePrintObjects(10076 FILE *stream, ///< a stream10077 psArray *objects, ///< An array of magicTreeRow objects10078 bool mdcf ///< format as mdconfig or simple10079 );10080 /** Formats and prints an magicTreeRow object10081 *10082 * When mdcf is set the formated output is in psMetadataConfig10083 * format, otherwise it is in a simple tabular format.10084 *10085 * @return true on success10086 */10087 10088 bool magicTreePrintObject(10089 FILE *stream, ///< a stream10090 magicTreeRow *object, ///< an magicTreeRow object10091 bool mdcf ///< format as mdconfig or simple10092 );10093 /** magicNodeResultRow data structure10094 *10095 * Structure for representing a single row of magicNodeResult table data.10096 */10097 10098 typedef struct {10099 psS64 magic_id;10100 char *node;10101 char *uri;10102 } magicNodeResultRow;10103 10104 /** Creates a new magicNodeResultRow object10105 *10106 * @return A new magicNodeResultRow object or NULL on failure.10107 */10108 10109 magicNodeResultRow *magicNodeResultRowAlloc(10110 psS64 magic_id,10111 const char *node,10112 const char *uri10113 );10114 10115 /** Creates a new magicNodeResult table10116 *10117 * @return true on success10118 */10119 10120 bool magicNodeResultCreateTable(10121 psDB *dbh ///< Database handle10122 );10123 10124 /** Deletes a magicNodeResult table10125 *10126 * @return true on success10127 */10128 10129 bool magicNodeResultDropTable(10130 psDB *dbh ///< Database handle10131 );10132 10133 /** Insert a single row into a table10134 *10135 * This function constructs and inserts a single row based on it's parameters.10136 *10137 * @return true on success10138 */10139 10140 bool magicNodeResultInsert(10141 psDB *dbh, ///< Database handle10142 psS64 magic_id,10143 const char *node,10144 const char *uri10145 );10146 10147 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.10148 *10149 * @return A The number of rows removed or a negative value on error10150 */10151 10152 long long magicNodeResultDelete(10153 psDB *dbh, ///< Database handle10154 const psMetadata *where, ///< Row match criteria10155 unsigned long long limit ///< Maximum number of elements to delete10156 );10157 10158 /** Insert a single magicNodeResultRow object into a table10159 *10160 * This function constructs and inserts a single row based on it's parameters.10161 *10162 * @return true on success10163 */10164 10165 bool magicNodeResultInsertObject(10166 psDB *dbh, ///< Database handle10167 magicNodeResultRow *object ///< magicNodeResultRow object10168 );10169 10170 /** Insert an array of magicNodeResultRow object into a table10171 *10172 * This function constructs and inserts multiple rows based on it's parameters.10173 *10174 * @return true on success10175 */10176 10177 bool magicNodeResultInsertObjects(10178 psDB *dbh, ///< Database handle10179 psArray *objects ///< array of magicNodeResultRow objects10180 );10181 10182 /** Insert data from a binary FITS table magicNodeResultRow into the database10183 *10184 * This function expects a psFits object with a FITS table as the first10185 * extension. The table must have at least one row of data in it, that is of10186 * the appropriate format (number of columns and their type). All other10187 * extensions are ignored.10188 *10189 * @return true on success10190 */10191 10192 bool magicNodeResultInsertFits(10193 psDB *dbh, ///< Database handle10194 const psFits *fits ///< psFits object10195 );10196 10197 /** Selects up to limit from the database and returns them in a binary FITS table10198 *10199 * This function assumes an empty psFits object and will create a FITS table10200 * as the first extension.10201 *10202 * See psDBSelectRows() for documentation on the format of where.10203 *10204 * @return true on success10205 */10206 10207 bool magicNodeResultSelectRowsFits(10208 psDB *dbh, ///< Database handle10209 psFits *fits, ///< psFits object10210 const psMetadata *where, ///< Row match criteria10211 unsigned long long limit ///< Maximum number of elements to return10212 );10213 10214 /** Convert a magicNodeResultRow into an equivalent psMetadata10215 *10216 * @return A psMetadata pointer or NULL on error10217 */10218 10219 psMetadata *magicNodeResultMetadataFromObject(10220 const magicNodeResultRow *object ///< fooRow to convert into a psMetadata10221 );10222 10223 /** Convert a psMetadata into an equivalent fooRow10224 *10225 * @return A magicNodeResultRow pointer or NULL on error10226 */10227 10228 magicNodeResultRow *magicNodeResultObjectFromMetadata(10229 psMetadata *md ///< psMetadata to convert into a fooRow10230 );10231 /** Selects up to limit rows from the database and returns as magicNodeResultRow objects in a psArray10232 *10233 * See psDBSelectRows() for documentation on the format of where.10234 *10235 * @return A psArray pointer or NULL on error10236 */10237 10238 psArray *magicNodeResultSelectRowObjects(10239 psDB *dbh, ///< Database handle10240 const psMetadata *where, ///< Row match criteria10241 unsigned long long limit ///< Maximum number of elements to return10242 );10243 /** Deletes a row from the database coresponding to an magicNodeResult10244 *10245 * Note that a 'where' search psMetadata is constructed from each object and10246 * used to find rows to delete.10247 *10248 * @return A The number of rows removed or a negative value on error10249 */10250 10251 bool magicNodeResultDeleteObject(10252 psDB *dbh, ///< Database handle10253 const magicNodeResultRow *object ///< Object to delete10254 );10255 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.10256 *10257 * Note that a 'where' search psMetadata is constructed from each object and10258 * used to find rows to delete.10259 *10260 * @return A The number of rows removed or a negative value on error10261 */10262 10263 long long magicNodeResultDeleteRowObjects(10264 psDB *dbh, ///< Database handle10265 const psArray *objects, ///< Array of objects to delete10266 unsigned long long limit ///< Maximum number of elements to delete10267 );10268 /** Formats and prints an array of magicNodeResultRow objects10269 *10270 * When mdcf is set the formated output is in psMetadataConfig10271 * format, otherwise it is in a simple tabular format.10272 *10273 * @return true on success10274 */10275 10276 bool magicNodeResultPrintObjects(10277 FILE *stream, ///< a stream10278 psArray *objects, ///< An array of magicNodeResultRow objects10279 bool mdcf ///< format as mdconfig or simple10280 );10281 /** Formats and prints an magicNodeResultRow object10282 *10283 * When mdcf is set the formated output is in psMetadataConfig10284 * format, otherwise it is in a simple tabular format.10285 *10286 * @return true on success10287 */10288 10289 bool magicNodeResultPrintObject(10290 FILE *stream, ///< a stream10291 magicNodeResultRow *object, ///< an magicNodeResultRow object10292 bool mdcf ///< format as mdconfig or simple10293 );10294 /** magicMaskRow data structure10295 *10296 * Structure for representing a single row of magicMask table data.10297 */10298 10299 typedef struct {10300 psS64 magic_id;10301 char *uri;10302 } magicMaskRow;10303 10304 /** Creates a new magicMaskRow object10305 *10306 * @return A new magicMaskRow object or NULL on failure.10307 */10308 10309 magicMaskRow *magicMaskRowAlloc(10310 psS64 magic_id,10311 const char *uri10312 );10313 10314 /** Creates a new magicMask table10315 *10316 * @return true on success10317 */10318 10319 bool magicMaskCreateTable(10320 psDB *dbh ///< Database handle10321 );10322 10323 /** Deletes a magicMask table10324 *10325 * @return true on success10326 */10327 10328 bool magicMaskDropTable(10329 psDB *dbh ///< Database handle10330 );10331 10332 /** Insert a single row into a table10333 *10334 * This function constructs and inserts a single row based on it's parameters.10335 *10336 * @return true on success10337 */10338 10339 bool magicMaskInsert(10340 psDB *dbh, ///< Database handle10341 psS64 magic_id,10342 const char *uri10343 );10344 10345 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.10346 *10347 * @return A The number of rows removed or a negative value on error10348 */10349 10350 long long magicMaskDelete(10351 psDB *dbh, ///< Database handle10352 const psMetadata *where, ///< Row match criteria10353 unsigned long long limit ///< Maximum number of elements to delete10354 );10355 10356 /** Insert a single magicMaskRow object into a table10357 *10358 * This function constructs and inserts a single row based on it's parameters.10359 *10360 * @return true on success10361 */10362 10363 bool magicMaskInsertObject(10364 psDB *dbh, ///< Database handle10365 magicMaskRow *object ///< magicMaskRow object10366 );10367 10368 /** Insert an array of magicMaskRow object into a table10369 *10370 * This function constructs and inserts multiple rows based on it's parameters.10371 *10372 * @return true on success10373 */10374 10375 bool magicMaskInsertObjects(10376 psDB *dbh, ///< Database handle10377 psArray *objects ///< array of magicMaskRow objects10378 );10379 10380 /** Insert data from a binary FITS table magicMaskRow into the database10381 *10382 * This function expects a psFits object with a FITS table as the first10383 * extension. The table must have at least one row of data in it, that is of10384 * the appropriate format (number of columns and their type). All other10385 * extensions are ignored.10386 *10387 * @return true on success10388 */10389 10390 bool magicMaskInsertFits(10391 psDB *dbh, ///< Database handle10392 const psFits *fits ///< psFits object10393 );10394 10395 /** Selects up to limit from the database and returns them in a binary FITS table10396 *10397 * This function assumes an empty psFits object and will create a FITS table10398 * as the first extension.10399 *10400 * See psDBSelectRows() for documentation on the format of where.10401 *10402 * @return true on success10403 */10404 10405 bool magicMaskSelectRowsFits(10406 psDB *dbh, ///< Database handle10407 psFits *fits, ///< psFits object10408 const psMetadata *where, ///< Row match criteria10409 unsigned long long limit ///< Maximum number of elements to return10410 );10411 10412 /** Convert a magicMaskRow into an equivalent psMetadata10413 *10414 * @return A psMetadata pointer or NULL on error10415 */10416 10417 psMetadata *magicMaskMetadataFromObject(10418 const magicMaskRow *object ///< fooRow to convert into a psMetadata10419 );10420 10421 /** Convert a psMetadata into an equivalent fooRow10422 *10423 * @return A magicMaskRow pointer or NULL on error10424 */10425 10426 magicMaskRow *magicMaskObjectFromMetadata(10427 psMetadata *md ///< psMetadata to convert into a fooRow10428 );10429 /** Selects up to limit rows from the database and returns as magicMaskRow objects in a psArray10430 *10431 * See psDBSelectRows() for documentation on the format of where.10432 *10433 * @return A psArray pointer or NULL on error10434 */10435 10436 psArray *magicMaskSelectRowObjects(10437 psDB *dbh, ///< Database handle10438 const psMetadata *where, ///< Row match criteria10439 unsigned long long limit ///< Maximum number of elements to return10440 );10441 /** Deletes a row from the database coresponding to an magicMask10442 *10443 * Note that a 'where' search psMetadata is constructed from each object and10444 * used to find rows to delete.10445 *10446 * @return A The number of rows removed or a negative value on error10447 */10448 10449 bool magicMaskDeleteObject(10450 psDB *dbh, ///< Database handle10451 const magicMaskRow *object ///< Object to delete10452 );10453 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.10454 *10455 * Note that a 'where' search psMetadata is constructed from each object and10456 * used to find rows to delete.10457 *10458 * @return A The number of rows removed or a negative value on error10459 */10460 10461 long long magicMaskDeleteRowObjects(10462 psDB *dbh, ///< Database handle10463 const psArray *objects, ///< Array of objects to delete10464 unsigned long long limit ///< Maximum number of elements to delete10465 );10466 /** Formats and prints an array of magicMaskRow objects10467 *10468 * When mdcf is set the formated output is in psMetadataConfig10469 * format, otherwise it is in a simple tabular format.10470 *10471 * @return true on success10472 */10473 10474 bool magicMaskPrintObjects(10475 FILE *stream, ///< a stream10476 psArray *objects, ///< An array of magicMaskRow objects10477 bool mdcf ///< format as mdconfig or simple10478 );10479 /** Formats and prints an magicMaskRow object10480 *10481 * When mdcf is set the formated output is in psMetadataConfig10482 * format, otherwise it is in a simple tabular format.10483 *10484 * @return true on success10485 */10486 10487 bool magicMaskPrintObject(10488 FILE *stream, ///< a stream10489 magicMaskRow *object, ///< an magicMaskRow object10490 bool mdcf ///< format as mdconfig or simple10491 );10492 /** magicSkyfileMaskRow data structure10493 *10494 * Structure for representing a single row of magicSkyfileMask table data.10495 */10496 10497 typedef struct {10498 psS64 magic_id;10499 psS64 diff_id;10500 char *uri;10501 } magicSkyfileMaskRow;10502 10503 /** Creates a new magicSkyfileMaskRow object10504 *10505 * @return A new magicSkyfileMaskRow object or NULL on failure.10506 */10507 10508 magicSkyfileMaskRow *magicSkyfileMaskRowAlloc(10509 psS64 magic_id,10510 psS64 diff_id,10511 const char *uri10512 );10513 10514 /** Creates a new magicSkyfileMask table10515 *10516 * @return true on success10517 */10518 10519 bool magicSkyfileMaskCreateTable(10520 psDB *dbh ///< Database handle10521 );10522 10523 /** Deletes a magicSkyfileMask table10524 *10525 * @return true on success10526 */10527 10528 bool magicSkyfileMaskDropTable(10529 psDB *dbh ///< Database handle10530 );10531 10532 /** Insert a single row into a table10533 *10534 * This function constructs and inserts a single row based on it's parameters.10535 *10536 * @return true on success10537 */10538 10539 bool magicSkyfileMaskInsert(10540 psDB *dbh, ///< Database handle10541 psS64 magic_id,10542 psS64 diff_id,10543 const char *uri10544 );10545 10546 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.10547 *10548 * @return A The number of rows removed or a negative value on error10549 */10550 10551 long long magicSkyfileMaskDelete(10552 psDB *dbh, ///< Database handle10553 const psMetadata *where, ///< Row match criteria10554 unsigned long long limit ///< Maximum number of elements to delete10555 );10556 10557 /** Insert a single magicSkyfileMaskRow object into a table10558 *10559 * This function constructs and inserts a single row based on it's parameters.10560 *10561 * @return true on success10562 */10563 10564 bool magicSkyfileMaskInsertObject(10565 psDB *dbh, ///< Database handle10566 magicSkyfileMaskRow *object ///< magicSkyfileMaskRow object10567 );10568 10569 /** Insert an array of magicSkyfileMaskRow object into a table10570 *10571 * This function constructs and inserts multiple rows based on it's parameters.10572 *10573 * @return true on success10574 */10575 10576 bool magicSkyfileMaskInsertObjects(10577 psDB *dbh, ///< Database handle10578 psArray *objects ///< array of magicSkyfileMaskRow objects10579 );10580 10581 /** Insert data from a binary FITS table magicSkyfileMaskRow into the database10582 *10583 * This function expects a psFits object with a FITS table as the first10584 * extension. The table must have at least one row of data in it, that is of10585 * the appropriate format (number of columns and their type). All other10586 * extensions are ignored.10587 *10588 * @return true on success10589 */10590 10591 bool magicSkyfileMaskInsertFits(10592 psDB *dbh, ///< Database handle10593 const psFits *fits ///< psFits object10594 );10595 10596 /** Selects up to limit from the database and returns them in a binary FITS table10597 *10598 * This function assumes an empty psFits object and will create a FITS table10599 * as the first extension.10600 *10601 * See psDBSelectRows() for documentation on the format of where.10602 *10603 * @return true on success10604 */10605 10606 bool magicSkyfileMaskSelectRowsFits(10607 psDB *dbh, ///< Database handle10608 psFits *fits, ///< psFits object10609 const psMetadata *where, ///< Row match criteria10610 unsigned long long limit ///< Maximum number of elements to return10611 );10612 10613 /** Convert a magicSkyfileMaskRow into an equivalent psMetadata10614 *10615 * @return A psMetadata pointer or NULL on error10616 */10617 10618 psMetadata *magicSkyfileMaskMetadataFromObject(10619 const magicSkyfileMaskRow *object ///< fooRow to convert into a psMetadata10620 );10621 10622 /** Convert a psMetadata into an equivalent fooRow10623 *10624 * @return A magicSkyfileMaskRow pointer or NULL on error10625 */10626 10627 magicSkyfileMaskRow *magicSkyfileMaskObjectFromMetadata(10628 psMetadata *md ///< psMetadata to convert into a fooRow10629 );10630 /** Selects up to limit rows from the database and returns as magicSkyfileMaskRow objects in a psArray10631 *10632 * See psDBSelectRows() for documentation on the format of where.10633 *10634 * @return A psArray pointer or NULL on error10635 */10636 10637 psArray *magicSkyfileMaskSelectRowObjects(10638 psDB *dbh, ///< Database handle10639 const psMetadata *where, ///< Row match criteria10640 unsigned long long limit ///< Maximum number of elements to return10641 );10642 /** Deletes a row from the database coresponding to an magicSkyfileMask10643 *10644 * Note that a 'where' search psMetadata is constructed from each object and10645 * used to find rows to delete.10646 *10647 * @return A The number of rows removed or a negative value on error10648 */10649 10650 bool magicSkyfileMaskDeleteObject(10651 psDB *dbh, ///< Database handle10652 const magicSkyfileMaskRow *object ///< Object to delete10653 );10654 /** Deletes up to limit rows from the database and returns the number of rows actually deleted.10655 *10656 * Note that a 'where' search psMetadata is constructed from each object and10657 * used to find rows to delete.10658 *10659 * @return A The number of rows removed or a negative value on error10660 */10661 10662 long long magicSkyfileMaskDeleteRowObjects(10663 psDB *dbh, ///< Database handle10664 const psArray *objects, ///< Array of objects to delete10665 unsigned long long limit ///< Maximum number of elements to delete10666 );10667 /** Formats and prints an array of magicSkyfileMaskRow objects10668 *10669 * When mdcf is set the formated output is in psMetadataConfig10670 * format, otherwise it is in a simple tabular format.10671 *10672 * @return true on success10673 */10674 10675 bool magicSkyfileMaskPrintObjects(10676 FILE *stream, ///< a stream10677 psArray *objects, ///< An array of magicSkyfileMaskRow objects10678 bool mdcf ///< format as mdconfig or simple10679 );10680 /** Formats and prints an magicSkyfileMaskRow object10681 *10682 * When mdcf is set the formated output is in psMetadataConfig10683 * format, otherwise it is in a simple tabular format.10684 *10685 * @return true on success10686 */10687 10688 bool magicSkyfileMaskPrintObject(10689 FILE *stream, ///< a stream10690 magicSkyfileMaskRow *object, ///< an magicSkyfileMaskRow object10691 bool mdcf ///< format as mdconfig or simple10692 );10693 8776 10694 8777 /// @} … … 10698 8781 #endif 10699 8782 10700 #endif // MAGICSKYFILEMASK_DB_H8783 #endif // DETRUNSUMMARY_DB_H
Note:
See TracChangeset
for help on using the changeset viewer.
