Changeset 29908 for branches/czw_branch/20101203/ippTools/src/regtool.c
- Timestamp:
- Dec 3, 2010, 5:46:26 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/czw_branch/20101203/ippTools/src/regtool.c
r27748 r29908 34 34 static bool pendingimfileMode(pxConfig *config); 35 35 static bool addprocessedimfileMode(pxConfig *config); 36 static bool checkburntoolimfileMode(pxConfig *config); 37 static bool pendingburntoolimfileMode(pxConfig *config); 36 38 static bool processedimfileMode(pxConfig *config); 37 39 static bool revertprocessedimfileMode(pxConfig *config); … … 72 74 // imfile 73 75 MODECASE(REGTOOL_MODE_PENDINGIMFILE, pendingimfileMode); 76 MODECASE(REGTOOL_MODE_CHECKBURNTOOLIMFILE, checkburntoolimfileMode); 77 MODECASE(REGTOOL_MODE_PENDINGBURNTOOLIMFILE, pendingburntoolimfileMode); 74 78 MODECASE(REGTOOL_MODE_ADDPROCESSEDIMFILE, addprocessedimfileMode); 75 79 MODECASE(REGTOOL_MODE_PROCESSEDIMFILE, processedimfileMode); … … 176 180 } 177 181 182 static bool checkburntoolimfileMode(pxConfig *config) 183 { 184 PS_ASSERT_PTR_NON_NULL(config,false); 185 186 // required 187 PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false); 188 PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false); 189 PXOPT_LOOKUP_STR(date, config->args, "-date", true, false); 190 PXOPT_LOOKUP_S32(valid_burntool, config->args, "-valid_burntool", true, false); 191 // optional 192 PXOPT_LOOKUP_STR(camera, config->args, "-inst", false, false); 193 PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false); 194 PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false); 195 psString query = pxDataGet("regtool_checkburntoolimfile.sql"); 196 if (!query) { 197 psError(PXTOOLS_ERR_SYS, false, "failed to retrieve SQL statement"); 198 return false; 199 } 200 psString rep = psStringCopy(query); 201 psFree(query); 202 query = rep; 203 204 psStringSubstitute(&query,exp_name,"@EXP_NAME@"); 205 psStringSubstitute(&query,class_id,"@CLASS_ID@"); 206 psStringSubstitute(&query,date,"@DATE@"); 207 208 fprintf(stderr,"%s",query); 209 210 if (!p_psDBRunQuery(config->dbh, query)) { 211 // XXX PS_EXIT_PROG_ERROR (incorrect SQL) or SYS_ERROR (database comms) 212 psError(PXTOOLS_ERR_PROG, false, "database error"); 213 psFree(query); 214 return false; 215 } 216 psFree(query); 217 218 psArray *output = p_psDBFetchResult(config->dbh); 219 if (!output) { 220 psErrorCode err = psErrorCodeLast(); 221 switch (err) { 222 case PS_ERR_DB_CLIENT: 223 psError(PXTOOLS_ERR_SYS, false, "database error"); 224 case PS_ERR_DB_SERVER: 225 psError(PXTOOLS_ERR_PROG, false, "database error"); 226 default: 227 psError(PXTOOLS_ERR_PROG, false, "unknown error"); 228 } 229 230 return false; 231 } 232 if (!psArrayLength(output)) { 233 psTrace("regtool", PS_LOG_INFO, "no rows found"); 234 psFree(output); 235 return true; 236 } 237 238 psString previous_uri = NULL; 239 bool ok_to_burn = true; 240 bool already_burned = true; 241 for (long i = 0; i < output->n; i++) { 242 psMetadata *row = output->data[i]; 243 244 if ((psMetadataLookupS32(NULL,row,"is_downloaded") != 1)|| 245 (psMetadataLookupS32(NULL,row,"is_registered") != 1)) { 246 ok_to_burn = false; 247 } 248 if (already_burned == false) { 249 ok_to_burn = false; 250 } 251 if (abs(psMetadataLookupS32(NULL,row,"burntool_state")) == valid_burntool) { 252 already_burned = true; 253 } 254 else { 255 already_burned = false; 256 } 257 258 if (previous_uri) { 259 psMetadataAddStr(row,PS_LIST_TAIL,"previous_uri",PS_META_REPLACE,"",previous_uri); 260 psFree(previous_uri); 261 } 262 psMetadataAddBool(row,PS_LIST_TAIL,"burnable",PS_META_REPLACE,"",ok_to_burn); 263 psMetadataAddBool(row,PS_LIST_TAIL,"already_burned",PS_META_REPLACE,"",already_burned); 264 previous_uri = psStringCopy(psMetadataLookupStr(NULL,row,"uri")); 265 } 266 267 // negate simple so the default is true 268 if (!ippdbPrintMetadatas(stdout, output, "regBurntoolImfile", !simple)) { 269 psError(PXTOOLS_ERR_PROG, false, "failed to print array"); 270 psFree(output); 271 return false; 272 } 273 274 psFree(output); 275 276 277 return(true); 278 279 } 280 281 static bool pendingburntoolimfileMode(pxConfig *config) 282 { 283 PS_ASSERT_PTR_NON_NULL(config,false); 284 285 // required 286 PXOPT_LOOKUP_STR(date, config->args, "-date", true, false); 287 PXOPT_LOOKUP_S32(valid_burntool, config->args, "-valid_burntool", true, false); 288 // optional 289 PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false); 290 PXOPT_LOOKUP_BOOL(ignore_state, config->args, "-ignore_state", false); 291 psString query = pxDataGet("regtool_pendingburntoolimfile.sql"); 292 if (!query) { 293 psError(PXTOOLS_ERR_SYS, false, "failed to retrieve SQL statement"); 294 return false; 295 } 296 psString rep = psStringCopy(query); 297 psFree(query); 298 query = rep; 299 300 psStringSubstitute(&query,date,"@DATE@"); 301 302 fprintf(stderr,"%s",query); 303 304 if (!p_psDBRunQuery(config->dbh, query)) { 305 // XXX PS_EXIT_PROG_ERROR (incorrect SQL) or SYS_ERROR (database comms) 306 psError(PXTOOLS_ERR_PROG, false, "database error"); 307 psFree(query); 308 return false; 309 } 310 psFree(query); 311 312 psArray *output = p_psDBFetchResult(config->dbh); 313 if (!output) { 314 psErrorCode err = psErrorCodeLast(); 315 switch (err) { 316 case PS_ERR_DB_CLIENT: 317 psError(PXTOOLS_ERR_SYS, false, "database error"); 318 case PS_ERR_DB_SERVER: 319 psError(PXTOOLS_ERR_PROG, false, "database error"); 320 default: 321 psError(PXTOOLS_ERR_PROG, false, "unknown error"); 322 } 323 324 return false; 325 } 326 if (!psArrayLength(output)) { 327 psTrace("regtool", PS_LOG_INFO, "no rows found"); 328 psFree(output); 329 return true; 330 } 331 332 psString previous_uri = NULL; 333 bool ok_to_burn = true; 334 bool already_burned = true; 335 psString previous_class_id = NULL; 336 psString this_class_id = NULL; 337 psArray *results = psArrayAllocEmpty(60); // List of suggested imfiles to burntool. 338 339 for (long i = 0; i < output->n; i++) { 340 psMetadata *row = output->data[i]; 341 342 // Use tmp_class_id because class_id may not be populated for all imfiles 343 this_class_id = psStringCopy(psMetadataLookupStr(NULL,row,"tmp_class_id")); 344 psStringSubstitute(&this_class_id,"XY","ota"); 345 // Determine if we've crossed a class_id boundary. 346 if (previous_class_id) { 347 if (strcmp(this_class_id,previous_class_id) != 0) { 348 ok_to_burn = true; 349 already_burned = true; 350 previous_uri = NULL; 351 } 352 } 353 354 // If the state of this imfile is not "pending_burntool" then skip it, because 355 if (!ignore_state) { 356 psString imfile_state = psMetadataLookupStr(NULL,row,"imfile_state"); 357 358 if (!imfile_state) { 359 continue; 360 } 361 if (strcmp("pending_burntool",imfile_state) != 0) { 362 continue; 363 } 364 } 365 366 // Convert bits of the SQL query into booleans describing the data state 367 if ((psMetadataLookupS32(NULL,row,"is_downloaded") != 1)|| 368 (psMetadataLookupS32(NULL,row,"is_registered") != 1)) { 369 ok_to_burn = false; 370 } 371 if (already_burned == false) { 372 ok_to_burn = false; 373 } 374 if (abs(psMetadataLookupS32(NULL,row,"burntool_state")) == valid_burntool) { 375 already_burned = true; 376 } 377 else { 378 already_burned = false; 379 } 380 psMetadataAddBool(row,PS_LIST_TAIL,"burnable",PS_META_REPLACE,"",ok_to_burn); 381 psMetadataAddBool(row,PS_LIST_TAIL,"already_burned",PS_META_REPLACE,"",already_burned); 382 383 // We'll need to return the previous uri so we know where the input table is: 384 if (previous_uri) { 385 psMetadataAddStr(row,PS_LIST_TAIL,"previous_uri",PS_META_REPLACE,"",previous_uri); 386 psFree(previous_uri); 387 } 388 previous_uri = psStringCopy(psMetadataLookupStr(NULL,row,"uri")); 389 390 // Write the class_id stuff at the end for debugging. 391 psMetadataAddStr(row,PS_LIST_TAIL,"this_class_id",PS_META_REPLACE,"",this_class_id); 392 if (previous_class_id) { 393 psMetadataAddStr(row,PS_LIST_TAIL,"previous_class_id",PS_META_REPLACE,"",previous_class_id); 394 psFree(previous_class_id); 395 } 396 // Use tmp_class_id because class_id may not be populated for all imfiles 397 previous_class_id = psStringCopy(psMetadataLookupStr(NULL,row,"tmp_class_id")); 398 psStringSubstitute(&previous_class_id,"XY","ota"); 399 // Determine if we've already suggested an entry for this ota, and if not, copy this 400 // suggestion into our output result list. 401 if (!ok_to_burn || already_burned) { 402 continue; 403 } 404 405 psArrayAdd(results,results->n,row); 406 // If we're here, then we think we could potentially burntool this file. 407 408 } 409 410 // negate simple so the default is true 411 if (!ippdbPrintMetadatas(stdout, results, "regPendingBurntoolImfile", !simple)) { 412 psError(PXTOOLS_ERR_PROG, false, "failed to print array"); 413 psFree(output); 414 psFree(results); 415 return false; 416 } 417 418 psFree(output); 419 psFree(results); 420 421 422 return(true); 423 424 } 425 426 178 427 179 428 static bool addprocessedimfileMode(pxConfig *config)
Note:
See TracChangeset
for help on using the changeset viewer.
