IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 24174 for trunk/ippTools/src


Ignore:
Timestamp:
May 13, 2009, 12:37:33 PM (17 years ago)
Author:
Paul Price
Message:

Merging branches/pap_magic@24173 into trunk. One conflict in dbconfig/changes.txt resolved easily.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/ippTools/src/difftool.c

    r24059 r24174  
    4040static bool revertdiffskyfileMode(pxConfig *config);
    4141static bool definepoprunMode(pxConfig *config);
    42 static bool definebyqueryMode(pxConfig *config);
     42static bool definewarpstackMode(pxConfig *config);
    4343static bool definewarpwarpMode(pxConfig *config);
    4444static bool pendingcleanuprunMode(pxConfig *config);
     
    7979        MODECASE(DIFFTOOL_MODE_REVERTDIFFSKYFILE,     revertdiffskyfileMode);
    8080        MODECASE(DIFFTOOL_MODE_DEFINEPOPRUN,          definepoprunMode);
    81         MODECASE(DIFFTOOL_MODE_DEFINEBYQUERY,         definebyqueryMode);
     81        MODECASE(DIFFTOOL_MODE_DEFINEWARPSTACK,         definewarpstackMode);
    8282        MODECASE(DIFFTOOL_MODE_DEFINEWARPWARP,        definewarpwarpMode);
    8383        MODECASE(DIFFTOOL_MODE_PENDINGCLEANUPRUN,     pendingcleanuprunMode);
     
    116116    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
    117117    PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false);
     118    PXOPT_LOOKUP_BOOL(bothways, config->args, "-bothways", false);
     119    PXOPT_LOOKUP_BOOL(exposure, config->args, "-exposure", false);
    118120    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
    119121    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
    120     PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", false, false);
    121122
    122123    // default
     
    133134            registered,
    134135            tess_id,
    135             exp_id,
     136            bothways,
     137            exposure,
    136138            false
    137139    );
     
    487489    PXOPT_LOOKUP_S16(fault, config->args, "-fault", false, false);
    488490    PXOPT_LOOKUP_S16(quality, config->args, "-quality", false, false);
    489     PXOPT_LOOKUP_STR(uri, config->args, "-uri", (fault == 0), false);
    490491    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", (fault == 0), false);
    491492
     
    521522                           diff_id,
    522523                           skycell_id,
    523                            uri,
    524524                           path_base,
    525525                           "full",
     
    771771                         psS64 template_warp_id, // Warp identifier for template image, PS_MAX_S64 for none
    772772                         psS64 template_stack_id, // Stack identifier for template image, PS_MAX_S64 for none
    773                          psS64 exp_id, // exposure id for input_warp_id (if defined)
    774773                         pxConfig *config // Configuration
    775774                         )
     
    802801            registered,
    803802            tess_id,
    804             exp_id,
     803            false,
     804            false,
    805805            false       // magicked
    806806    );
     
    882882    PXOPT_LOOKUP_S64(input_warp_id, config->args, "-input_warp_id", false, false);
    883883    PXOPT_LOOKUP_S64(input_stack_id, config->args, "-input_stack_id", false, false);
    884     PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", false, false);
    885884    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
    886885
     
    902901        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    903902                "No input has been defined (-input_stack_id or -input_warp_id)");
    904         return false;
    905     }
    906     if (input_warp_id && !exp_id) {
    907         psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    908                 "-exp_id is required with -input_warp_id.");
    909903        return false;
    910904    }
     
    917911                      template_warp_id ? template_warp_id : PS_MAX_S64,
    918912                      template_stack_id ? template_stack_id : PS_MAX_S64,
    919                       exp_id ? exp_id : PS_MAX_S64,
    920913                      config)) {
    921914        psError(PS_ERR_UNKNOWN, false, "failed to create populated diffRun");
     
    935928
    936929
    937 static bool definebyqueryMode(pxConfig *config)
     930static bool definewarpstackMode(pxConfig *config)
    938931{
    939932    PS_ASSERT_PTR_NON_NULL(config, false);
     
    960953    PXOPT_LOOKUP_BOOL(reRun, config->args, "-rerun", false);
    961954    PXOPT_LOOKUP_BOOL(available, config->args, "-available", false);
     955    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
    962956
    963957    // find all things to queue
    964     psString query = pxDataGet("difftool_definebyquery_part1.sql");
     958    psString query = pxDataGet("difftool_definewarpstack_part1.sql");
    965959    if (!query) {
    966960        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     
    10571051    }
    10581052
     1053    if (pretend) {
     1054        // negative simple so the default is true
     1055        if (!ippdbPrintMetadatas(stdout, output, "diffRun", !simple)) {
     1056            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     1057            psFree(output);
     1058            return false;
     1059        }
     1060        psFree(output);
     1061        return true;
     1062    }
     1063
    10591064    // create temporary table
    1060     query = pxDataGet("difftool_definebyquery_temp_create.sql");
     1065    query = pxDataGet("difftool_definewarpstack_temp_create.sql");
    10611066    if (!p_psDBRunQuery(config->dbh, query)) {
    10621067        psError(PS_ERR_UNKNOWN, false, "database error");
     
    10701075    query = NULL;
    10711076
    1072     psString skycell_query = pxDataGet("difftool_definebyquery_part2.sql");
     1077    psString skycell_query = pxDataGet("difftool_definewarpstack_part2.sql");
    10731078
    10741079    psArray *list = psArrayAllocEmpty(16); // List of runs, to print
     
    11831188                registered,
    11841189                tess_id,
    1185                 exp_id,
     1190                true,
     1191                false,
    11861192                false       // magicked
    11871193        );
     
    12841290    // Haversine formula for great circle distance
    12851291    PXOPT_COPY_F32(config->args, selectWhere, "-distance",
    1286                    "DEGREES(2*ASIN(SQRT(POW(SIN(inputRawExp.decl - templateRawExp.decl),2) + COS(inputRawExp.decl)*COS(templateRawExp.decl)*POW(SIN(inputRawExp.ra - templateRawExp.ra),2))))", "<=");
     1292                   "DEGREES(2*ASIN(SQRT(POW(SIN(inputRawExp.decl - templateRawExp.decl),2) + "
     1293                   "COS(inputRawExp.decl)*COS(templateRawExp.decl)*"
     1294                   "POW(SIN(inputRawExp.ra - templateRawExp.ra),2))))", "<=");
    12871295
    12881296    PXOPT_LOOKUP_BOOL(backwards, config->args, "-backwards", false);
     
    13081316    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
    13091317
     1318    if (!psDBTransaction(config->dbh)) {
     1319        psError(PS_ERR_UNKNOWN, false, "database error");
     1320        psFree(selectWhere);
     1321        psFree(insertWhere);
     1322        return false;
     1323    }
     1324
     1325    if (!rerun) {
     1326        // Need to build table of exposures with diffs
     1327        psString tempCreate = pxDataGet("difftool_definewarpwarp_temp_create.sql"); // Create temp table SQL
     1328        if (!tempCreate) {
     1329            psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     1330            psFree(selectWhere);
     1331            psFree(insertWhere);
     1332            if (!psDBRollback(config->dbh)) {
     1333                psError(PS_ERR_UNKNOWN, false, "database error");
     1334            }
     1335            return false;
     1336        }
     1337
     1338        if (!p_psDBRunQuery(config->dbh, tempCreate)) {
     1339            psError(PS_ERR_UNKNOWN, false, "Unable to create temp table: %s", tempCreate);
     1340            psFree(tempCreate);
     1341            psFree(selectWhere);
     1342            psFree(insertWhere);
     1343            if (!psDBRollback(config->dbh)) {
     1344                psError(PS_ERR_UNKNOWN, false, "database error");
     1345            }
     1346            return false;
     1347        }
     1348        psFree(tempCreate);
     1349
     1350        psString tempInsert = pxDataGet("difftool_definewarpwarp_temp_insert.sql"); // Insert to temp table
     1351        if (!tempInsert) {
     1352            psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     1353            psFree(selectWhere);
     1354            psFree(insertWhere);
     1355            if (!psDBRollback(config->dbh)) {
     1356                psError(PS_ERR_UNKNOWN, false, "database error");
     1357            }
     1358            return false;
     1359        }
     1360
     1361        psString where = psStringCopy(""); // WHERE for insertion
     1362        if (label) {
     1363            psStringAppend(&where, "\nAND diffRun.label = '%s'", label);
     1364        }
     1365
     1366        if (!p_psDBRunQueryF(config->dbh, tempInsert, where, where)) {
     1367            psError(PS_ERR_UNKNOWN, false, "Unable to insert into temp table: %s", tempInsert);
     1368            psFree(tempInsert);
     1369            psFree(where);
     1370            psFree(selectWhere);
     1371            psFree(insertWhere);
     1372            if (!psDBRollback(config->dbh)) {
     1373                psError(PS_ERR_UNKNOWN, false, "database error");
     1374            }
     1375            return false;
     1376        }
     1377        psFree(where);
     1378        psFree(tempInsert);
     1379    }
     1380
     1381    // Get list of warps to diff
    13101382    psString select = pxDataGet("difftool_definewarpwarp_select.sql");
    13111383    if (!select) {
    13121384        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     1385        psFree(selectWhere);
     1386        psFree(insertWhere);
     1387        if (!psDBRollback(config->dbh)) {
     1388            psError(PS_ERR_UNKNOWN, false, "database error");
     1389        }
    13131390        return false;
    13141391    }
     
    13231400    psFree(selectWhere);
    13241401
    1325     if (!rerun) {
    1326         psStringAppend(&whereClause, "\n%s (diffRun.diff_id IS NULL", whereClause ? "AND" : "WHERE");
    1327         if (label) {
    1328             psStringAppend(&whereClause, " OR diffRun.label != '%s'", label);
    1329         }
    1330         psStringAppend(&whereClause, ")");
    1331     }
    1332 
    13331402    if (!available) {
    13341403        psStringAppend(&whereClause, "\n%s inputWarpRun.state = 'full'", whereClause ? "AND" : "WHERE");
    13351404    }
    13361405
    1337     if (!psDBTransaction(config->dbh)) {
    1338         psError(PS_ERR_UNKNOWN, false, "database error");
    1339         psFree(select);
    1340         psFree(whereClause);
    1341         psFree(insertWhere);
    1342         return false;
     1406    if (!rerun) {
     1407        psStringAppend(&whereClause, "\n%s diffs.diff_id IS NULL", whereClause ? "AND" : "WHERE");
    13431408    }
    13441409
    13451410    if (!p_psDBRunQueryF(config->dbh, select,
    1346                          !rerun ? "\n" : "", // Activate LEFT JOIN against diffRun?
     1411                         !rerun ? "\n" : "", // Activate LEFT JOIN against diffs?
    13471412                         whereClause)) {
    13481413        psError(PS_ERR_UNKNOWN, false, "Unable to run query: %s [WITH] %s", select, whereClause);
     
    14141479        psMetadata *row = results->data[i]; // Result row from query
    14151480
    1416         psS64 exp_id = psMetadataLookupS64(NULL, row, "input_exp_id");
    14171481        psS64 input_id = psMetadataLookupS64(NULL, row, "input_warp_id");
    14181482        const char *template = psMetadataLookupStr(NULL, row, "template_warp_id");
    14191483        const char *tess_id = psMetadataLookupStr(NULL, row, "tess_id");
    1420         if (!exp_id || !input_id || !template || !tess_id) {
     1484        if (!input_id || !template || !tess_id) {
    14211485            psError(PXTOOLS_ERR_PROG, false, "Identifiers not found");
    14221486            psFree(list);
     
    14301494
    14311495        diffRunRow *run = diffRunRowAlloc(0, "reg", workdir, label, reduction, NULL, registered,
    1432                                           tess_id, exp_id, false); // Run to insert
     1496                                          tess_id, true, true, false); // Run to insert
    14331497        if (!diffRunInsertObject(config->dbh, run)) {
    14341498            psError(PS_ERR_UNKNOWN, false, "database error");
  • trunk/ippTools/src/difftool.h

    r23502 r24174  
    3434    DIFFTOOL_MODE_REVERTDIFFSKYFILE,
    3535    DIFFTOOL_MODE_DEFINEPOPRUN,
    36     DIFFTOOL_MODE_DEFINEBYQUERY,
     36    DIFFTOOL_MODE_DEFINEWARPSTACK,
    3737    DIFFTOOL_MODE_DEFINEWARPWARP,
    3838    DIFFTOOL_MODE_PENDINGCLEANUPRUN,
  • trunk/ippTools/src/difftoolConfig.c

    r23940 r24174  
    4949    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
    5050    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID (required)", NULL);
     51    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-bothways",  0,            "do the subtraction both ways?", false);
     52    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-exposure",  0,            "subtraction for entire exposure?", false);
    5153    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label",  0,            "define label", NULL);
    5254    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-reduction",  0,            "define reduction class", NULL);
     
    9092    psMetadataAddS16(adddiffskyfileArgs, PS_LIST_TAIL, "-fault",  0,            "set fault code", 0);
    9193    psMetadataAddS16(adddiffskyfileArgs, PS_LIST_TAIL, "-quality",  0,            "set quality", 0);
    92     psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-uri", 0,            "define URI of file", 0);
    9394    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", 0);
    9495    psMetadataAddF64(adddiffskyfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
     
    142143    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-reduction",  0,            "define reduction class", NULL);
    143144    psMetadataAddBool(definepoprunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
    144     psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-exp_id", 0,              "define exposure ID for template", 0);
    145145    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_warp_id", 0,            "define warp ID for template", 0);
    146146    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_stack_id", 0,            "define stack ID for template", 0);
     
    148148    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-input_stack_id", 0,            "define stack ID for input", 0);
    149149
    150     // -definebyquery
    151     psMetadata *definebyqueryArgs = psMetadataAlloc();
    152     psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-warp_id", 0, "search by warp ID", 0);
    153     psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-exp_id", 0, "search by exposure ID", 0);
    154     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-skycell_id", 0, "search by skycell ID", NULL);
    155     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-tess_id", 0, "search by tess ID", NULL);
    156     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-filter", 0, "search by filter", NULL);
    157     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-stack_label", 0, "search by stack label", NULL);
    158     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-warp_label", 0, "search by warp label", NULL);
    159     psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-good_frac", 0, "minimum good fraction of skycell", NAN);
    160     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-workdir", 0, "define workdir (required)", NULL);
    161     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-label",  0, "define label", NULL);
    162     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-reduction",  0, "define reduction class", NULL);
    163     psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
    164     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-new-templates", 0, "also search for diffs with new template", false);
    165     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-rerun", 0, "define new run even if one exists", false);
    166     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-available", 0, "define new run even if warpRun has some faults", false);
    167     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
     150    // -definewarpstack
     151    psMetadata *definewarpstackArgs = psMetadataAlloc();
     152    psMetadataAddS64(definewarpstackArgs, PS_LIST_TAIL, "-warp_id", 0, "search by warp ID", 0);
     153    psMetadataAddS64(definewarpstackArgs, PS_LIST_TAIL, "-exp_id", 0, "search by exposure ID", 0);
     154    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-skycell_id", 0, "search by skycell ID", NULL);
     155    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-tess_id", 0, "search by tess ID", NULL);
     156    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-filter", 0, "search by filter", NULL);
     157    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-stack_label", 0, "search by stack label", NULL);
     158    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-warp_label", 0, "search by warp label", NULL);
     159    psMetadataAddF32(definewarpstackArgs, PS_LIST_TAIL, "-good_frac", 0, "minimum good fraction of skycell", NAN);
     160    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-workdir", 0, "define workdir (required)", NULL);
     161    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-label",  0, "define label", NULL);
     162    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-reduction",  0, "define reduction class", NULL);
     163    psMetadataAddTime(definewarpstackArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
     164    psMetadataAddBool(definewarpstackArgs, PS_LIST_TAIL, "-new-templates", 0, "also search for diffs with new template", false);
     165    psMetadataAddBool(definewarpstackArgs, PS_LIST_TAIL, "-rerun", 0, "define new run even if one exists", false);
     166    psMetadataAddBool(definewarpstackArgs, PS_LIST_TAIL, "-available", 0, "define new run even if warpRun has some faults", false);
     167    psMetadataAddBool(definewarpstackArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
     168    psMetadataAddBool(definewarpstackArgs, PS_LIST_TAIL, "-pretend", 0, "list results but to not queue", false);
    168169
    169170    // -definewarpwarp
     
    239240    PXOPT_ADD_MODE("-revertdiffskyfile","", DIFFTOOL_MODE_REVERTDIFFSKYFILE, revertdiffskyfileArgs);
    240241    PXOPT_ADD_MODE("-definepoprun",     "", DIFFTOOL_MODE_DEFINEPOPRUN,      definepoprunArgs);
    241     PXOPT_ADD_MODE("-definebyquery",    "", DIFFTOOL_MODE_DEFINEBYQUERY,     definebyqueryArgs);
     242    PXOPT_ADD_MODE("-definewarpstack",  "", DIFFTOOL_MODE_DEFINEWARPSTACK,   definewarpstackArgs);
    242243    PXOPT_ADD_MODE("-definewarpwarp",   "", DIFFTOOL_MODE_DEFINEWARPWARP,    definewarpwarpArgs);
    243244    PXOPT_ADD_MODE("-pendingcleanuprun",     "show runs that need to be cleaned up", DIFFTOOL_MODE_PENDINGCLEANUPRUN,    pendingcleanuprunArgs);
  • trunk/ippTools/src/magictool.c

    r23970 r24174  
    127127    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
    128128    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
    129 
    130     psMetadata *where = psMetadataAlloc();
    131     PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
    132     PXOPT_COPY_STR(config->args, where, "-diff_label", "diffRun.label", "==");
    133 
     129    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
     130
     131    psMetadata *diffWhere = psMetadataAlloc(); // WHERE conditions for diffRuns
     132    PXOPT_COPY_STR(config->args, diffWhere, "-diff_label", "diffRun.label", "==");
     133    PXOPT_COPY_S64(config->args, diffWhere, "-diff_id", "diff_id", "==");
     134
     135    psMetadata *queryWhere = psMetadataAlloc(); // WHERE conditions for everything else
     136    PXOPT_COPY_S64(config->args, queryWhere, "-exp_id", "exp_id", "==");
    134137
    135138    // Get list of exposures ready to magic
     
    146149        PXOPT_LOOKUP_BOOL(rerun, config->args, "-rerun", false);
    147150
    148         psString queryWhere = NULL;     // WHERE conditions for entire query
     151        psString diffWhereStr = NULL;   // WHERE conditions for diffRuns
     152        psString queryWhereStr = NULL;  // WHERE conditions for entire query
    149153        if (!available) {
    150             psStringAppend(&queryWhere, " \nWHERE diffRun.state = 'full'");
    151         } else {
    152             // what if no skycells for the diff run completed?
    153         }
     154            psStringAppend(&diffWhereStr, "\nAND diffRun.state = 'full'");
     155        }
     156        // what if no skycells for the diff run completed?
     157
    154158        if (!rerun) {
    155             const char *newWhere = " magic_id IS NULL"; // String to add
    156             if (queryWhere) {
    157                 psStringAppend(&queryWhere, " AND %s", newWhere);
    158             } else {
    159                 psStringAppend(&queryWhere, "\nWHERE %s", newWhere);
    160             }
    161         }
     159            psStringAppend(&queryWhereStr, "\n%s magic_id IS NULL", queryWhereStr ? "AND" : "WHERE");
     160        }
     161
    162162        // now add the user specified qualifiers
    163         if (psListLength(where->list)) {
    164             psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
    165             psStringAppend(&queryWhere, "\n%s %s", queryWhere == NULL ? "WHERE" : "AND", whereClause);
     163        if (psListLength(diffWhere->list)) {
     164            psString whereClause = psDBGenerateWhereConditionSQL(diffWhere, NULL);
     165            psStringAppend(&diffWhereStr, "\nAND %s", whereClause);
    166166            psFree(whereClause);
    167167        }
    168         psFree(where);
    169         if (!queryWhere) {
    170             psStringAppend(&queryWhere, " ");
    171         }
    172 
    173         if (!p_psDBRunQueryF(config->dbh, query, queryWhere)) {
     168        if (psListLength(queryWhere->list)) {
     169            psString whereClause = psDBGenerateWhereConditionSQL(queryWhere, NULL);
     170            psStringAppend(&queryWhereStr, "\n%s %s", queryWhereStr ? "AND" : "WHERE", whereClause);
     171            psFree(whereClause);
     172        }
     173        psFree(diffWhere);
     174        psFree(queryWhere);
     175
     176        // Ensure the WHERE strings have something
     177        if (!diffWhereStr) {
     178            diffWhereStr = psStringCopy("");
     179        }
     180        if (!queryWhereStr) {
     181            queryWhereStr = psStringCopy("");
     182        }
     183
     184        if (!p_psDBRunQueryF(config->dbh, query, diffWhereStr, diffWhereStr, queryWhereStr)) {
    174185            psError(PS_ERR_UNKNOWN, false, "database error");
    175             psFree(queryWhere);
     186            psFree(diffWhereStr);
     187            psFree(queryWhereStr);
    176188            psFree(query);
    177189            return false;
    178190        }
    179         psFree(queryWhere);
     191        psFree(diffWhereStr);
     192        psFree(queryWhereStr);
    180193        psFree(query);
    181194    }
     
    201214    }
    202215
     216
     217    if (pretend) {
     218        // negative simple so the default is true
     219        if (!ippdbPrintMetadatas(stdout, output, "diffRun", !simple)) {
     220            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     221            psFree(output);
     222            return false;
     223        }
     224        psFree(output);
     225        return true;
     226    }
     227
     228
    203229    // Parse the list of exposures ready to magic
    204 
    205230    if (!psDBTransaction(config->dbh)) {
    206231        psError(PS_ERR_UNKNOWN, false, "database error");
     
    215240        psS64 exp_id = psMetadataLookupS64(NULL, row, "exp_id"); // Exposure identifier
    216241        psS64 diff_id = psMetadataLookupS64(NULL, row, "diff_id"); // difference identifier
     242        bool inverse = psMetadataLookupU64(NULL, row, "inverse"); // Inverse subtraction? Note types!
    217243
    218244        // create a new magicRun for this group
    219         magicRunRow *run = magicRunRowAlloc(0, exp_id, diff_id, "new", workdir, "dirty", label, dvodb, registered, 0);
     245        magicRunRow *run = magicRunRowAlloc(0, exp_id, diff_id, inverse, "new", workdir, "dirty", label,
     246                                            dvodb, registered, 0);
    220247        if (!run) {
    221248            psAbort("failed to alloc magicRun object");
     
    296323
    297324    // optional
     325    PXOPT_LOOKUP_BOOL(inverse, config->args, "-inverse", false);
    298326    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
    299327    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     
    305333            exp_id,
    306334            diff_id ? diff_id : PS_MAX_S64,
     335            inverse,
    307336            "reg",      // state
    308337            workdir,
     
    363392    // required
    364393    PXOPT_LOOKUP_S64(magic_id, config->args, "-magic_id", true, false);
    365     PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", true, false);
    366394    PXOPT_LOOKUP_STR(node, config->args, "-node", true, false);
    367395
     
    369397            config->dbh,
    370398            magic_id,
    371             diff_id,
    372399            node
    373400    );
     
    563590    PXOPT_COPY_S16(config->args, where, "-fault", "fault", "==");
    564591
    565     psString query = psStringCopy("UPDATE magicRun SET fault = 0, state = 'run' WHERE fault != 0");
     592    psString query = psStringCopy("UPDATE magicRun SET fault = 0, state = 'new' WHERE fault != 0");
    566593
    567594    if (psListLength(where->list)) {
     
    584611    PS_ASSERT_PTR_NON_NULL(config, false);
    585612
    586     psMetadata *where = psMetadataAlloc();
    587     PXOPT_COPY_S64(config->args, where, "-magic_id", "magic_id", "==");
    588     PXOPT_COPY_STR(config->args, where, "-node", "node", "==");
     613    // Regrettably, there are multiple WHERE hooks which call the same things different names
     614    psMetadata *templatesWhere = psMetadataAlloc(); // WHERE for selecting template
     615    psMetadata *magicWhere = psMetadataAlloc();     // WHERE for selecting magic runs
     616
     617    PXOPT_COPY_S64(config->args, templatesWhere, "-magic_id", "magicRun.magic_id", "==");
     618    PXOPT_COPY_STR(config->args, templatesWhere, "-node", "diffInputSkyfile.skycell_id", "==");
     619
     620    PXOPT_COPY_S64(config->args, magicWhere, "-magic_id", "magicRun.magic_id", "==");
     621    PXOPT_COPY_STR(config->args, magicWhere, "-node", "magicTree.node", "==");
    589622
    590623    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     
    597630    }
    598631
    599     if (psListLength(where->list)) {
    600         psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
    601         psStringAppend(&query, " AND %s", whereClause);
     632    psString templatesWhereStr = psStringCopy(""); // WHERE for selecting template
     633    psString magicWhereStr = psStringCopy("");     // WHERE for selecting magic runs
     634
     635    if (psListLength(templatesWhere->list)) {
     636        psString whereClause = psDBGenerateWhereConditionSQL(templatesWhere, NULL);
     637        psStringAppend(&templatesWhereStr, "\nAND %s", whereClause);
    602638        psFree(whereClause);
    603639    }
    604     psFree(where);
     640    psFree(templatesWhere);
     641
     642    if (psListLength(magicWhere->list)) {
     643        psString whereClause = psDBGenerateWhereConditionSQL(magicWhere, NULL);
     644        psStringAppend(&magicWhereStr, "\nWHERE %s", whereClause);
     645        psFree(whereClause);
     646    }
     647    psFree(magicWhere);
    605648
    606649    // treat limit == 0 as "no limit"
     
    611654    }
    612655
    613     if (!p_psDBRunQuery(config->dbh, query)) {
    614         psError(PS_ERR_UNKNOWN, false, "database error");
     656    if (!p_psDBRunQueryF(config->dbh, query,
     657                         templatesWhereStr, templatesWhereStr,
     658                         magicWhereStr, magicWhereStr)) {
     659        psError(PS_ERR_UNKNOWN, false, "database error");
     660        psFree(templatesWhereStr);
     661        psFree(magicWhereStr);
    615662        psFree(query);
    616663        return false;
    617664    }
     665    psFree(templatesWhereStr);
     666    psFree(magicWhereStr);
    618667    psFree(query);
    619668
     
    704753
    705754            bool status = false;
    706             psS32 done = psMetadataLookupS32(&status, data, "done");
     755            psS64 done = psMetadataLookupS64(&status, data, "done");
    707756            if (!status) {
    708757                psAbort("failed to lookup value for done column");
    709758            }
    710             psS16 bad = psMetadataLookupS16(&status, data, "bad");
     759            psS64 bad = psMetadataLookupS64(&status, data, "bad");
    711760            if (!status) {
    712761                psAbort("failed to lookup value for bad column");
     
    738787
    739788    psMetadata *where = psMetadataAlloc();
    740     PXOPT_COPY_S64(config->args, where, "-magic_id", "magic_id", "==");
     789    PXOPT_COPY_S64(config->args, where, "-magic_id", "magicRun.magic_id", "==");
    741790    pxAddLabelSearchArgs (config, where, "-label", "magicRun.label", "==");
    742791
     
    794843    if (limit) {
    795844        if (psArrayLength(output) >= limit) {
    796             // we've found enough (not that limit was applied to the query so '> limit' won't happen)
     845            // we've found enough (note that limit was applied to the query so '> limit' won't happen)
    797846            // negative simple so the default is true
    798847            if (!ippdbPrintMetadatas(stdout, output, "magicMe", !simple)) {
     
    936985
    937986    // optional
    938     PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
     987    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
    939988
    940989    // default values
     
    944993                               magic_id,
    945994                               node,
    946                                uri,
     995                               path_base,
    947996                               fault
    948997        )) {
  • trunk/ippTools/src/magictoolConfig.c

    r23969 r24174  
    5353    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-dvodb",       0, "define dvodb", NULL);
    5454    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
     55    psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-diff_id", 0, "search diff_id", 0);
    5556    psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-exp_id", 0, "search exp_id", 0);
    5657    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-diff_label", 0, "select diff label", NULL);
     
    5859    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-rerun", 0, "generate new run even if existing?", false);
    5960    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
     61    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-pretend", 0, "list results but do not queue", false);
    6062
    6163    // -definerun
     
    6567    // following argument is for compatability
    6668    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-diff_id", 0, "define diff_id", 0);
     69    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-inverse", 0, "use the inverse subtraction?", false);
    6770    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", 0, "define label", NULL);
    6871    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-dvodb", 0, "define dvodb", NULL);
     
    7881    psMetadata *addinputskyfileArgs = psMetadataAlloc();
    7982    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-magic_id", 0, "define magictool ID (required)", 0);
    80     psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0, "define difftool ID (required)", 0);
    8183    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-node", 0, "define symbolic node name (required)", NULL);
    8284
     
    125127    psMetadataAddS64(addresultArgs, PS_LIST_TAIL, "-magic_id", 0, "define magictool ID (required)", 0);
    126128    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-node", 0, "define symbolic node name (required)", NULL);
    127     psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-uri", 0, "define URI", NULL);
     129    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-path_base", 0, "define path_base", NULL);
    128130    psMetadataAddS16(addresultArgs, PS_LIST_TAIL, "-fault", 0, "set fault code", 0);
    129131
Note: See TracChangeset for help on using the changeset viewer.