Changeset 9301 for trunk/ippdb/src/ippdb.c
- Timestamp:
- Oct 5, 2006, 11:32:26 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/ippdb/src/ippdb.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippdb/src/ippdb.c
r9247 r9301 57 57 #define P3PENDINGEXP_TABLE_NAME "p3PendingExp" 58 58 #define P3PENDINGEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME 59 #define P3PROCESSEDEXP_TABLE_NAME "p3ProcessedExp" 60 #define P3PROCESSEDEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME 59 61 #define DETRUN_TABLE_NAME "detRun" 60 62 #define DETRUN_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME … … 12858 12860 return true; 12859 12861 } 12862 static void p3ProcessedExpRowFree(p3ProcessedExpRow *object); 12863 12864 p3ProcessedExpRow *p3ProcessedExpRowAlloc(const char *exp_tag, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF32 sigma_ra, psF32 sigma_dec, psS32 nastro, const char *b1_uri, const char *b2_uri, psS32 p2_version, psS32 p3_version) 12865 { 12866 p3ProcessedExpRow *_object; 12867 12868 _object = psAlloc(sizeof(p3ProcessedExpRow)); 12869 psMemSetDeallocator(_object, (psFreeFunc)p3ProcessedExpRowFree); 12870 12871 _object->exp_tag = psStringCopy(exp_tag); 12872 _object->uri = psStringCopy(uri); 12873 _object->recipe = psStringCopy(recipe); 12874 _object->bg = bg; 12875 _object->bg_stdev = bg_stdev; 12876 _object->bg_mean_stdev = bg_mean_stdev; 12877 _object->sigma_ra = sigma_ra; 12878 _object->sigma_dec = sigma_dec; 12879 _object->nastro = nastro; 12880 _object->b1_uri = psStringCopy(b1_uri); 12881 _object->b2_uri = psStringCopy(b2_uri); 12882 _object->p2_version = p2_version; 12883 _object->p3_version = p3_version; 12884 12885 return _object; 12886 } 12887 12888 static void p3ProcessedExpRowFree(p3ProcessedExpRow *object) 12889 { 12890 psFree(object->exp_tag); 12891 psFree(object->uri); 12892 psFree(object->recipe); 12893 psFree(object->b1_uri); 12894 psFree(object->b2_uri); 12895 } 12896 12897 bool p3ProcessedExpCreateTable(psDB *dbh) 12898 { 12899 psMetadata *md; 12900 bool status; 12901 12902 md = psMetadataAlloc(); 12903 if (!psMetadataAdd(md, PS_LIST_TAIL, P3PROCESSEDEXP_INDEX_NAME, PS_DATA_S32, "AUTO_INCREMENT", 0.0)) { 12904 psError(PS_ERR_UNKNOWN, false, "failed to add item %s", P3PROCESSEDEXP_INDEX_NAME); 12905 psFree(md); 12906 return false; 12907 } 12908 if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_tag", 0, "Primary Key", "64")) { 12909 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag"); 12910 psFree(md); 12911 return false; 12912 } 12913 if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, "255")) { 12914 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 12915 psFree(md); 12916 return false; 12917 } 12918 if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, "64")) { 12919 psError(PS_ERR_UNKNOWN, false, "failed to add item recipe"); 12920 psFree(md); 12921 return false; 12922 } 12923 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg", 0, NULL, 0.0)) { 12924 psError(PS_ERR_UNKNOWN, false, "failed to add item bg"); 12925 psFree(md); 12926 return false; 12927 } 12928 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_stdev", 0, NULL, 0.0)) { 12929 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev"); 12930 psFree(md); 12931 return false; 12932 } 12933 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_mean_stdev", 0, NULL, 0.0)) { 12934 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev"); 12935 psFree(md); 12936 return false; 12937 } 12938 if (!psMetadataAddF32(md, PS_LIST_TAIL, "sigma_ra", 0, NULL, 0.0)) { 12939 psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra"); 12940 psFree(md); 12941 return false; 12942 } 12943 if (!psMetadataAddF32(md, PS_LIST_TAIL, "sigma_dec", 0, NULL, 0.0)) { 12944 psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec"); 12945 psFree(md); 12946 return false; 12947 } 12948 if (!psMetadataAddS32(md, PS_LIST_TAIL, "nastro", 0, NULL, 0)) { 12949 psError(PS_ERR_UNKNOWN, false, "failed to add item nastro"); 12950 psFree(md); 12951 return false; 12952 } 12953 if (!psMetadataAddStr(md, PS_LIST_TAIL, "b1_uri", 0, NULL, "255")) { 12954 psError(PS_ERR_UNKNOWN, false, "failed to add item b1_uri"); 12955 psFree(md); 12956 return false; 12957 } 12958 if (!psMetadataAddStr(md, PS_LIST_TAIL, "b2_uri", 0, NULL, "255")) { 12959 psError(PS_ERR_UNKNOWN, false, "failed to add item b2_uri"); 12960 psFree(md); 12961 return false; 12962 } 12963 if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, 0)) { 12964 psError(PS_ERR_UNKNOWN, false, "failed to add item p2_version"); 12965 psFree(md); 12966 return false; 12967 } 12968 if (!psMetadataAddS32(md, PS_LIST_TAIL, "p3_version", 0, NULL, 0)) { 12969 psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version"); 12970 psFree(md); 12971 return false; 12972 } 12973 12974 status = psDBCreateTable(dbh, P3PROCESSEDEXP_TABLE_NAME, md); 12975 12976 psFree(md); 12977 12978 return status; 12979 } 12980 12981 bool p3ProcessedExpDropTable(psDB *dbh) 12982 { 12983 return psDBDropTable(dbh, P3PROCESSEDEXP_TABLE_NAME); 12984 } 12985 12986 bool p3ProcessedExpInsert(psDB * dbh, const char *exp_tag, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF32 sigma_ra, psF32 sigma_dec, psS32 nastro, const char *b1_uri, const char *b2_uri, psS32 p2_version, psS32 p3_version) 12987 { 12988 psMetadata *md; 12989 bool status; 12990 12991 md = psMetadataAlloc(); 12992 if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_tag", 0, NULL, exp_tag)) { 12993 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag"); 12994 psFree(md); 12995 return false; 12996 } 12997 if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) { 12998 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 12999 psFree(md); 13000 return false; 13001 } 13002 if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) { 13003 psError(PS_ERR_UNKNOWN, false, "failed to add item recipe"); 13004 psFree(md); 13005 return false; 13006 } 13007 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg", 0, NULL, bg)) { 13008 psError(PS_ERR_UNKNOWN, false, "failed to add item bg"); 13009 psFree(md); 13010 return false; 13011 } 13012 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_stdev", 0, NULL, bg_stdev)) { 13013 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev"); 13014 psFree(md); 13015 return false; 13016 } 13017 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_mean_stdev", 0, NULL, bg_mean_stdev)) { 13018 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev"); 13019 psFree(md); 13020 return false; 13021 } 13022 if (!psMetadataAddF32(md, PS_LIST_TAIL, "sigma_ra", 0, NULL, sigma_ra)) { 13023 psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra"); 13024 psFree(md); 13025 return false; 13026 } 13027 if (!psMetadataAddF32(md, PS_LIST_TAIL, "sigma_dec", 0, NULL, sigma_dec)) { 13028 psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec"); 13029 psFree(md); 13030 return false; 13031 } 13032 if (!psMetadataAddS32(md, PS_LIST_TAIL, "nastro", 0, NULL, nastro)) { 13033 psError(PS_ERR_UNKNOWN, false, "failed to add item nastro"); 13034 psFree(md); 13035 return false; 13036 } 13037 if (!psMetadataAddStr(md, PS_LIST_TAIL, "b1_uri", 0, NULL, b1_uri)) { 13038 psError(PS_ERR_UNKNOWN, false, "failed to add item b1_uri"); 13039 psFree(md); 13040 return false; 13041 } 13042 if (!psMetadataAddStr(md, PS_LIST_TAIL, "b2_uri", 0, NULL, b2_uri)) { 13043 psError(PS_ERR_UNKNOWN, false, "failed to add item b2_uri"); 13044 psFree(md); 13045 return false; 13046 } 13047 if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, p2_version)) { 13048 psError(PS_ERR_UNKNOWN, false, "failed to add item p2_version"); 13049 psFree(md); 13050 return false; 13051 } 13052 if (!psMetadataAddS32(md, PS_LIST_TAIL, "p3_version", 0, NULL, p3_version)) { 13053 psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version"); 13054 psFree(md); 13055 return false; 13056 } 13057 13058 status = psDBInsertOneRow(dbh, P3PROCESSEDEXP_TABLE_NAME, md); 13059 psFree(md); 13060 13061 return status; 13062 } 13063 13064 long long p3ProcessedExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 13065 { 13066 long long deleted = 0; 13067 13068 long long count = psDBDeleteRows(dbh, P3PROCESSEDEXP_TABLE_NAME, where, limit); 13069 if (count < 0) { 13070 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p3ProcessedExp"); 13071 return count; 13072 13073 deleted += count; 13074 } 13075 13076 return deleted; 13077 } 13078 bool p3ProcessedExpPop(psDB *dbh, char **exp_tag, char **uri, char **recipe, psF64 *bg, psF64 *bg_stdev, psF64 *bg_mean_stdev, psF32 *sigma_ra, psF32 *sigma_dec, psS32 *nastro, char **b1_uri, char **b2_uri, psS32 *p2_version, psS32 *p3_version) 13079 { 13080 psArray *rowSet; 13081 psMetadata *row; 13082 psMetadata *popped; 13083 long deleted; 13084 bool status; 13085 int rowID; 13086 13087 rowSet = psDBSelectRows(dbh, P3PROCESSEDEXP_TABLE_NAME, NULL, 1); 13088 if (!rowSet) { 13089 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P3PROCESSEDEXP_INDEX_NAME); 13090 psFree(rowSet); 13091 return NULL; 13092 } 13093 13094 row = psArrayGet(rowSet, 0); 13095 psMemIncrRefCounter(row); 13096 if (!row) { 13097 psError(PS_ERR_UNKNOWN, true, "database error or table is empty"); 13098 return NULL; 13099 } 13100 psFree(rowSet); 13101 13102 rowID = psMetadataLookupS32(&status, row, P3PROCESSEDEXP_INDEX_NAME); 13103 if (!status) { 13104 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P3PROCESSEDEXP_INDEX_NAME); 13105 psFree(row); 13106 return NULL; 13107 } 13108 13109 popped = psMetadataAlloc(); 13110 psMetadataAddS32(popped, PS_LIST_TAIL, P3PROCESSEDEXP_INDEX_NAME, 0, NULL, rowID); 13111 13112 deleted = psDBDeleteRows(dbh, P3PROCESSEDEXP_TABLE_NAME, popped, 0); 13113 if (deleted != 1) { 13114 psError(PS_ERR_UNKNOWN, false, "database failed to delete row"); 13115 psFree(popped); 13116 psFree(row); 13117 return NULL; 13118 } 13119 13120 psFree(popped); 13121 13122 *exp_tag = psMetadataLookupPtr(&status, row, "exp_tag"); 13123 if (!status) { 13124 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag"); 13125 psFree(row); 13126 return false; 13127 } 13128 *uri = psMetadataLookupPtr(&status, row, "uri"); 13129 if (!status) { 13130 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri"); 13131 psFree(row); 13132 return false; 13133 } 13134 *recipe = psMetadataLookupPtr(&status, row, "recipe"); 13135 if (!status) { 13136 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe"); 13137 psFree(row); 13138 return false; 13139 } 13140 *bg = psMetadataLookupF64(&status, row, "bg"); 13141 if (!status) { 13142 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg"); 13143 psFree(row); 13144 return false; 13145 } 13146 *bg_stdev = psMetadataLookupF64(&status, row, "bg_stdev"); 13147 if (!status) { 13148 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_stdev"); 13149 psFree(row); 13150 return false; 13151 } 13152 *bg_mean_stdev = psMetadataLookupF64(&status, row, "bg_mean_stdev"); 13153 if (!status) { 13154 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev"); 13155 psFree(row); 13156 return false; 13157 } 13158 *sigma_ra = psMetadataLookupF32(&status, row, "sigma_ra"); 13159 if (!status) { 13160 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_ra"); 13161 psFree(row); 13162 return false; 13163 } 13164 *sigma_dec = psMetadataLookupF32(&status, row, "sigma_dec"); 13165 if (!status) { 13166 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_dec"); 13167 psFree(row); 13168 return false; 13169 } 13170 *nastro = psMetadataLookupS32(&status, row, "nastro"); 13171 if (!status) { 13172 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item nastro"); 13173 psFree(row); 13174 return false; 13175 } 13176 *b1_uri = psMetadataLookupPtr(&status, row, "b1_uri"); 13177 if (!status) { 13178 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b1_uri"); 13179 psFree(row); 13180 return false; 13181 } 13182 *b2_uri = psMetadataLookupPtr(&status, row, "b2_uri"); 13183 if (!status) { 13184 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b2_uri"); 13185 psFree(row); 13186 return false; 13187 } 13188 *p2_version = psMetadataLookupS32(&status, row, "p2_version"); 13189 if (!status) { 13190 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p2_version"); 13191 psFree(row); 13192 return false; 13193 } 13194 *p3_version = psMetadataLookupS32(&status, row, "p3_version"); 13195 if (!status) { 13196 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p3_version"); 13197 psFree(row); 13198 return false; 13199 } 13200 13201 psFree(row); 13202 13203 return true; 13204 } 13205 13206 bool p3ProcessedExpInsertObject(psDB *dbh, p3ProcessedExpRow *object) 13207 { 13208 return p3ProcessedExpInsert(dbh, object->exp_tag, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->sigma_ra, object->sigma_dec, object->nastro, object->b1_uri, object->b2_uri, object->p2_version, object->p3_version); 13209 } 13210 13211 bool p3ProcessedExpInsertObjects(psDB *dbh, psArray *objects) 13212 { 13213 for (long i = 0; i < psArrayLength(objects); i++) { 13214 if (!p3ProcessedExpInsertObject(dbh, objects->data[i])) { 13215 return false; 13216 } 13217 } 13218 13219 return true; 13220 } 13221 13222 p3ProcessedExpRow *p3ProcessedExpPopObject(psDB *dbh) 13223 { 13224 char exp_tag[256]; 13225 char uri[256]; 13226 char recipe[256]; 13227 psF64 bg; 13228 psF64 bg_stdev; 13229 psF64 bg_mean_stdev; 13230 psF32 sigma_ra; 13231 psF32 sigma_dec; 13232 psS32 nastro; 13233 char b1_uri[256]; 13234 char b2_uri[256]; 13235 psS32 p2_version; 13236 psS32 p3_version; 13237 13238 if (!p3ProcessedExpPop(dbh, (char **)&exp_tag, (char **)&uri, (char **)&recipe, &bg, &bg_stdev, &bg_mean_stdev, &sigma_ra, &sigma_dec, &nastro, (char **)&b1_uri, (char **)&b2_uri, &p2_version, &p3_version)) { 13239 psError(PS_ERR_UNKNOWN, false, "failed to pop a database row"); 13240 return NULL; 13241 } 13242 13243 return p3ProcessedExpRowAlloc(exp_tag, uri, recipe, bg, bg_stdev, bg_mean_stdev, sigma_ra, sigma_dec, nastro, b1_uri, b2_uri, p2_version, p3_version); 13244 } 13245 13246 bool p3ProcessedExpInsertFits(psDB *dbh, const psFits *fits) 13247 { 13248 psArray *rowSet; 13249 13250 // move to (the first?) extension named P3PROCESSEDEXP_TABLE_NAME 13251 if (!psFitsMoveExtName(fits, P3PROCESSEDEXP_TABLE_NAME)) { 13252 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P3PROCESSEDEXP_TABLE_NAME); 13253 return false; 13254 } 13255 13256 // check HDU type 13257 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 13258 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 13259 return false; 13260 } 13261 13262 // read fits table 13263 rowSet = psFitsReadTable(fits); 13264 if (!rowSet) { 13265 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 13266 psFree(rowSet); 13267 return false; 13268 } 13269 13270 if (!psDBInsertRows(dbh, P3PROCESSEDEXP_TABLE_NAME, rowSet)) { 13271 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 13272 psFree(rowSet); 13273 return false; 13274 } 13275 13276 psFree(rowSet); 13277 13278 return true; 13279 } 13280 13281 bool p3ProcessedExpPopFits(psDB *dbh, psFits *fits, unsigned long long limit) 13282 { 13283 char query[MAX_STRING_LENGTH]; 13284 13285 if (!p3ProcessedExpSelectRowsFits(dbh, fits, NULL, limit)) { 13286 psError(PS_ERR_UNKNOWN, true, "database error or table is empty"); 13287 return false; 13288 } 13289 13290 // remove limit rows from the end of the database 13291 if (snprintf(query, MAX_STRING_LENGTH, 13292 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld", 13293 P3PROCESSEDEXP_TABLE_NAME, P3PROCESSEDEXP_INDEX_NAME, limit) < 0) { 13294 psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH); 13295 return false; 13296 } 13297 13298 if (!p_psDBRunQuery(dbh, query)) { 13299 psError(PS_ERR_UNKNOWN, false, "database query failed"); 13300 return false; 13301 } 13302 13303 return true; 13304 } 13305 13306 bool p3ProcessedExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 13307 { 13308 psArray *rowSet; 13309 psU64 i; 13310 13311 rowSet = psDBSelectRows(dbh, P3PROCESSEDEXP_TABLE_NAME, where, limit); 13312 if (!rowSet) { 13313 return false; 13314 } 13315 13316 // strip index column 13317 for (i = 0; i < rowSet->n; i++) { 13318 if (!psMetadataRemove((psMetadata *)rowSet->data[i], 0, P3PROCESSEDEXP_INDEX_NAME)) { 13319 psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P3PROCESSEDEXP_INDEX_NAME); 13320 psFree(rowSet); 13321 return false; 13322 } 13323 } 13324 13325 // output to fits 13326 if (!psFitsWriteTable(fits, NULL, rowSet, P3PROCESSEDEXP_TABLE_NAME)) { 13327 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 13328 psFree(rowSet); 13329 return false; 13330 } 13331 13332 psFree(rowSet); 13333 13334 return true; 13335 } 13336 13337 psMetadata *p3ProcessedExpMetadataFromObject(const p3ProcessedExpRow *object) 13338 { 13339 psMetadata *md; 13340 13341 md = psMetadataAlloc(); 13342 if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_tag", 0, NULL, object->exp_tag)) { 13343 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag"); 13344 psFree(md); 13345 return NULL; 13346 } 13347 if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) { 13348 psError(PS_ERR_UNKNOWN, false, "failed to add item uri"); 13349 psFree(md); 13350 return NULL; 13351 } 13352 if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) { 13353 psError(PS_ERR_UNKNOWN, false, "failed to add item recipe"); 13354 psFree(md); 13355 return NULL; 13356 } 13357 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg", 0, NULL, object->bg)) { 13358 psError(PS_ERR_UNKNOWN, false, "failed to add item bg"); 13359 psFree(md); 13360 return NULL; 13361 } 13362 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_stdev", 0, NULL, object->bg_stdev)) { 13363 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev"); 13364 psFree(md); 13365 return NULL; 13366 } 13367 if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_mean_stdev", 0, NULL, object->bg_mean_stdev)) { 13368 psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev"); 13369 psFree(md); 13370 return NULL; 13371 } 13372 if (!psMetadataAddF32(md, PS_LIST_TAIL, "sigma_ra", 0, NULL, object->sigma_ra)) { 13373 psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra"); 13374 psFree(md); 13375 return NULL; 13376 } 13377 if (!psMetadataAddF32(md, PS_LIST_TAIL, "sigma_dec", 0, NULL, object->sigma_dec)) { 13378 psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec"); 13379 psFree(md); 13380 return NULL; 13381 } 13382 if (!psMetadataAddS32(md, PS_LIST_TAIL, "nastro", 0, NULL, object->nastro)) { 13383 psError(PS_ERR_UNKNOWN, false, "failed to add item nastro"); 13384 psFree(md); 13385 return NULL; 13386 } 13387 if (!psMetadataAddStr(md, PS_LIST_TAIL, "b1_uri", 0, NULL, object->b1_uri)) { 13388 psError(PS_ERR_UNKNOWN, false, "failed to add item b1_uri"); 13389 psFree(md); 13390 return NULL; 13391 } 13392 if (!psMetadataAddStr(md, PS_LIST_TAIL, "b2_uri", 0, NULL, object->b2_uri)) { 13393 psError(PS_ERR_UNKNOWN, false, "failed to add item b2_uri"); 13394 psFree(md); 13395 return NULL; 13396 } 13397 if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, object->p2_version)) { 13398 psError(PS_ERR_UNKNOWN, false, "failed to add item p2_version"); 13399 psFree(md); 13400 return NULL; 13401 } 13402 if (!psMetadataAddS32(md, PS_LIST_TAIL, "p3_version", 0, NULL, object->p3_version)) { 13403 psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version"); 13404 psFree(md); 13405 return NULL; 13406 } 13407 13408 return md; 13409 } 13410 13411 p3ProcessedExpRow *p3ProcessedExpObjectFromMetadata(psMetadata *md) 13412 { 13413 bool status; 13414 char *exp_tag; 13415 char *uri; 13416 char *recipe; 13417 psF64 bg; 13418 psF64 bg_stdev; 13419 psF64 bg_mean_stdev; 13420 psF32 sigma_ra; 13421 psF32 sigma_dec; 13422 psS32 nastro; 13423 char *b1_uri; 13424 char *b2_uri; 13425 psS32 p2_version; 13426 psS32 p3_version; 13427 13428 exp_tag = psMetadataLookupPtr(&status, md, "exp_tag"); 13429 if (!status) { 13430 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag"); 13431 return false; 13432 } 13433 uri = psMetadataLookupPtr(&status, md, "uri"); 13434 if (!status) { 13435 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri"); 13436 return false; 13437 } 13438 recipe = psMetadataLookupPtr(&status, md, "recipe"); 13439 if (!status) { 13440 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe"); 13441 return false; 13442 } 13443 bg = psMetadataLookupF64(&status, md, "bg"); 13444 if (!status) { 13445 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg"); 13446 return false; 13447 } 13448 bg_stdev = psMetadataLookupF64(&status, md, "bg_stdev"); 13449 if (!status) { 13450 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_stdev"); 13451 return false; 13452 } 13453 bg_mean_stdev = psMetadataLookupF64(&status, md, "bg_mean_stdev"); 13454 if (!status) { 13455 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev"); 13456 return false; 13457 } 13458 sigma_ra = psMetadataLookupF32(&status, md, "sigma_ra"); 13459 if (!status) { 13460 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_ra"); 13461 return false; 13462 } 13463 sigma_dec = psMetadataLookupF32(&status, md, "sigma_dec"); 13464 if (!status) { 13465 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_dec"); 13466 return false; 13467 } 13468 nastro = psMetadataLookupS32(&status, md, "nastro"); 13469 if (!status) { 13470 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item nastro"); 13471 return false; 13472 } 13473 b1_uri = psMetadataLookupPtr(&status, md, "b1_uri"); 13474 if (!status) { 13475 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b1_uri"); 13476 return false; 13477 } 13478 b2_uri = psMetadataLookupPtr(&status, md, "b2_uri"); 13479 if (!status) { 13480 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b2_uri"); 13481 return false; 13482 } 13483 p2_version = psMetadataLookupS32(&status, md, "p2_version"); 13484 if (!status) { 13485 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p2_version"); 13486 return false; 13487 } 13488 p3_version = psMetadataLookupS32(&status, md, "p3_version"); 13489 if (!status) { 13490 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p3_version"); 13491 return false; 13492 } 13493 13494 return p3ProcessedExpRowAlloc(exp_tag, uri, recipe, bg, bg_stdev, bg_mean_stdev, sigma_ra, sigma_dec, nastro, b1_uri, b2_uri, p2_version, p3_version); 13495 } 13496 psArray *p3ProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 13497 { 13498 psArray *rowSet; 13499 psArray *returnSet; 13500 psU64 i; 13501 13502 rowSet = psDBSelectRows(dbh, P3PROCESSEDEXP_TABLE_NAME, where, limit); 13503 if (!rowSet) { 13504 return NULL; 13505 } 13506 13507 // strip index column 13508 for (i = 0; i < rowSet->n; i++) { 13509 if (!psMetadataRemove((psMetadata *)(rowSet->data[i]), 0, P3PROCESSEDEXP_INDEX_NAME)) { 13510 psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P3PROCESSEDEXP_INDEX_NAME); 13511 psFree(rowSet); 13512 return false; 13513 } 13514 } 13515 13516 // convert psMetadata rows to row objects 13517 13518 returnSet = psArrayAlloc(rowSet->n); 13519 returnSet->n = 0; 13520 13521 for (i = 0; i < rowSet->n; i++) { 13522 p3ProcessedExpRow *object = p3ProcessedExpObjectFromMetadata(rowSet->data[i]); 13523 psArrayAdd(returnSet, 0, object); 13524 psFree(object); 13525 } 13526 13527 psFree(rowSet); 13528 13529 return returnSet; 13530 } 13531 bool p3ProcessedExpDeleteObject(psDB *dbh, const p3ProcessedExpRow *object) 13532 { 13533 psMetadata *where = p3ProcessedExpMetadataFromObject(object); 13534 long long count = psDBDeleteRows(dbh, P3PROCESSEDEXP_TABLE_NAME, where, 0); 13535 psFree(where) 13536 if (count < 0) { 13537 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p3ProcessedExp"); 13538 return false; 13539 } 13540 if (count > 1) { 13541 // XXX should this be a psAbort() instead? It is possible that 13542 // having an object match multiple rows was by design. 13543 psError(PS_ERR_UNKNOWN, true, "p3ProcessedExpRow object matched more then one row. Check your database schema"); 13544 return false; 13545 } 13546 13547 return true; 13548 } 13549 long long p3ProcessedExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 13550 { 13551 long long deleted = 0; 13552 13553 for (long long i = 0; i < objects->n; i++) { 13554 p3ProcessedExpRow *object = objects->data[i]; 13555 psMetadata *where = p3ProcessedExpMetadataFromObject(object); 13556 long long count = psDBDeleteRows(dbh, P3PROCESSEDEXP_TABLE_NAME, where, limit); 13557 psFree(where) 13558 if (count < 0) { 13559 psError(PS_ERR_UNKNOWN, true, "failed to delete row from p3ProcessedExp"); 13560 return count; 13561 } 13562 13563 deleted += count; 13564 } 13565 13566 return deleted; 13567 } 13568 bool p3ProcessedExpPrintObjects(FILE *stream, psArray *objects, bool mdcf) 13569 { 13570 PS_ASSERT_PTR_NON_NULL(objects, false); 13571 13572 psMetadata *output = psMetadataAlloc(); 13573 for (long i = 0; i < psArrayLength(objects); i++) { 13574 psMetadata *md = p3ProcessedExpMetadataFromObject(objects->data[i]); 13575 if (!psMetadataAddMetadata( 13576 output, 13577 PS_LIST_TAIL, 13578 P3PROCESSEDEXP_TABLE_NAME, 13579 PS_META_DUPLICATE_OK, 13580 NULL, 13581 md 13582 )) { 13583 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 13584 psFree(md); 13585 psFree(output); 13586 return false; 13587 } 13588 psFree(md); 13589 } 13590 13591 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 13592 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 13593 psFree(output); 13594 } 13595 psFree(output); 13596 13597 return true; 13598 } 12860 13599 static void detRunRowFree(detRunRow *object); 12861 13600
Note:
See TracChangeset
for help on using the changeset viewer.
