IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 18, 2010, 12:49:05 PM (16 years ago)
Author:
eugene
Message:

merging changes from trunk into branches/pap

Location:
branches/pap
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/pap

  • branches/pap/ippTools/src/warptool.c

    r27503 r28003  
    5959static bool importrunMode(pxConfig *config);
    6060static bool runstateMode(pxConfig *config);
     61static bool listrunMode(pxConfig *config);
     62static bool setskyfiletoupdateMode(pxConfig *config);
    6163
    6264static bool parseAndInsertSkyCellMap(pxConfig *config, const char *mapfile);
     
    110112        MODECASE(WARPTOOL_MODE_IMPORTRUN,          importrunMode);
    111113        MODECASE(WARPTOOL_MODE_RUNSTATE,           runstateMode);
     114        MODECASE(WARPTOOL_MODE_LISTRUN,            listrunMode);
     115        MODECASE(WARPTOOL_MODE_SETSKYFILETOUPDATE, setskyfiletoupdateMode);
    112116
    113117        default:
     
    244248    PXOPT_COPY_F64(config->args,   where, "-posang_max",         "rawExp.posang",         "<");
    245249    PXOPT_COPY_STR(config->args,   where, "-object",             "rawExp.object",         "==");
     250    PXOPT_COPY_STR(config->args,   where, "-comment",            "rawExp.comment",        "LIKE");
     251    PXOPT_COPY_STR(config->args,   where, "-obs_mode",           "rawExp.obs_mode",       "LIKE");
    246252    PXOPT_COPY_F32(config->args,   where, "-sun_angle_min",      "rawExp.sun_angle",      ">=");
    247253    PXOPT_COPY_F32(config->args,   where, "-sun_angle_max",      "rawExp.sun_angle",      "<");
     
    269275    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
    270276    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     277    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
    271278
    272279    // check mode
     
    306313    if (!psArrayLength(output)) {
    307314        psTrace("warptool", PS_LOG_INFO, "no rows found");
     315        psFree(output);
     316        return true;
     317    }
     318
     319    if (pretend) {
     320        // negative simple so the default is true
     321        if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
     322            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     323            psFree(output);
     324            return false;
     325        }
    308326        psFree(output);
    309327        return true;
     
    916934
    917935    // treat limit == 0 as "no limit"
     936    psString limitString = psStringCopy("\n");
    918937    if (limit) {
    919         psString limitString = psDBGenerateLimitSQL(limit);
     938        // We apply the limit to both sides of the UNION
     939        // to avoid slow queries and to the query itself
     940        // to satisfy the user's requested limit
     941        psStringAppend(&limitString, "%s", psDBGenerateLimitSQL(limit));
    920942        psStringAppend(&query, " %s", limitString);
    921         psFree(limitString);
    922     }
    923 
     943    }
     944
     945#define TWO_WHERES
    924946#ifdef TWO_WHERES
    925     if (!p_psDBRunQueryF(config->dbh, query, whereStr, whereStr)) {
     947    if (!p_psDBRunQueryF(config->dbh, query, whereStr, limitString, whereStr,  limitString)) {
    926948        psError(PS_ERR_UNKNOWN, false, "database error");
    927949        psFree(query);
     
    935957    }
    936958#endif
     959    psFree(limitString);
    937960    psFree(whereStr);
    938961    psFree(query);
     
    9941017    PXOPT_LOOKUP_STR(hostname, config->args, "-hostname", false, false);
    9951018    PXOPT_LOOKUP_F32(good_frac, config->args, "-good_frac", false, false);
    996     PXOPT_LOOKUP_S64(magicked, config->args, "-magicked", false, false);
     1019    PXOPT_LOOKUP_S64(magicked, config->args, "-set_magicked", false, false);
    9971020
    9981021    // default values
     
    12421265    if (psListLength(where->list)) {
    12431266        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
    1244         psStringAppend(&query, " AND %s", whereClause);
     1267        psStringAppend(&query, " WHERE %s", whereClause);
    12451268        psFree(whereClause);
    12461269    } else if (!all && !where2) {
     
    12481271        return false;
    12491272    }
     1273
     1274    if (where2) {
     1275        if (psListLength(where->list)) {
     1276            psStringAppend(&query, " %s", where2);
     1277        } else {
     1278            psStringAppend(&query, " WHERE 1 %s", where2);
     1279        }
     1280    }
    12501281    psFree(where);
    1251 
    1252     if (where2) {
    1253         psStringAppend(&query, " %s", where2);
    1254     }
    12551282
    12561283    // treat limit == 0 as "no limit"
     
    13221349    }
    13231350
    1324     if (!psDBTransaction(config->dbh)) {
    1325         psError(PS_ERR_UNKNOWN, false, "database error");
    1326         psFree(where);
    1327         return false;
    1328     }
    1329 
    1330     // Delete product
    1331     int numDeleted;                     // Number deleted
    1332     {
    1333         psString query = pxDataGet("warptool_revertwarped_delete.sql");
    1334         if (!query) {
    1335             psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
    1336             if (!psDBRollback(config->dbh)) {
    1337                 psError(PS_ERR_UNKNOWN, false, "database error");
    1338             }
    1339             return false;
    1340         }
    1341 
    1342         if (psListLength(where->list)) {
    1343             psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
    1344             psStringAppend(&query, " AND %s", whereClause);
    1345             psFree(whereClause);
    1346         }
    1347 
    1348         if (!p_psDBRunQuery(config->dbh, query)) {
    1349             psError(PS_ERR_UNKNOWN, false, "database error");
    1350             psFree(query);
    1351             if (!psDBRollback(config->dbh)) {
    1352                 psError(PS_ERR_UNKNOWN, false, "database error");
    1353             }
    1354             return false;
    1355         }
     1351    psString query = pxDataGet("warptool_revertwarped_delete.sql");
     1352    if (!query) {
     1353        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     1354        return false;
     1355    }
     1356    psString query_updated = pxDataGet("warptool_revertwarped_updated.sql");
     1357    if (!query_updated) {
     1358        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     1359        return false;
     1360    }
     1361
     1362    if (psListLength(where->list)) {
     1363        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
     1364        psStringAppend(&query, " AND %s", whereClause);
     1365        psStringAppend(&query_updated, " AND %s", whereClause);
     1366        psFree(whereClause);
     1367    }
     1368    psFree(where);
     1369
     1370    if (!p_psDBRunQuery(config->dbh, query)) {
     1371        psError(PS_ERR_UNKNOWN, false, "database error");
    13561372        psFree(query);
    1357 
    1358         numDeleted = psDBAffectedRows(config->dbh);
    1359     }
     1373        return false;
     1374    }
     1375    psFree(query);
     1376
     1377    int numDeleted = psDBAffectedRows(config->dbh);
    13601378
    13611379    psLogMsg("warptool", PS_LOG_INFO, "Deleted %d warpSkyfiles", numDeleted);
    13621380
    1363     psFree(where);
    1364 
    1365     if (!psDBCommit(config->dbh)) {
    1366         psError(PS_ERR_UNKNOWN, false, "database error");
    1367         return false;
    1368     }
     1381    // fix any faulted warpSkyfiles in data_state 'update'
     1382
     1383    if (!p_psDBRunQuery(config->dbh, query_updated)) {
     1384        psError(PS_ERR_UNKNOWN, false, "database error");
     1385        psFree(query_updated);
     1386        return false;
     1387    }
     1388    psFree(query_updated);
     1389
     1390    int numUpdated = psDBAffectedRows(config->dbh);
     1391
     1392    psLogMsg("warptool", PS_LOG_INFO, "Updated %d warpSkyfiles", numUpdated);
    13691393
    13701394    return true;
     
    16651689    }
    16661690
    1667     char *set_magicked_skyfile = "";
    1668     char *set_magicked_run = "";
     1691    psString set_magicked_skyfile = psStringCopy("");
     1692    psString set_magicked_run = psStringCopy("");
    16691693    if (!strcmp(data_state, "full")) {
    1670         set_magicked_skyfile = "\n , warpSkyfile.magicked = IF((warpSkyfile.magicked < 0 AND chipRun.magicked = 0), warpSkyfile.magicked, chipRun.magicked)";
    1671         set_magicked_run = "\n,  warpRun.magicked = IF((warpRun.magicked < 0 AND chipRun.magicked = 0), warpRun.magicked, chipRun.magicked)";
    1672 
     1694        // magicked is only an argument for for -tofullskyfile
     1695        PXOPT_LOOKUP_S64(magicked, config->args, "-set_magicked", false, false);
     1696        if (magicked) {
     1697            psStringAppend(&set_magicked_skyfile, "\n , warpSkyfile.magicked = %" PRId64, magicked);
     1698            psStringAppend(&set_magicked_run, "\n,  warpRun.magicked = %" PRId64, magicked);
     1699        }
    16731700    } else if (!strcmp(data_state, "cleaned") || !strcmp(data_state, "purged")) {
    1674         set_magicked_skyfile = "\n, warpSkyfile.magicked = IF(warpSkyfile.magicked = 0, 0, -1)";
    1675         set_magicked_run = "\n, warpRun.magicked = IF(warpRun.magicked = 0, 0, -1)";
     1701        // if magicked is currently nonzero set it to -1
     1702        // Set warpRun.magicked when the first skyfile is cleaned
     1703        psStringAppend(&set_magicked_skyfile, "\n, warpSkyfile.magicked = IF(warpSkyfile.magicked = 0, 0, -1), warpRun.magicked = IF(warpRun.magicked = 0, 0, -1)");
    16761704    }
    16771705
     
    16861714    }
    16871715    psFree(query);
     1716    psFree(set_magicked_skyfile);
    16881717
    16891718    query = pxDataGet("warptool_change_run_state.sql");
     
    16961725        return false;
    16971726    }
     1727    psFree(set_magicked_run);
    16981728
    16991729    if (!psDBCommit(config->dbh)) {
     
    20262056    return true;
    20272057}
     2058
     2059static bool listrunMode(pxConfig *config)
     2060{
     2061    PS_ASSERT_PTR_NON_NULL(config, false);
     2062
     2063    psMetadata *where = psMetadataAlloc();
     2064    PXOPT_COPY_S64(config->args, where, "-warp_id",    "warpRun.warp_id", "==");
     2065    PXOPT_COPY_STR(config->args, where, "-tess_id",    "warpRun.tess_id", "==");
     2066    PXOPT_COPY_STR(config->args, where, "-state",      "warpRun.state", "==");
     2067    PXOPT_COPY_S64(config->args, where, "-exp_id",     "rawExp.exp_id", "==");
     2068    PXOPT_COPY_STR(config->args, where, "-exp_name",   "rawExp.exp_name", "==");
     2069    PXOPT_COPY_S64(config->args, where, "-fake_id",    "fakeRun.fake_id", "==");
     2070    PXOPT_COPY_TIME(config->args, where, "-dateobs_begin", "rawExp.dateobs",  ">=");
     2071    PXOPT_COPY_TIME(config->args, where, "-dateobs_end",   "rawExp.dateobs",  "<=");
     2072    PXOPT_COPY_STR(config->args, where, "-filter",    "rawExp.filter", "LIKE");
     2073    PXOPT_COPY_S64(config->args, where, "-magicked", "warpRun.magicked", "==");
     2074    pxAddLabelSearchArgs (config, where, "-label",   "warpRun.label", "LIKE");
     2075    pxAddLabelSearchArgs (config, where, "-data_group",   "warpRun.data_group", "LIKE");
     2076    pxAddLabelSearchArgs (config, where, "-dist_group",   "warpRun.dist_group", "LIKE");
     2077
     2078    PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
     2079
     2080    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     2081    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     2082    PXOPT_LOOKUP_BOOL(pstamp_order, config->args, "-pstamp_order", false);
     2083
     2084    // find all rawImfiles matching the default query
     2085    psString query = pxDataGet("warptool_listrun.sql");
     2086    if (!query) {
     2087        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     2088        return false;
     2089    }
     2090
     2091    // generate where strings for arguments that require extra processing
     2092    // beyond PXOPT_COPY*
     2093    psString where2 = NULL;
     2094    if (!pxmagicAddWhere(config, &where2, "warpRun")) {
     2095        psError(psErrorCodeLast(), false, "pxMagicAddWhere failed");
     2096        return false;
     2097    }
     2098    if (!pxspaceAddWhere(config, &where2, "rawExp")) {
     2099        psError(psErrorCodeLast(), false, "pxSpaceAddWhere failed");
     2100        return false;
     2101    }
     2102
     2103    if (psListLength(where->list)) {
     2104        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
     2105        psStringAppend(&query, " WHERE %s", whereClause);
     2106        psFree(whereClause);
     2107    } else if (!all && !where2) {
     2108        psError(PXTOOLS_ERR_CONFIG, true, "search parameters or -all are required");
     2109        return false;
     2110    }
     2111
     2112    if (where2) {
     2113        if (psListLength(where->list)) {
     2114            psStringAppend(&query, " %s", where2);
     2115        } else {
     2116            psStringAppend(&query, " WHERE 1 %s", where2);
     2117        }
     2118    }
     2119    psFree(where);
     2120
     2121    if (pstamp_order) {
     2122        // put runs in order of exposure id with newest chip Runs first
     2123        // The postage stamp parser depends on this behavior
     2124        psStringAppend(&query, "\nORDER by exp_id, warp_id DESC");
     2125    }
     2126
     2127
     2128    // treat limit == 0 as "no limit"
     2129    if (limit) {
     2130        psString limitString = psDBGenerateLimitSQL(limit);
     2131        psStringAppend(&query, " %s", limitString);
     2132        psFree(limitString);
     2133    }
     2134
     2135    if (!p_psDBRunQuery(config->dbh, query)) {
     2136        psError(PS_ERR_UNKNOWN, false, "database error");
     2137        psFree(query);
     2138        return false;
     2139    }
     2140    psFree(query);
     2141
     2142    psArray *output = p_psDBFetchResult(config->dbh);
     2143    if (!output) {
     2144        psErrorCode err = psErrorCodeLast();
     2145        switch (err) {
     2146            case PS_ERR_DB_CLIENT:
     2147                psError(PXTOOLS_ERR_SYS, false, "database error");
     2148            case PS_ERR_DB_SERVER:
     2149                psError(PXTOOLS_ERR_PROG, false, "database error");
     2150            default:
     2151                psError(PXTOOLS_ERR_PROG, false, "unknown error");
     2152        }
     2153
     2154        return false;
     2155    }
     2156    if (!psArrayLength(output)) {
     2157        psTrace("warptool", PS_LOG_INFO, "no rows found");
     2158        psFree(output);
     2159        return true;
     2160    }
     2161
     2162    if (psArrayLength(output)) {
     2163        // negative simple so the default is true
     2164        if (!ippdbPrintMetadatas(stdout, output, "warpRun", !simple)) {
     2165            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     2166            psFree(output);
     2167            return false;
     2168        }
     2169    }
     2170
     2171    psFree(output);
     2172
     2173    return true;
     2174}
     2175
     2176// a very specfic function to queue a cleaned warpSkyfile to be updated
     2177static bool setskyfiletoupdateMode(pxConfig *config)
     2178{
     2179    PS_ASSERT_PTR_NON_NULL(config, NULL);
     2180
     2181    PXOPT_LOOKUP_S64(warp_id, config->args, "-warp_id", true, false);
     2182    PXOPT_LOOKUP_STR(skycell_id, config->args, "-skycell_id", false, false);
     2183    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
     2184
     2185    psString query = pxDataGet("warptool_setskyfiletoupdate.sql");
     2186    if (!query) {
     2187        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     2188        return false;
     2189    }
     2190
     2191    psString setHook = psStringCopy("");
     2192    if (label) {
     2193        psStringAppend(&setHook, "\n , warpRun.label = '%s'", label);
     2194    }
     2195
     2196    if (skycell_id) {
     2197        psStringAppend(&query, " AND (warpSkyfile.skycell_id = '%s')", skycell_id);
     2198    }
     2199
     2200    if (!p_psDBRunQueryF(config->dbh, query, setHook, warp_id)) {
     2201        psError(PS_ERR_UNKNOWN, false, "database error");
     2202        return false;
     2203    }
     2204
     2205    psFree(setHook);
     2206    psFree(query);
     2207
     2208    return true;
     2209}
Note: See TracChangeset for help on using the changeset viewer.