Changeset 17144 for trunk/ippdb/src/ippdb.c
- Timestamp:
- Mar 25, 2008, 1:14:07 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/ippdb/src/ippdb.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippdb/src/ippdb.c
r17142 r17144 50 50 #define WARPSKYCELLMAP_TABLE_NAME "warpSkyCellMap" 51 51 #define WARPSKYFILE_TABLE_NAME "warpSkyfile" 52 #define WARPMASK_TABLE_NAME "warpMask" 52 53 #define DIFFRUN_TABLE_NAME "diffRun" 53 54 #define DIFFINPUTSKYFILE_TABLE_NAME "diffInputSkyfile" … … 10922 10923 return true; 10923 10924 } 10925 static void warpMaskRowFree(warpMaskRow *object); 10926 10927 warpMaskRow *warpMaskRowAlloc(const char *label) 10928 { 10929 warpMaskRow *_object; 10930 10931 _object = psAlloc(sizeof(warpMaskRow)); 10932 psMemSetDeallocator(_object, (psFreeFunc)warpMaskRowFree); 10933 10934 _object->label = psStringCopy(label); 10935 10936 return _object; 10937 } 10938 10939 static void warpMaskRowFree(warpMaskRow *object) 10940 { 10941 psFree(object->label); 10942 } 10943 10944 bool warpMaskCreateTable(psDB *dbh) 10945 { 10946 psMetadata *md = psMetadataAlloc(); 10947 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Primary Key", "64")) { 10948 psError(PS_ERR_UNKNOWN, false, "failed to add item label"); 10949 psFree(md); 10950 return false; 10951 } 10952 10953 bool status = psDBCreateTable(dbh, WARPMASK_TABLE_NAME, md); 10954 10955 psFree(md); 10956 10957 return status; 10958 } 10959 10960 bool warpMaskDropTable(psDB *dbh) 10961 { 10962 return psDBDropTable(dbh, WARPMASK_TABLE_NAME); 10963 } 10964 10965 bool warpMaskInsert(psDB * dbh, const char *label) 10966 { 10967 psMetadata *md = psMetadataAlloc(); 10968 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) { 10969 psError(PS_ERR_UNKNOWN, false, "failed to add item label"); 10970 psFree(md); 10971 return false; 10972 } 10973 10974 bool status = psDBInsertOneRow(dbh, WARPMASK_TABLE_NAME, md); 10975 psFree(md); 10976 10977 return status; 10978 } 10979 10980 long long warpMaskDelete(psDB *dbh, const psMetadata *where, unsigned long long limit) 10981 { 10982 long long deleted = 0; 10983 10984 long long count = psDBDeleteRows(dbh, WARPMASK_TABLE_NAME, where, limit); 10985 if (count < 0) { 10986 psError(PS_ERR_UNKNOWN, true, "failed to delete row from warpMask"); 10987 return count; 10988 10989 deleted += count; 10990 } 10991 10992 return deleted; 10993 } 10994 bool warpMaskInsertObject(psDB *dbh, warpMaskRow *object) 10995 { 10996 return warpMaskInsert(dbh, object->label); 10997 } 10998 10999 bool warpMaskInsertObjects(psDB *dbh, psArray *objects) 11000 { 11001 for (long i = 0; i < psArrayLength(objects); i++) { 11002 if (!warpMaskInsertObject(dbh, objects->data[i])) { 11003 return false; 11004 } 11005 } 11006 11007 return true; 11008 } 11009 11010 bool warpMaskInsertFits(psDB *dbh, const psFits *fits) 11011 { 11012 psArray *rowSet; 11013 11014 // move to (the first?) extension named WARPMASK_TABLE_NAME 11015 if (!psFitsMoveExtName(fits, WARPMASK_TABLE_NAME)) { 11016 psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", WARPMASK_TABLE_NAME); 11017 return false; 11018 } 11019 11020 // check HDU type 11021 if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE) { 11022 psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE"); 11023 return false; 11024 } 11025 11026 // read fits table 11027 rowSet = psFitsReadTable(fits); 11028 if (!rowSet) { 11029 psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty"); 11030 psFree(rowSet); 11031 return false; 11032 } 11033 11034 if (!psDBInsertRows(dbh, WARPMASK_TABLE_NAME, rowSet)) { 11035 psError(PS_ERR_UNKNOWN, false, "databse insert failed"); 11036 psFree(rowSet); 11037 return false; 11038 } 11039 11040 psFree(rowSet); 11041 11042 return true; 11043 } 11044 11045 bool warpMaskSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit) 11046 { 11047 psArray *rowSet; 11048 11049 rowSet = psDBSelectRows(dbh, WARPMASK_TABLE_NAME, where, limit); 11050 if (!rowSet) { 11051 return false; 11052 } 11053 11054 // output to fits 11055 if (!psFitsWriteTable(fits, NULL, rowSet, WARPMASK_TABLE_NAME)) { 11056 psError(PS_ERR_UNKNOWN, false, "FITS table write failed"); 11057 psFree(rowSet); 11058 return false; 11059 } 11060 11061 psFree(rowSet); 11062 11063 return true; 11064 } 11065 11066 psMetadata *warpMaskMetadataFromObject(const warpMaskRow *object) 11067 { 11068 psMetadata *md = psMetadataAlloc(); 11069 if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) { 11070 psError(PS_ERR_UNKNOWN, false, "failed to add item label"); 11071 psFree(md); 11072 return false; 11073 } 11074 11075 11076 return md; 11077 } 11078 11079 warpMaskRow *warpMaskObjectFromMetadata(psMetadata *md) 11080 { 11081 11082 bool status = false; 11083 char* label = psMetadataLookupPtr(&status, md, "label"); 11084 if (!status) { 11085 psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label"); 11086 return false; 11087 } 11088 11089 return warpMaskRowAlloc(label); 11090 } 11091 psArray *warpMaskSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit) 11092 { 11093 psArray *rowSet; 11094 psArray *returnSet; 11095 psU64 i; 11096 11097 rowSet = psDBSelectRows(dbh, WARPMASK_TABLE_NAME, where, limit); 11098 if (!rowSet) { 11099 return NULL; 11100 } 11101 11102 // convert psMetadata rows to row objects 11103 11104 returnSet = psArrayAllocEmpty(rowSet->n); 11105 11106 for (i = 0; i < rowSet->n; i++) { 11107 warpMaskRow *object = warpMaskObjectFromMetadata(rowSet->data[i]); 11108 if (!object) { 11109 psFree(object); 11110 psFree(returnSet); 11111 psError(PS_ERR_UNKNOWN, false, "database error"); 11112 return NULL; 11113 } 11114 psArrayAdd(returnSet, 0, object); 11115 psFree(object); 11116 } 11117 11118 psFree(rowSet); 11119 11120 return returnSet; 11121 } 11122 bool warpMaskDeleteObject(psDB *dbh, const warpMaskRow *object) 11123 { 11124 psMetadata *where = warpMaskMetadataFromObject(object); 11125 long long count = psDBDeleteRows(dbh, WARPMASK_TABLE_NAME, where, 0); 11126 psFree(where); 11127 if (count < 0) { 11128 psError(PS_ERR_UNKNOWN, true, "failed to delete row from warpMask"); 11129 return false; 11130 } 11131 if (count > 1) { 11132 // XXX should this be a psAbort() instead? It is possible that 11133 // having an object match multiple rows was by design. 11134 psError(PS_ERR_UNKNOWN, true, "warpMaskRow object matched more then one row. Check your database schema"); 11135 return false; 11136 } 11137 11138 return true; 11139 } 11140 long long warpMaskDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit) 11141 { 11142 long long deleted = 0; 11143 11144 for (long long i = 0; i < objects->n; i++) { 11145 warpMaskRow *object = objects->data[i]; 11146 psMetadata *where = warpMaskMetadataFromObject(object); 11147 long long count = psDBDeleteRows(dbh, WARPMASK_TABLE_NAME, where, limit); 11148 psFree(where); 11149 if (count < 0) { 11150 psError(PS_ERR_UNKNOWN, true, "failed to delete row from warpMask"); 11151 return count; 11152 } 11153 11154 deleted += count; 11155 } 11156 11157 return deleted; 11158 } 11159 bool warpMaskPrintObjects(FILE *stream, psArray *objects, bool mdcf) 11160 { 11161 PS_ASSERT_PTR_NON_NULL(objects, false); 11162 11163 psMetadata *output = psMetadataAlloc(); 11164 for (long i = 0; i < psArrayLength(objects); i++) { 11165 psMetadata *md = warpMaskMetadataFromObject(objects->data[i]); 11166 if (!psMetadataAddMetadata( 11167 output, 11168 PS_LIST_TAIL, 11169 WARPMASK_TABLE_NAME, 11170 PS_META_DUPLICATE_OK, 11171 NULL, 11172 md 11173 )) { 11174 psError(PS_ERR_UNKNOWN, false, "failed to add metadata"); 11175 psFree(md); 11176 psFree(output); 11177 return false; 11178 } 11179 psFree(md); 11180 } 11181 11182 if (!ippdbPrintMetadataRaw(stream, output, mdcf)) { 11183 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 11184 psFree(output); 11185 } 11186 psFree(output); 11187 11188 return true; 11189 } 11190 bool warpMaskPrintObject(FILE *stream, warpMaskRow *object, bool mdcf) 11191 { 11192 PS_ASSERT_PTR_NON_NULL(object, false); 11193 11194 psMetadata *md = warpMaskMetadataFromObject(object); 11195 11196 if (!ippdbPrintMetadataRaw(stream, md, mdcf)) { 11197 psError(PS_ERR_UNKNOWN, false, "failed to print metadata"); 11198 psFree(md); 11199 } 11200 11201 psFree(md); 11202 11203 return true; 11204 } 10924 11205 static void diffRunRowFree(diffRunRow *object); 10925 11206
Note:
See TracChangeset
for help on using the changeset viewer.
