Changeset 11809 for trunk/ippdb/src/ippdb.c
- Timestamp:
- Feb 14, 2007, 4:02:28 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/ippdb/src/ippdb.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippdb/src/ippdb.c
r11780 r11809 66 66 #define P4SKYCELLMAP_TABLE_NAME "p4SkyCellMap" 67 67 #define P4SCFILE_TABLE_NAME "p4Scfile" 68 #define P5RUN_TABLE_NAME "p5Run" 69 #define P5INPUTSCFILE_TABLE_NAME "p5InputScfile" 70 #define P5DIFFSCFILE_TABLE_NAME "p5DiffScfile" 68 71 #define MAX_STRING_LENGTH 1024 69 72 … … 14960 14963 return true; 14961 14964 } 14965 static void p5RunRowFree(p5RunRow *object); 14966 14967 p5RunRow *p5RunRowAlloc(psS32 p5_id, const char *state, const char *workdir, psTime* registered) 14968 { 14969 p5RunRow *_object; 14970 14971 _object = psAlloc(sizeof(p5RunRow)); 14972 psMemSetDeallocator(_object, (psFreeFunc)p5RunRowFree); 14973 14974 _object->p5_id = p5_id; 14975 _object->state = psStringCopy(state); 14976 _object->workdir = psStringCopy(workdir); 14977 _object->registered = psTimeCopy(registered); 14978 14979 return _object; 14980 } 14981 14982 static void p5RunRowFree(p5RunRow *object) 14983 { 14984 psFree(object->state); 14985 psFree(object->workdir); 14986 psFree(object->registered); 14987 } 14988 14989 bool p5RunCreateTable(psDB *dbh) 14990 { 14991 psMetadata *md = psMetadataAlloc(); 14992 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, "Primary Key AUTO_INCREMENT", 0)) { 14993 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 14994 psFree(md); 14995 return false; 14996 } 14997 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) { 14998 psError(PS_ERR_UNKNOWN, false, "failed to add item state"); 14999 psFree(md); 15000 return false; 15001 } 15002 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) { 15003 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir"); 15004 psFree(md); 15005 return false; 15006 } 15007 if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, NULL)) { 15008 psError(PS_ERR_UNKNOWN, false, "failed to add item registered"); 15009 psFree(md); 15010 return false; 15011 } 15012 15013 bool status = psDBCreateTable(dbh, P5RUN_TABLE_NAME, md); 15014 15015 psFree(md); 15016 15017 return status; 15018 } 15019 15020 bool p5RunDropTable(psDB *dbh) 15021 { 15022 return psDBDropTable(dbh, P5RUN_TABLE_NAME); 15023 } 15024 15025 bool p5RunInsert(psDB * dbh, psS32 p5_id, const char *state, const char *workdir, psTime* registered) 15026 { 15027 psMetadata *md = psMetadataAlloc(); 15028 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, p5_id)) { 15029 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15030 psFree(md); 15031 return false; 15032 } 15033 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) { 15034 psError(PS_ERR_UNKNOWN, false, "failed to add item state"); 15035 psFree(md); 15036 return false; 15037 } 15038 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) { 15039 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir"); 15040 psFree(md); 15041 return false; 15042 } 15043 if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, registered)) { 15044 psError(PS_ERR_UNKNOWN, false, "failed to add item registered"); 15045 psFree(md); 15046 return false; 15047 } 15048 15049 bool status = psDBInsertOneRow(dbh, P5RUN_TABLE_NAME, md); 15050 psFree(md); 15051 15052 return status; 15053 } 15054 15055 long long p5RunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 15056 { 15057 long long deleted = 0; 15058 15059 long long count = psDBDeleteRows(dbh, P5RUN_TABLE_NAME, where, limit); 15060 if (count < 0) { 15061 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5Run"); 15062 return count; 15063 15064 deleted += count; 15065 } 15066 15067 return deleted; 15068 } 15069 bool p5RunInsertObject(psDB *dbh, p5RunRow *object) 15070 { 15071 return p5RunInsert(dbh, object->p5_id, object->state, object->workdir, object->registered); 15072 } 15073 15074 bool p5RunInsertObjects(psDB *dbh, psArray *objects) 15075 { 15076 for (long i = 0; i < psArrayLength(objects); i++) { 15077 if (!p5RunInsertObject(dbh, objects->data[i])) { 15078 return false; 15079 } 15080 } 15081 15082 return true; 15083 } 15084 15085 bool p5RunInsertFits(psDB *dbh, const psFits *fits) 15086 { 15087 psArray *rowSet; 15088 15089 // move to (the first?) extension named P5RUN_TABLE_NAME 15090 if (!psFitsMoveExtName(fits, P5RUN_TABLE_NAME)) { 15091 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P5RUN_TABLE_NAME); 15092 return false; 15093 } 15094 15095 // check HDU type 15096 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 15097 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 15098 return false; 15099 } 15100 15101 // read fits table 15102 rowSet = psFitsReadTable(fits); 15103 if (!rowSet) { 15104 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 15105 psFree(rowSet); 15106 return false; 15107 } 15108 15109 if (!psDBInsertRows(dbh, P5RUN_TABLE_NAME, rowSet)) { 15110 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 15111 psFree(rowSet); 15112 return false; 15113 } 15114 15115 psFree(rowSet); 15116 15117 return true; 15118 } 15119 15120 bool p5RunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 15121 { 15122 psArray *rowSet; 15123 15124 rowSet = psDBSelectRows(dbh, P5RUN_TABLE_NAME, where, limit); 15125 if (!rowSet) { 15126 return false; 15127 } 15128 15129 // output to fits 15130 if (!psFitsWriteTable(fits, NULL, rowSet, P5RUN_TABLE_NAME)) { 15131 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 15132 psFree(rowSet); 15133 return false; 15134 } 15135 15136 psFree(rowSet); 15137 15138 return true; 15139 } 15140 15141 psMetadata *p5RunMetadataFromObject(const p5RunRow *object) 15142 { 15143 psMetadata *md = psMetadataAlloc(); 15144 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, object->p5_id)) { 15145 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15146 psFree(md); 15147 return false; 15148 } 15149 if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) { 15150 psError(PS_ERR_UNKNOWN, false, "failed to add item state"); 15151 psFree(md); 15152 return false; 15153 } 15154 if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) { 15155 psError(PS_ERR_UNKNOWN, false, "failed to add item workdir"); 15156 psFree(md); 15157 return false; 15158 } 15159 if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, object->registered)) { 15160 psError(PS_ERR_UNKNOWN, false, "failed to add item registered"); 15161 psFree(md); 15162 return false; 15163 } 15164 15165 15166 return md; 15167 } 15168 15169 p5RunRow *p5RunObjectFromMetadata(psMetadata *md) 15170 { 15171 15172 bool status = false; 15173 psS32 p5_id = psMetadataLookupS32(&status, md, "p5_id"); 15174 if (!status) { 15175 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p5_id"); 15176 return false; 15177 } 15178 char* state = psMetadataLookupPtr(&status, md, "state"); 15179 if (!status) { 15180 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state"); 15181 return false; 15182 } 15183 char* workdir = psMetadataLookupPtr(&status, md, "workdir"); 15184 if (!status) { 15185 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir"); 15186 return false; 15187 } 15188 psTime* registered = psMetadataLookupPtr(&status, md, "registered"); 15189 if (!status) { 15190 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item registered"); 15191 return false; 15192 } 15193 15194 return p5RunRowAlloc(p5_id, state, workdir, registered); 15195 } 15196 psArray *p5RunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 15197 { 15198 psArray *rowSet; 15199 psArray *returnSet; 15200 psU64 i; 15201 15202 rowSet = psDBSelectRows(dbh, P5RUN_TABLE_NAME, where, limit); 15203 if (!rowSet) { 15204 return NULL; 15205 } 15206 15207 // convert psMetadata rows to row objects 15208 15209 returnSet = psArrayAllocEmpty(rowSet->n); 15210 15211 for (i = 0; i < rowSet->n; i++) { 15212 p5RunRow *object = p5RunObjectFromMetadata(rowSet->data[i]); 15213 psArrayAdd(returnSet, 0, object); 15214 psFree(object); 15215 } 15216 15217 psFree(rowSet); 15218 15219 return returnSet; 15220 } 15221 bool p5RunDeleteObject(psDB *dbh, const p5RunRow *object) 15222 { 15223 psMetadata *where = p5RunMetadataFromObject(object); 15224 long long count = psDBDeleteRows(dbh, P5RUN_TABLE_NAME, where, 0); 15225 psFree(where); 15226 if (count < 0) { 15227 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5Run"); 15228 return false; 15229 } 15230 if (count > 1) { 15231 // XXX should this be a psAbort() instead? It is possible that 15232 // having an object match multiple rows was by design. 15233 psError(PS_ERR_UNKNOWN, true, "p5RunRow object matched more then one row. Check your database schema"); 15234 return false; 15235 } 15236 15237 return true; 15238 } 15239 long long p5RunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 15240 { 15241 long long deleted = 0; 15242 15243 for (long long i = 0; i < objects->n; i++) { 15244 p5RunRow *object = objects->data[i]; 15245 psMetadata *where = p5RunMetadataFromObject(object); 15246 long long count = psDBDeleteRows(dbh, P5RUN_TABLE_NAME, where, limit); 15247 psFree(where); 15248 if (count < 0) { 15249 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5Run"); 15250 return count; 15251 } 15252 15253 deleted += count; 15254 } 15255 15256 return deleted; 15257 } 15258 bool p5RunPrintObjects(FILE *stream, psArray *objects, bool mdcf) 15259 { 15260 PS_ASSERT_PTR_NON_NULL(objects, false); 15261 15262 psMetadata *output = psMetadataAlloc(); 15263 for (long i = 0; i < psArrayLength(objects); i++) { 15264 psMetadata *md = p5RunMetadataFromObject(objects->data[i]); 15265 if (!psMetadataAddMetadata( 15266 output, 15267 PS_LIST_TAIL, 15268 P5RUN_TABLE_NAME, 15269 PS_META_DUPLICATE_OK, 15270 NULL, 15271 md 15272 )) { 15273 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 15274 psFree(md); 15275 psFree(output); 15276 return false; 15277 } 15278 psFree(md); 15279 } 15280 15281 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 15282 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 15283 psFree(output); 15284 } 15285 psFree(output); 15286 15287 return true; 15288 } 15289 bool p5RunPrintObject(FILE *stream, p5RunRow *object, bool mdcf) 15290 { 15291 PS_ASSERT_PTR_NON_NULL(object, false); 15292 15293 psMetadata *md = p5RunMetadataFromObject(object); 15294 15295 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 15296 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 15297 psFree(md); 15298 } 15299 15300 psFree(md); 15301 15302 return true; 15303 } 15304 static void p5InputScfileRowFree(p5InputScfileRow *object); 15305 15306 p5InputScfileRow *p5InputScfileRowAlloc(psS32 p5_id, psS32 p4_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind, bool template) 15307 { 15308 p5InputScfileRow *_object; 15309 15310 _object = psAlloc(sizeof(p5InputScfileRow)); 15311 psMemSetDeallocator(_object, (psFreeFunc)p5InputScfileRowFree); 15312 15313 _object->p5_id = p5_id; 15314 _object->p4_id = p4_id; 15315 _object->skycell_id = psStringCopy(skycell_id); 15316 _object->tess_id = psStringCopy(tess_id); 15317 _object->exp_tag = psStringCopy(exp_tag); 15318 _object->p3_version = p3_version; 15319 _object->kind = psStringCopy(kind); 15320 _object->template = template; 15321 15322 return _object; 15323 } 15324 15325 static void p5InputScfileRowFree(p5InputScfileRow *object) 15326 { 15327 psFree(object->skycell_id); 15328 psFree(object->tess_id); 15329 psFree(object->exp_tag); 15330 psFree(object->kind); 15331 } 15332 15333 bool p5InputScfileCreateTable(psDB *dbh) 15334 { 15335 psMetadata *md = psMetadataAlloc(); 15336 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, "Primary Key", 0)) { 15337 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15338 psFree(md); 15339 return false; 15340 } 15341 if (!psMetadataAdd(md, PS_LIST_TAIL, "p4_id", PS_DATA_S32, "Primary Key", 0)) { 15342 psError(PS_ERR_UNKNOWN, false, "failed to add item p4_id"); 15343 psFree(md); 15344 return false; 15345 } 15346 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, "Primary Key", "64")) { 15347 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 15348 psFree(md); 15349 return false; 15350 } 15351 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, "Primary Key", "64")) { 15352 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 15353 psFree(md); 15354 return false; 15355 } 15356 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) { 15357 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag"); 15358 psFree(md); 15359 return false; 15360 } 15361 if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, "Primary Key", 0)) { 15362 psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version"); 15363 psFree(md); 15364 return false; 15365 } 15366 if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, "Key", "64")) { 15367 psError(PS_ERR_UNKNOWN, false, "failed to add item kind"); 15368 psFree(md); 15369 return false; 15370 } 15371 if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, 0)) { 15372 psError(PS_ERR_UNKNOWN, false, "failed to add item template"); 15373 psFree(md); 15374 return false; 15375 } 15376 15377 bool status = psDBCreateTable(dbh, P5INPUTSCFILE_TABLE_NAME, md); 15378 15379 psFree(md); 15380 15381 return status; 15382 } 15383 15384 bool p5InputScfileDropTable(psDB *dbh) 15385 { 15386 return psDBDropTable(dbh, P5INPUTSCFILE_TABLE_NAME); 15387 } 15388 15389 bool p5InputScfileInsert(psDB * dbh, psS32 p5_id, psS32 p4_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind, bool template) 15390 { 15391 psMetadata *md = psMetadataAlloc(); 15392 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, p5_id)) { 15393 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15394 psFree(md); 15395 return false; 15396 } 15397 if (!psMetadataAdd(md, PS_LIST_TAIL, "p4_id", PS_DATA_S32, NULL, p4_id)) { 15398 psError(PS_ERR_UNKNOWN, false, "failed to add item p4_id"); 15399 psFree(md); 15400 return false; 15401 } 15402 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) { 15403 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 15404 psFree(md); 15405 return false; 15406 } 15407 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) { 15408 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 15409 psFree(md); 15410 return false; 15411 } 15412 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) { 15413 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag"); 15414 psFree(md); 15415 return false; 15416 } 15417 if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, p3_version)) { 15418 psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version"); 15419 psFree(md); 15420 return false; 15421 } 15422 if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, kind)) { 15423 psError(PS_ERR_UNKNOWN, false, "failed to add item kind"); 15424 psFree(md); 15425 return false; 15426 } 15427 if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, template)) { 15428 psError(PS_ERR_UNKNOWN, false, "failed to add item template"); 15429 psFree(md); 15430 return false; 15431 } 15432 15433 bool status = psDBInsertOneRow(dbh, P5INPUTSCFILE_TABLE_NAME, md); 15434 psFree(md); 15435 15436 return status; 15437 } 15438 15439 long long p5InputScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 15440 { 15441 long long deleted = 0; 15442 15443 long long count = psDBDeleteRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit); 15444 if (count < 0) { 15445 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5InputScfile"); 15446 return count; 15447 15448 deleted += count; 15449 } 15450 15451 return deleted; 15452 } 15453 bool p5InputScfileInsertObject(psDB *dbh, p5InputScfileRow *object) 15454 { 15455 return p5InputScfileInsert(dbh, object->p5_id, object->p4_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->kind, object->template); 15456 } 15457 15458 bool p5InputScfileInsertObjects(psDB *dbh, psArray *objects) 15459 { 15460 for (long i = 0; i < psArrayLength(objects); i++) { 15461 if (!p5InputScfileInsertObject(dbh, objects->data[i])) { 15462 return false; 15463 } 15464 } 15465 15466 return true; 15467 } 15468 15469 bool p5InputScfileInsertFits(psDB *dbh, const psFits *fits) 15470 { 15471 psArray *rowSet; 15472 15473 // move to (the first?) extension named P5INPUTSCFILE_TABLE_NAME 15474 if (!psFitsMoveExtName(fits, P5INPUTSCFILE_TABLE_NAME)) { 15475 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P5INPUTSCFILE_TABLE_NAME); 15476 return false; 15477 } 15478 15479 // check HDU type 15480 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 15481 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 15482 return false; 15483 } 15484 15485 // read fits table 15486 rowSet = psFitsReadTable(fits); 15487 if (!rowSet) { 15488 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 15489 psFree(rowSet); 15490 return false; 15491 } 15492 15493 if (!psDBInsertRows(dbh, P5INPUTSCFILE_TABLE_NAME, rowSet)) { 15494 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 15495 psFree(rowSet); 15496 return false; 15497 } 15498 15499 psFree(rowSet); 15500 15501 return true; 15502 } 15503 15504 bool p5InputScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 15505 { 15506 psArray *rowSet; 15507 15508 rowSet = psDBSelectRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit); 15509 if (!rowSet) { 15510 return false; 15511 } 15512 15513 // output to fits 15514 if (!psFitsWriteTable(fits, NULL, rowSet, P5INPUTSCFILE_TABLE_NAME)) { 15515 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 15516 psFree(rowSet); 15517 return false; 15518 } 15519 15520 psFree(rowSet); 15521 15522 return true; 15523 } 15524 15525 psMetadata *p5InputScfileMetadataFromObject(const p5InputScfileRow *object) 15526 { 15527 psMetadata *md = psMetadataAlloc(); 15528 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, object->p5_id)) { 15529 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15530 psFree(md); 15531 return false; 15532 } 15533 if (!psMetadataAdd(md, PS_LIST_TAIL, "p4_id", PS_DATA_S32, NULL, object->p4_id)) { 15534 psError(PS_ERR_UNKNOWN, false, "failed to add item p4_id"); 15535 psFree(md); 15536 return false; 15537 } 15538 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) { 15539 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 15540 psFree(md); 15541 return false; 15542 } 15543 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) { 15544 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 15545 psFree(md); 15546 return false; 15547 } 15548 if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) { 15549 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag"); 15550 psFree(md); 15551 return false; 15552 } 15553 if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, object->p3_version)) { 15554 psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version"); 15555 psFree(md); 15556 return false; 15557 } 15558 if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, object->kind)) { 15559 psError(PS_ERR_UNKNOWN, false, "failed to add item kind"); 15560 psFree(md); 15561 return false; 15562 } 15563 if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, object->template)) { 15564 psError(PS_ERR_UNKNOWN, false, "failed to add item template"); 15565 psFree(md); 15566 return false; 15567 } 15568 15569 15570 return md; 15571 } 15572 15573 p5InputScfileRow *p5InputScfileObjectFromMetadata(psMetadata *md) 15574 { 15575 15576 bool status = false; 15577 psS32 p5_id = psMetadataLookupS32(&status, md, "p5_id"); 15578 if (!status) { 15579 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p5_id"); 15580 return false; 15581 } 15582 psS32 p4_id = psMetadataLookupS32(&status, md, "p4_id"); 15583 if (!status) { 15584 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p4_id"); 15585 return false; 15586 } 15587 char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id"); 15588 if (!status) { 15589 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id"); 15590 return false; 15591 } 15592 char* tess_id = psMetadataLookupPtr(&status, md, "tess_id"); 15593 if (!status) { 15594 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id"); 15595 return false; 15596 } 15597 char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag"); 15598 if (!status) { 15599 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag"); 15600 return false; 15601 } 15602 psS32 p3_version = psMetadataLookupS32(&status, md, "p3_version"); 15603 if (!status) { 15604 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p3_version"); 15605 return false; 15606 } 15607 char* kind = psMetadataLookupPtr(&status, md, "kind"); 15608 if (!status) { 15609 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kind"); 15610 return false; 15611 } 15612 bool template = psMetadataLookupBool(&status, md, "template"); 15613 if (!status) { 15614 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item template"); 15615 return false; 15616 } 15617 15618 return p5InputScfileRowAlloc(p5_id, p4_id, skycell_id, tess_id, exp_tag, p3_version, kind, template); 15619 } 15620 psArray *p5InputScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 15621 { 15622 psArray *rowSet; 15623 psArray *returnSet; 15624 psU64 i; 15625 15626 rowSet = psDBSelectRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit); 15627 if (!rowSet) { 15628 return NULL; 15629 } 15630 15631 // convert psMetadata rows to row objects 15632 15633 returnSet = psArrayAllocEmpty(rowSet->n); 15634 15635 for (i = 0; i < rowSet->n; i++) { 15636 p5InputScfileRow *object = p5InputScfileObjectFromMetadata(rowSet->data[i]); 15637 psArrayAdd(returnSet, 0, object); 15638 psFree(object); 15639 } 15640 15641 psFree(rowSet); 15642 15643 return returnSet; 15644 } 15645 bool p5InputScfileDeleteObject(psDB *dbh, const p5InputScfileRow *object) 15646 { 15647 psMetadata *where = p5InputScfileMetadataFromObject(object); 15648 long long count = psDBDeleteRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, 0); 15649 psFree(where); 15650 if (count < 0) { 15651 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5InputScfile"); 15652 return false; 15653 } 15654 if (count > 1) { 15655 // XXX should this be a psAbort() instead? It is possible that 15656 // having an object match multiple rows was by design. 15657 psError(PS_ERR_UNKNOWN, true, "p5InputScfileRow object matched more then one row. Check your database schema"); 15658 return false; 15659 } 15660 15661 return true; 15662 } 15663 long long p5InputScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 15664 { 15665 long long deleted = 0; 15666 15667 for (long long i = 0; i < objects->n; i++) { 15668 p5InputScfileRow *object = objects->data[i]; 15669 psMetadata *where = p5InputScfileMetadataFromObject(object); 15670 long long count = psDBDeleteRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit); 15671 psFree(where); 15672 if (count < 0) { 15673 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5InputScfile"); 15674 return count; 15675 } 15676 15677 deleted += count; 15678 } 15679 15680 return deleted; 15681 } 15682 bool p5InputScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf) 15683 { 15684 PS_ASSERT_PTR_NON_NULL(objects, false); 15685 15686 psMetadata *output = psMetadataAlloc(); 15687 for (long i = 0; i < psArrayLength(objects); i++) { 15688 psMetadata *md = p5InputScfileMetadataFromObject(objects->data[i]); 15689 if (!psMetadataAddMetadata( 15690 output, 15691 PS_LIST_TAIL, 15692 P5INPUTSCFILE_TABLE_NAME, 15693 PS_META_DUPLICATE_OK, 15694 NULL, 15695 md 15696 )) { 15697 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 15698 psFree(md); 15699 psFree(output); 15700 return false; 15701 } 15702 psFree(md); 15703 } 15704 15705 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 15706 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 15707 psFree(output); 15708 } 15709 psFree(output); 15710 15711 return true; 15712 } 15713 bool p5InputScfilePrintObject(FILE *stream, p5InputScfileRow *object, bool mdcf) 15714 { 15715 PS_ASSERT_PTR_NON_NULL(object, false); 15716 15717 psMetadata *md = p5InputScfileMetadataFromObject(object); 15718 15719 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 15720 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 15721 psFree(md); 15722 } 15723 15724 psFree(md); 15725 15726 return true; 15727 } 15728 static void p5DiffScfileRowFree(p5DiffScfileRow *object); 15729 15730 p5DiffScfileRow *p5DiffScfileRowAlloc(psS32 p5_id, const char *skycell_id, const char *tess_id, const char *uri, psF64 bg, psF64 bg_mean_stdev) 15731 { 15732 p5DiffScfileRow *_object; 15733 15734 _object = psAlloc(sizeof(p5DiffScfileRow)); 15735 psMemSetDeallocator(_object, (psFreeFunc)p5DiffScfileRowFree); 15736 15737 _object->p5_id = p5_id; 15738 _object->skycell_id = psStringCopy(skycell_id); 15739 _object->tess_id = psStringCopy(tess_id); 15740 _object->uri = psStringCopy(uri); 15741 _object->bg = bg; 15742 _object->bg_mean_stdev = bg_mean_stdev; 15743 15744 return _object; 15745 } 15746 15747 static void p5DiffScfileRowFree(p5DiffScfileRow *object) 15748 { 15749 psFree(object->skycell_id); 15750 psFree(object->tess_id); 15751 psFree(object->uri); 15752 } 15753 15754 bool p5DiffScfileCreateTable(psDB *dbh) 15755 { 15756 psMetadata *md = psMetadataAlloc(); 15757 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, "Primary Key", 0)) { 15758 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15759 psFree(md); 15760 return false; 15761 } 15762 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, "Primary Key", "64")) { 15763 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 15764 psFree(md); 15765 return false; 15766 } 15767 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, "Primary Key", "64")) { 15768 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 15769 psFree(md); 15770 return false; 15771 } 15772 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) { 15773 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 15774 psFree(md); 15775 return false; 15776 } 15777 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) { 15778 psError(PS_ERR_UNKNOWN, false, "failed to add item bg"); 15779 psFree(md); 15780 return false; 15781 } 15782 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, 0.0)) { 15783 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev"); 15784 psFree(md); 15785 return false; 15786 } 15787 15788 bool status = psDBCreateTable(dbh, P5DIFFSCFILE_TABLE_NAME, md); 15789 15790 psFree(md); 15791 15792 return status; 15793 } 15794 15795 bool p5DiffScfileDropTable(psDB *dbh) 15796 { 15797 return psDBDropTable(dbh, P5DIFFSCFILE_TABLE_NAME); 15798 } 15799 15800 bool p5DiffScfileInsert(psDB * dbh, psS32 p5_id, const char *skycell_id, const char *tess_id, const char *uri, psF64 bg, psF64 bg_mean_stdev) 15801 { 15802 psMetadata *md = psMetadataAlloc(); 15803 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, p5_id)) { 15804 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15805 psFree(md); 15806 return false; 15807 } 15808 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) { 15809 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 15810 psFree(md); 15811 return false; 15812 } 15813 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) { 15814 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 15815 psFree(md); 15816 return false; 15817 } 15818 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) { 15819 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 15820 psFree(md); 15821 return false; 15822 } 15823 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, bg)) { 15824 psError(PS_ERR_UNKNOWN, false, "failed to add item bg"); 15825 psFree(md); 15826 return false; 15827 } 15828 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, bg_mean_stdev)) { 15829 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev"); 15830 psFree(md); 15831 return false; 15832 } 15833 15834 bool status = psDBInsertOneRow(dbh, P5DIFFSCFILE_TABLE_NAME, md); 15835 psFree(md); 15836 15837 return status; 15838 } 15839 15840 long long p5DiffScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 15841 { 15842 long long deleted = 0; 15843 15844 long long count = psDBDeleteRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit); 15845 if (count < 0) { 15846 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5DiffScfile"); 15847 return count; 15848 15849 deleted += count; 15850 } 15851 15852 return deleted; 15853 } 15854 bool p5DiffScfileInsertObject(psDB *dbh, p5DiffScfileRow *object) 15855 { 15856 return p5DiffScfileInsert(dbh, object->p5_id, object->skycell_id, object->tess_id, object->uri, object->bg, object->bg_mean_stdev); 15857 } 15858 15859 bool p5DiffScfileInsertObjects(psDB *dbh, psArray *objects) 15860 { 15861 for (long i = 0; i < psArrayLength(objects); i++) { 15862 if (!p5DiffScfileInsertObject(dbh, objects->data[i])) { 15863 return false; 15864 } 15865 } 15866 15867 return true; 15868 } 15869 15870 bool p5DiffScfileInsertFits(psDB *dbh, const psFits *fits) 15871 { 15872 psArray *rowSet; 15873 15874 // move to (the first?) extension named P5DIFFSCFILE_TABLE_NAME 15875 if (!psFitsMoveExtName(fits, P5DIFFSCFILE_TABLE_NAME)) { 15876 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P5DIFFSCFILE_TABLE_NAME); 15877 return false; 15878 } 15879 15880 // check HDU type 15881 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 15882 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 15883 return false; 15884 } 15885 15886 // read fits table 15887 rowSet = psFitsReadTable(fits); 15888 if (!rowSet) { 15889 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 15890 psFree(rowSet); 15891 return false; 15892 } 15893 15894 if (!psDBInsertRows(dbh, P5DIFFSCFILE_TABLE_NAME, rowSet)) { 15895 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 15896 psFree(rowSet); 15897 return false; 15898 } 15899 15900 psFree(rowSet); 15901 15902 return true; 15903 } 15904 15905 bool p5DiffScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 15906 { 15907 psArray *rowSet; 15908 15909 rowSet = psDBSelectRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit); 15910 if (!rowSet) { 15911 return false; 15912 } 15913 15914 // output to fits 15915 if (!psFitsWriteTable(fits, NULL, rowSet, P5DIFFSCFILE_TABLE_NAME)) { 15916 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 15917 psFree(rowSet); 15918 return false; 15919 } 15920 15921 psFree(rowSet); 15922 15923 return true; 15924 } 15925 15926 psMetadata *p5DiffScfileMetadataFromObject(const p5DiffScfileRow *object) 15927 { 15928 psMetadata *md = psMetadataAlloc(); 15929 if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, object->p5_id)) { 15930 psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id"); 15931 psFree(md); 15932 return false; 15933 } 15934 if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) { 15935 psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id"); 15936 psFree(md); 15937 return false; 15938 } 15939 if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) { 15940 psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id"); 15941 psFree(md); 15942 return false; 15943 } 15944 if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) { 15945 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 15946 psFree(md); 15947 return false; 15948 } 15949 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) { 15950 psError(PS_ERR_UNKNOWN, false, "failed to add item bg"); 15951 psFree(md); 15952 return false; 15953 } 15954 if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, object->bg_mean_stdev)) { 15955 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev"); 15956 psFree(md); 15957 return false; 15958 } 15959 15960 15961 return md; 15962 } 15963 15964 p5DiffScfileRow *p5DiffScfileObjectFromMetadata(psMetadata *md) 15965 { 15966 15967 bool status = false; 15968 psS32 p5_id = psMetadataLookupS32(&status, md, "p5_id"); 15969 if (!status) { 15970 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p5_id"); 15971 return false; 15972 } 15973 char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id"); 15974 if (!status) { 15975 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id"); 15976 return false; 15977 } 15978 char* tess_id = psMetadataLookupPtr(&status, md, "tess_id"); 15979 if (!status) { 15980 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id"); 15981 return false; 15982 } 15983 char* uri = psMetadataLookupPtr(&status, md, "uri"); 15984 if (!status) { 15985 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri"); 15986 return false; 15987 } 15988 psF64 bg = psMetadataLookupF64(&status, md, "bg"); 15989 if (!status) { 15990 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg"); 15991 return false; 15992 } 15993 psF64 bg_mean_stdev = psMetadataLookupF64(&status, md, "bg_mean_stdev"); 15994 if (!status) { 15995 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev"); 15996 return false; 15997 } 15998 15999 return p5DiffScfileRowAlloc(p5_id, skycell_id, tess_id, uri, bg, bg_mean_stdev); 16000 } 16001 psArray *p5DiffScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 16002 { 16003 psArray *rowSet; 16004 psArray *returnSet; 16005 psU64 i; 16006 16007 rowSet = psDBSelectRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit); 16008 if (!rowSet) { 16009 return NULL; 16010 } 16011 16012 // convert psMetadata rows to row objects 16013 16014 returnSet = psArrayAllocEmpty(rowSet->n); 16015 16016 for (i = 0; i < rowSet->n; i++) { 16017 p5DiffScfileRow *object = p5DiffScfileObjectFromMetadata(rowSet->data[i]); 16018 psArrayAdd(returnSet, 0, object); 16019 psFree(object); 16020 } 16021 16022 psFree(rowSet); 16023 16024 return returnSet; 16025 } 16026 bool p5DiffScfileDeleteObject(psDB *dbh, const p5DiffScfileRow *object) 16027 { 16028 psMetadata *where = p5DiffScfileMetadataFromObject(object); 16029 long long count = psDBDeleteRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, 0); 16030 psFree(where); 16031 if (count < 0) { 16032 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5DiffScfile"); 16033 return false; 16034 } 16035 if (count > 1) { 16036 // XXX should this be a psAbort() instead? It is possible that 16037 // having an object match multiple rows was by design. 16038 psError(PS_ERR_UNKNOWN, true, "p5DiffScfileRow object matched more then one row. Check your database schema"); 16039 return false; 16040 } 16041 16042 return true; 16043 } 16044 long long p5DiffScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 16045 { 16046 long long deleted = 0; 16047 16048 for (long long i = 0; i < objects->n; i++) { 16049 p5DiffScfileRow *object = objects->data[i]; 16050 psMetadata *where = p5DiffScfileMetadataFromObject(object); 16051 long long count = psDBDeleteRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit); 16052 psFree(where); 16053 if (count < 0) { 16054 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5DiffScfile"); 16055 return count; 16056 } 16057 16058 deleted += count; 16059 } 16060 16061 return deleted; 16062 } 16063 bool p5DiffScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf) 16064 { 16065 PS_ASSERT_PTR_NON_NULL(objects, false); 16066 16067 psMetadata *output = psMetadataAlloc(); 16068 for (long i = 0; i < psArrayLength(objects); i++) { 16069 psMetadata *md = p5DiffScfileMetadataFromObject(objects->data[i]); 16070 if (!psMetadataAddMetadata( 16071 output, 16072 PS_LIST_TAIL, 16073 P5DIFFSCFILE_TABLE_NAME, 16074 PS_META_DUPLICATE_OK, 16075 NULL, 16076 md 16077 )) { 16078 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 16079 psFree(md); 16080 psFree(output); 16081 return false; 16082 } 16083 psFree(md); 16084 } 16085 16086 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 16087 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 16088 psFree(output); 16089 } 16090 psFree(output); 16091 16092 return true; 16093 } 16094 bool p5DiffScfilePrintObject(FILE *stream, p5DiffScfileRow *object, bool mdcf) 16095 { 16096 PS_ASSERT_PTR_NON_NULL(object, false); 16097 16098 psMetadata *md = p5DiffScfileMetadataFromObject(object); 16099 16100 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 16101 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 16102 psFree(md); 16103 } 16104 16105 psFree(md); 16106 16107 return true; 16108 }
Note:
See TracChangeset
for help on using the changeset viewer.
