IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 23, 2010, 11:19:20 AM (16 years ago)
Author:
bills
Message:

Fix very slow query for -towarped. Re-enable update processing;
Add -setskyfiletoupdate mode to queue updates for a single skycell.
Add -listrun.
Various other changes to support the postage stamp server.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippTools/src/warptool.c

    r27503 r27737  
    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:
     
    916920
    917921    // treat limit == 0 as "no limit"
     922    psString limitString = psStringCopy("\n");
    918923    if (limit) {
    919         psString limitString = psDBGenerateLimitSQL(limit);
     924        // We apply the limit to both sides of the UNION
     925        // to avoid slow queries and to the query itself
     926        // to satisfy the user's requested limit
     927        psStringAppend(&limitString, psDBGenerateLimitSQL(limit));
    920928        psStringAppend(&query, " %s", limitString);
    921         psFree(limitString);
    922     }
    923 
     929    }
     930
     931#define TWO_WHERES
    924932#ifdef TWO_WHERES
    925     if (!p_psDBRunQueryF(config->dbh, query, whereStr, whereStr)) {
     933    if (!p_psDBRunQueryF(config->dbh, query, whereStr, limitString, whereStr,  limitString)) {
    926934        psError(PS_ERR_UNKNOWN, false, "database error");
    927935        psFree(query);
     
    935943    }
    936944#endif
     945    psFree(limitString);
    937946    psFree(whereStr);
    938947    psFree(query);
     
    9941003    PXOPT_LOOKUP_STR(hostname, config->args, "-hostname", false, false);
    9951004    PXOPT_LOOKUP_F32(good_frac, config->args, "-good_frac", false, false);
    996     PXOPT_LOOKUP_S64(magicked, config->args, "-magicked", false, false);
     1005    PXOPT_LOOKUP_S64(magicked, config->args, "-set_magicked", false, false);
    9971006
    9981007    // default values
     
    12421251    if (psListLength(where->list)) {
    12431252        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
    1244         psStringAppend(&query, " AND %s", whereClause);
     1253        psStringAppend(&query, " WHERE %s", whereClause);
    12451254        psFree(whereClause);
    12461255    } else if (!all && !where2) {
     
    12481257        return false;
    12491258    }
     1259
     1260    if (where2) {
     1261        if (psListLength(where->list)) {
     1262            psStringAppend(&query, " %s", where2);
     1263        } else {
     1264            psStringAppend(&query, " WHERE 1 %s", where2);
     1265        }
     1266    }
    12501267    psFree(where);
    1251 
    1252     if (where2) {
    1253         psStringAppend(&query, " %s", where2);
    1254     }
    12551268
    12561269    // treat limit == 0 as "no limit"
     
    16651678    }
    16661679
    1667     char *set_magicked_skyfile = "";
    1668     char *set_magicked_run = "";
     1680    psString set_magicked_skyfile = psStringCopy("");
     1681    psString set_magicked_run = psStringCopy("");
    16691682    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 
     1683        // magicked is only an argument for for -tofullskyfile
     1684        PXOPT_LOOKUP_S64(magicked, config->args, "-set_magicked", false, false);
     1685        if (magicked) {
     1686            psStringAppend(&set_magicked_skyfile, "\n , warpSkyfile.magicked = %" PRId64, magicked);
     1687            psStringAppend(&set_magicked_run, "\n,  warpRun.magicked = %" PRId64, magicked);
     1688        }
    16731689    } 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)";
     1690        // if magicked is currently nonzero set it to -1
     1691        // Set warpRun.magicked when the first skyfile is cleaned
     1692        psStringAppend(&set_magicked_skyfile, "\n, warpSkyfile.magicked = IF(warpSkyfile.magicked = 0, 0, -1), warpRun.magicked = IF(warpRun.magicked = 0, 0, -1)");
    16761693    }
    16771694
     
    16861703    }
    16871704    psFree(query);
     1705    psFree(set_magicked_skyfile);
    16881706
    16891707    query = pxDataGet("warptool_change_run_state.sql");
     
    16961714        return false;
    16971715    }
     1716    psFree(set_magicked_run);
    16981717
    16991718    if (!psDBCommit(config->dbh)) {
     
    20262045    return true;
    20272046}
     2047
     2048static bool listrunMode(pxConfig *config)
     2049{
     2050    PS_ASSERT_PTR_NON_NULL(config, false);
     2051
     2052    psMetadata *where = psMetadataAlloc();
     2053    PXOPT_COPY_S64(config->args, where, "-warp_id",    "warpRun.warp_id", "==");
     2054    PXOPT_COPY_STR(config->args, where, "-tess_id",    "warpRun.tess_id", "==");
     2055    PXOPT_COPY_STR(config->args, where, "-state",      "warpRun.state", "==");
     2056    PXOPT_COPY_S64(config->args, where, "-exp_id",     "rawExp.exp_id", "==");
     2057    PXOPT_COPY_STR(config->args, where, "-exp_name",   "rawExp.exp_name", "==");
     2058    PXOPT_COPY_S64(config->args, where, "-fake_id",    "fakeRun.fake_id", "==");
     2059    PXOPT_COPY_TIME(config->args, where, "-dateobs_begin", "rawExp.dateobs",  ">=");
     2060    PXOPT_COPY_TIME(config->args, where, "-dateobs_end",   "rawExp.dateobs",  "<=");
     2061    PXOPT_COPY_STR(config->args, where, "-filter",    "rawExp.filter", "LIKE");
     2062    PXOPT_COPY_S64(config->args, where, "-magicked", "warpRun.magicked", "==");
     2063    pxAddLabelSearchArgs (config, where, "-label",   "warpRun.label", "LIKE");
     2064    pxAddLabelSearchArgs (config, where, "-data_group",   "warpRun.data_group", "LIKE");
     2065    pxAddLabelSearchArgs (config, where, "-dist_group",   "warpRun.dist_group", "LIKE");
     2066
     2067    PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
     2068
     2069    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     2070    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     2071    PXOPT_LOOKUP_BOOL(pstamp_order, config->args, "-pstamp_order", false);
     2072
     2073    // find all rawImfiles matching the default query
     2074    psString query = pxDataGet("warptool_listrun.sql");
     2075    if (!query) {
     2076        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     2077        return false;
     2078    }
     2079
     2080    // generate where strings for arguments that require extra processing
     2081    // beyond PXOPT_COPY*
     2082    psString where2 = NULL;
     2083    if (!pxmagicAddWhere(config, &where2, "warpRun")) {
     2084        psError(psErrorCodeLast(), false, "pxMagicAddWhere failed");
     2085        return false;
     2086    }
     2087    if (!pxspaceAddWhere(config, &where2, "rawExp")) {
     2088        psError(psErrorCodeLast(), false, "pxSpaceAddWhere failed");
     2089        return false;
     2090    }
     2091
     2092    if (psListLength(where->list)) {
     2093        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
     2094        psStringAppend(&query, " WHERE %s", whereClause);
     2095        psFree(whereClause);
     2096    } else if (!all && !where2) {
     2097        psError(PXTOOLS_ERR_CONFIG, true, "search parameters or -all are required");
     2098        return false;
     2099    }
     2100
     2101    if (where2) {
     2102        if (psListLength(where->list)) {
     2103            psStringAppend(&query, " %s", where2);
     2104        } else {
     2105            psStringAppend(&query, " WHERE 1 %s", where2);
     2106        }
     2107    }
     2108    psFree(where);
     2109
     2110    if (pstamp_order) {
     2111        // put runs in order of exposure id with newest chip Runs first
     2112        // The postage stamp parser depends on this behavior
     2113        psStringAppend(&query, "\nORDER by exp_id, warp_id DESC");
     2114    }
     2115
     2116
     2117    // treat limit == 0 as "no limit"
     2118    if (limit) {
     2119        psString limitString = psDBGenerateLimitSQL(limit);
     2120        psStringAppend(&query, " %s", limitString);
     2121        psFree(limitString);
     2122    }
     2123
     2124    if (!p_psDBRunQuery(config->dbh, query)) {
     2125        psError(PS_ERR_UNKNOWN, false, "database error");
     2126        psFree(query);
     2127        return false;
     2128    }
     2129    psFree(query);
     2130
     2131    psArray *output = p_psDBFetchResult(config->dbh);
     2132    if (!output) {
     2133        psErrorCode err = psErrorCodeLast();
     2134        switch (err) {
     2135            case PS_ERR_DB_CLIENT:
     2136                psError(PXTOOLS_ERR_SYS, false, "database error");
     2137            case PS_ERR_DB_SERVER:
     2138                psError(PXTOOLS_ERR_PROG, false, "database error");
     2139            default:
     2140                psError(PXTOOLS_ERR_PROG, false, "unknown error");
     2141        }
     2142
     2143        return false;
     2144    }
     2145    if (!psArrayLength(output)) {
     2146        psTrace("warptool", PS_LOG_INFO, "no rows found");
     2147        psFree(output);
     2148        return true;
     2149    }
     2150
     2151    if (psArrayLength(output)) {
     2152        // negative simple so the default is true
     2153        if (!ippdbPrintMetadatas(stdout, output, "warpRun", !simple)) {
     2154            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     2155            psFree(output);
     2156            return false;
     2157        }
     2158    }
     2159
     2160    psFree(output);
     2161
     2162    return true;
     2163}
     2164
     2165// a very specfic function to queue a cleaned warpSkyfile to be updated
     2166static bool setskyfiletoupdateMode(pxConfig *config)
     2167{
     2168    PS_ASSERT_PTR_NON_NULL(config, NULL);
     2169
     2170    PXOPT_LOOKUP_S64(warp_id, config->args, "-warp_id", true, false);
     2171    PXOPT_LOOKUP_STR(skycell_id, config->args, "-skycell_id", false, false);
     2172    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
     2173
     2174    psString query = pxDataGet("warptool_setskyfiletoupdate.sql");
     2175    if (!query) {
     2176        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     2177        return false;
     2178    }
     2179
     2180    psString setHook = psStringCopy("");
     2181    if (label) {
     2182        psStringAppend(&setHook, "\n , warpRun.label = '%s'", label);
     2183    }
     2184
     2185    if (skycell_id) {
     2186        psStringAppend(&query, " AND (warpSkyfile.skycell_id = '%s')", skycell_id);
     2187    }
     2188
     2189    if (!p_psDBRunQueryF(config->dbh, query, setHook, warp_id)) {
     2190        psError(PS_ERR_UNKNOWN, false, "database error");
     2191        return false;
     2192    }
     2193
     2194    psFree(setHook);
     2195    psFree(query);
     2196
     2197    return true;
     2198}
Note: See TracChangeset for help on using the changeset viewer.