IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 17245


Ignore:
Timestamp:
Mar 31, 2008, 12:36:14 PM (18 years ago)
Author:
eugene
Message:

need to have a save version which truncates

Location:
trunk/Ohana/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/delstar/src/delete_imagename.c

    r15743 r17245  
    5757      find_matches (&catalog, image[j].photcode, start, stop);
    5858
    59       dvo_catalog_save (&catalog, VERBOSE);
     59      dvo_catalog_save_complete (&catalog, VERBOSE);
    6060      dvo_catalog_unlock (&catalog);
    6161      dvo_catalog_free (&catalog);
  • trunk/Ohana/src/libdvo/include/dvo.h

    r17190 r17245  
    360360int dvo_catalog_open (Catalog *catalog, SkyRegion *region, int VERBOSE, char *iomode);
    361361int dvo_catalog_save (Catalog *catalog, char VERBOSE);
     362int dvo_catalog_save_complete (Catalog *catalog, char VERBOSE);
    362363int dvo_catalog_update (Catalog *catalog, char VERBOSE);
    363364int dvo_catalog_catformat (char *catformat);
     
    373374int dvo_catalog_save_split (Catalog *catalog, char VERBOSE);
    374375int dvo_catalog_update_split (Catalog *catalog, char VERBOSE);
     376int dvo_catalog_save_split_complete (Catalog *catalog, char VERBOSE);
    375377
    376378int dvo_catalog_load_segment (Catalog *catalog, int VERBOSE, int start, int Nrows);
  • trunk/Ohana/src/libdvo/src/dvo_catalog.c

    r16810 r17245  
    274274
    275275// write out the data, unlink if empty?  'save' means: write out all data currently in
    276 // memory.  NOTE: this is currently not always possible: for non-SPLIT moe files, this
     276// memory.  NOTE: this is currently not always possible: for non-SPLIT mode files, this
    277277// operation may require expanding the file size, which does not automatically happen
    278278int dvo_catalog_save (Catalog *catalog, char VERBOSE) {
     
    291291    case DVO_MODE_SPLIT:
    292292      dvo_catalog_save_split (catalog, VERBOSE);
     293      break;
     294    default:
     295      fprintf (stderr, "invalid catalog mode\n");
     296      exit (2);
     297  }
     298  return (TRUE);
     299}
     300
     301// write out the data, assuming the in-memory data represents all data for the table.
     302// NOTE: This operation may truncate the file and delete entries.
     303int dvo_catalog_save_complete (Catalog *catalog, char VERBOSE) {
     304
     305  // set the 'sorted' header keyword
     306  gfits_modify (&catalog[0].header, "SORTED",  "%t", 1, catalog[0].sorted);
     307
     308  // XXX handle return status
     309  switch (catalog[0].catmode) {
     310    case DVO_MODE_RAW:
     311      dvo_catalog_save_raw (catalog, VERBOSE);
     312      break;
     313    case DVO_MODE_MEF:
     314      dvo_catalog_save_mef (catalog, VERBOSE);
     315      break;
     316    case DVO_MODE_SPLIT:
     317      dvo_catalog_save_split_complete (catalog, VERBOSE);
    293318      break;
    294319    default:
  • trunk/Ohana/src/libdvo/src/dvo_catalog_split.c

    r17122 r17245  
    646646}
    647647
     648/* save_catalog_split writes all data currently in memory to disk, truncating if the disk file was larger */
     649int dvo_catalog_save_split_complete (Catalog *catalog, char VERBOSE) {
     650
     651  int Nitems;
     652  Header header;
     653  FTable ftable;
     654  SecFilt *primary, *secfilt;
     655  int Nsecfilt;
     656  int Naves_disk_new, Nmeas_disk_new, Nmiss_disk_new, Nsecf_disk_new;
     657  int first, start, Nrows;
     658
     659  ftable.header = &header;
     660  ftable.buffer = NULL;
     661  header.buffer = NULL;
     662  primary = NULL;
     663 
     664  // skip empty catalogs: it is illegal to have Measures without corresponding Averages
     665  if (catalog[0].Naves_off > 0) {
     666    fprintf (stderr, "ERROR: only partial catalog (Average) was loaded\n");
     667    goto failure;
     668  }
     669  if (catalog[0].Nmeas_off > 0) {
     670    fprintf (stderr, "ERROR: only partial catalog (Measure) was loaded\n");
     671    goto failure;
     672  }
     673  if (catalog[0].Nmiss_off > 0) {
     674    fprintf (stderr, "ERROR: only partial catalog (Missing) was loaded\n");
     675    goto failure;
     676  }
     677  if (catalog[0].Nsecf_off > 0) {
     678    fprintf (stderr, "ERROR: only partial catalog (Secfilt) was loaded\n");
     679    goto failure;
     680  }
     681
     682  if ((catalog[0].Naverage > 0) && (Naves_disk_new == 0)) {
     683    Naves_disk_new = catalog[0].Naverage;
     684    if (VERBOSE) fprintf (stderr, "resulting catalog is empty; delete it\n");
     685    // unlink ();
     686    return (TRUE);
     687  }
     688
     689  Naves_disk_new = catalog[0].Naverage;
     690
     691  // for the appropriate types, pull out the first secfilt and pass to AverageToFtable as primary
     692  switch (catalog[0].catformat) {
     693    case DVO_FORMAT_ELIXIR: // special case for ELIXIR
     694    case DVO_FORMAT_LONEOS: // special case for LONEOS
     695      dvo_catalog_secfilt_to_primary (catalog, &primary, &secfilt, &Nsecfilt);
     696      break;
     697    default:
     698      primary = NULL;
     699      secfilt = catalog[0].secfilt;
     700      Nsecfilt = catalog[0].Nsecfilt;
     701      break;
     702  }
     703
     704  Nmeas_disk_new = catalog[0].Nmeasure;
     705  Nmiss_disk_new = catalog[0].Nmissing;
     706  Nsecf_disk_new = catalog[0].Naverage*Nsecfilt;
     707
     708  /* make sure header is consistent with data */
     709  gfits_modify (&catalog[0].header, "NSTARS",   "%d", 1, Naves_disk_new);
     710  gfits_modify (&catalog[0].header, "NMEAS",    "%d", 1, Nmeas_disk_new);
     711  gfits_modify (&catalog[0].header, "NMISS",    "%d", 1, Nmiss_disk_new);
     712  gfits_modify (&catalog[0].header, "NSECFILT", "%d", 1, Nsecfilt);
     713  gfits_modify (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
     714
     715  /* in split mode, we can save only part of the data */
     716
     717  /*** Average Table ***/
     718  if ((catalog[0].catflags & LOAD_AVES) && (catalog[0].average != NULL)) {
     719
     720    first  = 0;                    // first row in memory to write
     721    start  = catalog[0].Naves_off; // first disk row to write
     722    Nrows  = catalog[0].Naverage - first;
     723
     724    assert (Nrows >= 0);
     725    assert (first >= 0);
     726    assert (first <= catalog[0].Naverage);
     727    assert (catalog[0].Naves_disk >= catalog[0].Naves_off);
     728
     729    /* convert internal to external format */
     730    if (!AverageToFtable (&ftable, &catalog[0].average[first], Nrows, catalog[0].catformat, primary)) {
     731      fprintf (stderr, "trouble converting format\n");
     732      goto failure;
     733    }
     734
     735    if (!dvo_catalog_save_subcat (catalog, &ftable, start, Nrows, catalog[0].Naves_disk, Naves_disk_new)) {
     736      fprintf (stderr, "failure writing Average table\n");
     737      goto failure;
     738    }
     739    gfits_free_header (&header);
     740    gfits_free_table (&ftable);
     741  } else {
     742    // even if we do not save the average table, we need to keep the header in sync
     743    /* rewind file pointers and truncate (file is still open) */
     744    fseek (catalog[0].f, 0, SEEK_SET);
     745
     746    /* write table PHU header - always write this out */
     747    /* XXX EAM : check if disk file size has changed */
     748    if (!gfits_fwrite_header  (catalog[0].f, &catalog[0].header)) {
     749      fprintf (stderr, "can't write primary header");
     750      goto failure;
     751    }
     752  }
     753
     754  /*** Measure Table ***/
     755  if ((catalog[0].catflags & LOAD_MEAS) && (catalog[0].measure != NULL)) {
     756
     757    first  = 0;                    // first row in memory to write
     758    start  = catalog[0].Nmeas_off; // first disk row to write
     759    Nrows  = catalog[0].Nmeasure - first;
     760
     761    assert (Nrows >= 0);
     762    assert (first >= 0);
     763    assert (first <= catalog[0].Nmeasure);
     764    assert (catalog[0].Nmeas_disk >= catalog[0].Nmeas_off);
     765
     766    // convert to external table format
     767    if (!MeasureToFtable (&ftable, &catalog[0].measure[first], Nrows, catalog[0].catformat)) {
     768      fprintf (stderr, "trouble converting format\n");
     769      goto failure;
     770    }
     771
     772    // write out Measure table
     773    if (!dvo_catalog_save_subcat (catalog[0].measure_catalog, &ftable, start, Nrows, catalog[0].Nmeas_disk, Nmeas_disk_new)) {
     774      fprintf (stderr, "trouble writing Measure table\n");
     775      goto failure;
     776    }
     777    gfits_free_header (&header);
     778    gfits_free_table (&ftable);
     779  }
     780
     781  /*** Missing Table ***/
     782  if ((catalog[0].catflags & LOAD_MISS) && (catalog[0].missing != NULL)) {
     783
     784    if (catalog[0].Nmiss_off != 0) {
     785      fprintf (stderr, "inconsistency: Missing table cannot be written in segments\n");
     786      goto failure;
     787    }
     788
     789    // convert to external table format
     790    if (!gfits_table_set_Missing (&ftable, catalog[0].missing, catalog[0].Nmissing)) {
     791      fprintf (stderr, "trouble converting format\n");
     792      goto failure;
     793    }
     794
     795    // write out Missing table (must write out entire table)
     796    if (!dvo_catalog_save_subcat (catalog[0].missing_catalog, &ftable, 0, catalog[0].Nmissing, catalog[0].Nmissing, catalog[0].Nmissing)) {
     797      fprintf (stderr, "trouble writing Missing Table\n");
     798      goto failure;
     799    }
     800    gfits_free_header (&header);
     801    gfits_free_table (&ftable);
     802  }
     803
     804  /*** Secfilt Table ***/
     805  if ((catalog[0].catflags & LOAD_SECF) && (catalog[0].secfilt != NULL)) {
     806
     807    first  = 0;                    // first row in memory to write
     808    start  = catalog[0].Nsecf_off; // first disk row to write
     809    Nitems = catalog[0].Nsecf_mem;
     810    Nrows  = Nitems - first;
     811
     812    assert (Nrows >= 0);
     813    assert (first >= 0);
     814    assert (first <= Nitems);
     815    assert (catalog[0].Nsecf_disk >= catalog[0].Nsecf_off);
     816    // XXX check these for consistency...
     817
     818    // convert to external table format
     819    SecFiltToFtable (&ftable, &secfilt[first], Nrows, catalog[0].catformat);
     820
     821    // write out SecFilt table
     822    if (!dvo_catalog_save_subcat (catalog[0].secfilt_catalog, &ftable, start, Nrows, catalog[0].Nsecf_disk, Nsecf_disk_new)) {
     823      fprintf (stderr, "failure writing SecFilt table\n");
     824      goto failure;
     825    }
     826    gfits_free_header (&header);
     827    gfits_free_table (&ftable);
     828  }
     829
     830  /* free temp storage */
     831  if (primary != NULL) {
     832    free (primary);
     833    free (secfilt);
     834  }
     835  return (TRUE);
     836
     837failure:
     838  /* free temp storage */
     839  gfits_free_header (&header);
     840  gfits_free_table (&ftable);
     841  if (primary != NULL) {
     842    free (primary);
     843    free (secfilt);
     844  }
     845  return (FALSE);
     846}
     847
    648848/* update_catalog_split only writes new lines to file. */
    649849int dvo_catalog_update_split (Catalog *catalog, char VERBOSE) {
Note: See TracChangeset for help on using the changeset viewer.