IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 3, 2010, 5:46:26 PM (16 years ago)
Author:
watersc1
Message:

Realtime burntool code. Initial tests indicate it should work fine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/czw_branch/20101203/ippTools/src/regtool.c

    r27748 r29908  
    3434static bool pendingimfileMode(pxConfig *config);
    3535static bool addprocessedimfileMode(pxConfig *config);
     36static bool checkburntoolimfileMode(pxConfig *config);
     37static bool pendingburntoolimfileMode(pxConfig *config);
    3638static bool processedimfileMode(pxConfig *config);
    3739static bool revertprocessedimfileMode(pxConfig *config);
     
    7274        // imfile
    7375        MODECASE(REGTOOL_MODE_PENDINGIMFILE,         pendingimfileMode);
     76        MODECASE(REGTOOL_MODE_CHECKBURNTOOLIMFILE,   checkburntoolimfileMode);
     77        MODECASE(REGTOOL_MODE_PENDINGBURNTOOLIMFILE, pendingburntoolimfileMode);
    7478        MODECASE(REGTOOL_MODE_ADDPROCESSEDIMFILE,    addprocessedimfileMode);
    7579        MODECASE(REGTOOL_MODE_PROCESSEDIMFILE,       processedimfileMode);
     
    176180}
    177181
     182static 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
     281static 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     
    178427
    179428static bool addprocessedimfileMode(pxConfig *config)
Note: See TracChangeset for help on using the changeset viewer.