IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 17, 2009, 12:08:50 PM (17 years ago)
Author:
beaumont
Message:

merged with head

Location:
branches/cnb_branches/cnb_branch_20090301
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/cnb_branches/cnb_branch_20090301

  • branches/cnb_branches/cnb_branch_20090301/ippTools/src/difftool.c

    r21402 r23352  
    4545static bool donecleanupMode(pxConfig *config);
    4646static bool updatediffskyfileMode(pxConfig *config);
     47static bool exportrunMode(pxConfig *config);
     48static bool importrunMode(pxConfig *config);
    4749
    4850static bool setdiffRunState(pxConfig *config, psS64 diff_id, const char *state);
     
    8183        MODECASE(DIFFTOOL_MODE_DONECLEANUP,           donecleanupMode);
    8284        MODECASE(DIFFTOOL_MODE_UPDATEDIFFSKYFILE,     updatediffskyfileMode);
     85        MODECASE(DIFFTOOL_MODE_EXPORTRUN,             exportrunMode);
     86        MODECASE(DIFFTOOL_MODE_IMPORTRUN,             importrunMode);
    8387        default:
    8488            psAbort("invalid option (this should not happen)");
     
    14371441}
    14381442
     1443bool exportrunMode(pxConfig *config)
     1444{
     1445  typedef struct ExportTable {
     1446    char tableName[80];
     1447    char sqlFilename[80];
     1448  } ExportTable;
     1449 
     1450  int numExportFiles = 3;
     1451
     1452  PS_ASSERT_PTR_NON_NULL(config, NULL);
     1453
     1454  PXOPT_LOOKUP_S64(det_id, config->args, "-diff_id", true,  false);
     1455  PXOPT_LOOKUP_STR(outfile, config->args, "-outfile", true,  false);
     1456  PXOPT_LOOKUP_U64(limit,   config->args, "-limit",   false, false);
     1457
     1458  FILE *f = fopen (outfile, "w");
     1459  if (f == NULL) {
     1460    psError(PS_ERR_UNKNOWN, false, "failed to open output file");
     1461    return false;
     1462  }
     1463
     1464  psMetadata *where = psMetadataAlloc();
     1465  PXOPT_COPY_S64(config->args, where, "-diff_id", "diff_id", "==");
     1466
     1467  ExportTable tables [] = {
     1468    {"diffRun", "difftool_export_run.sql"},
     1469    {"diffInputSkyfile", "difftool_export_input_skyfile.sql"},
     1470    {"diffSkyfile", "difftool_export_skyfile.sql"},
     1471  };
     1472
     1473  for (int i=0; i < numExportFiles; i++) {
     1474    psString query = pxDataGet(tables[i].sqlFilename);
     1475    if (!query) {
     1476      psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     1477      return false;
     1478    }
     1479
     1480    if (where && psListLength(where->list)) {
     1481      psString whereClause = psDBGenerateWhereSQL(where, NULL);
     1482      psStringAppend(&query, " %s", whereClause);
     1483      psFree(whereClause);
     1484    }
     1485
     1486    // treat limit == 0 as "no limit"
     1487    if (limit) {
     1488      psString limitString = psDBGenerateLimitSQL(limit);
     1489      psStringAppend(&query, " %s", limitString);
     1490      psFree(limitString);
     1491    }
     1492
     1493    if (!p_psDBRunQuery(config->dbh, query)) {
     1494      psError(PS_ERR_UNKNOWN, false, "database error");
     1495      psFree(query);
     1496      return false;
     1497    }
     1498    psFree(query);
     1499
     1500    psArray *output = p_psDBFetchResult(config->dbh);
     1501    if (!output) {
     1502      psError(PS_ERR_UNKNOWN, false, "database error");
     1503      return false;
     1504    }
     1505    if (!psArrayLength(output)) {
     1506      psTrace("regtool", PS_LOG_INFO, "no rows found");
     1507      psFree(output);
     1508      return true;
     1509    }
     1510
     1511    // we must write the export table in non-simple (true) format
     1512    if (!ippdbPrintMetadatas(f, output, tables[i].tableName, true)) {
     1513      psError(PS_ERR_UNKNOWN, false, "failed to print array");
     1514      psFree(output);
     1515      return false;
     1516    }
     1517    psFree(output);
     1518  }
     1519
     1520  fclose (f);
     1521
     1522  return true;
     1523}
     1524
     1525bool importrunMode(pxConfig *config)
     1526{
     1527  unsigned int nFail;
     1528 
     1529  int numImportTables = 2;
     1530 
     1531  char tables[2] [80] = {"diffInputSkyfile", "diffSkyfile"};
     1532
     1533  PS_ASSERT_PTR_NON_NULL(config, NULL);
     1534 
     1535  PXOPT_LOOKUP_STR(infile, config->args, "-infile", true,  false);
     1536
     1537  psMetadata *input = psMetadataConfigRead (NULL, &nFail, infile, false);
     1538
     1539  fprintf (stdout, "---- input ----\n");
     1540  psMetadataPrint (stderr, input, 1);
     1541
     1542  psMetadataItem *item = psMetadataLookup (input, "diffRun");
     1543  psAssert (item, "entry not in input?");
     1544  psAssert (item->type == PS_DATA_METADATA_MULTI, "entry not multi?");
     1545
     1546  psMetadataItem *entry = psListGet (item->data.list, 0);
     1547  assert (entry);
     1548  assert (entry->type == PS_DATA_METADATA);
     1549  diffRunRow *diffRun = diffRunObjectFromMetadata (entry->data.md);
     1550  diffRunInsertObject (config->dbh, diffRun);
     1551
     1552  // fprintf (stdout, "---- diff run ----\n");
     1553  // psMetadataPrint (stderr, entry->data.md, 1);
     1554
     1555  for (int i = 0; i < numImportTables; i++) {
     1556    item = psMetadataLookup (input, tables[i]);
     1557    psAssert (item, "entry not in input?");
     1558    psAssert (item->type == PS_DATA_METADATA_MULTI, "entry not multi?");
     1559 
     1560    switch (i) {
     1561      case 0:
     1562        for (int i = 0; i < item->data.list->n; i++) {
     1563          entry = psListGet (item->data.list, i);
     1564          assert (entry);
     1565          assert (entry->type == PS_DATA_METADATA);
     1566          diffInputSkyfileRow *diffInputSkyfile = diffInputSkyfileObjectFromMetadata (entry->data.md);
     1567          diffInputSkyfileInsertObject (config->dbh, diffInputSkyfile);
     1568
     1569          // fprintf (stdout, "---- row %d ----\n", i);
     1570          // psMetadataPrint (stderr, entry->data.md, 1);
     1571        }
     1572        break;
     1573       
     1574      case 1:
     1575        for (int i = 0; i < item->data.list->n; i++) {
     1576          entry = psListGet (item->data.list, i);
     1577          assert (entry);
     1578          assert (entry->type == PS_DATA_METADATA);
     1579          diffSkyfileRow *diffSkyfile = diffSkyfileObjectFromMetadata (entry->data.md);
     1580          diffSkyfileInsertObject (config->dbh, diffSkyfile);
     1581
     1582          // fprintf (stdout, "---- row %d ----\n", i);
     1583          // psMetadataPrint (stderr, entry->data.md, 1);
     1584        }
     1585        break;
     1586    }
     1587  }
     1588
     1589  return true;
     1590}
Note: See TracChangeset for help on using the changeset viewer.