(file) Return to pfss_backup.c CVS log (file) (dir) Up to [Development] / JSOC / proj / util / apps

File: [Development] / JSOC / proj / util / apps / pfss_backup.c (download)
Revision: 1.4, Mon Nov 3 18:01:24 2014 UTC (8 years, 10 months ago) by jps
Branch: MAIN
CVS Tags: Ver_LATEST, Ver_9-5, Ver_9-41, Ver_9-4, Ver_9-3, Ver_9-2, Ver_9-1, Ver_9-0, Ver_8-8, Ver_8-7, Ver_8-12, Ver_8-11, Ver_8-10, HEAD
Changes since 1.3: +22 -9 lines
Add base file name arguments to generalize

#include "jsoc_main.h"
#include "drms.h"
#include "drms_names.h"

#define NOTSPECIFIED "***NOTSPECIFIED***"
#define DIE(msg) {fprintf(stderr,"$$$$ %s: %s\n", module_name, msg); return 1;}

ModuleArgs_t module_args[] = {
  {ARG_STRING, "ds", "lm_jps.pfss", "output data series"},
  {ARG_STRING, "ser_beg", NOTSPECIFIED, "serial number to begin"},
  {ARG_STRING, "ser_end", NOTSPECIFIED, "serial number to end (not saved)"},
  {ARG_STRING, "date_beg", NOTSPECIFIED, "date to begin"},
  {ARG_STRING, "date_end", NOTSPECIFIED, "date to end (not saved)"},
  {ARG_STRING, "spath", "/archive/pfss/kitrun48/surffield-serial", ""},
  {ARG_STRING, "bpath", "/archive/pfss/kitrun48/Bfield-serial", ""},
  {ARG_STRING, "sbase", "%s/kitrun048_%5.5d.sav", "surface base file name"},
  {ARG_STRING, "bbase", "%s/Bfield_%5.5d.sav", "B field base file name"},
  {ARG_FLAG, "h", "0", "Print usage message and quit"},
  {ARG_FLAG, "v", "0", "verbose flag"},
  {ARG_END}
};

char *module_name = "pfss_backup";
int verbose = 0;

void sprint_time_ISO (char *tstring, TIME t) 	 
{ 	 
  sprint_at(tstring,t); 	 
  tstring[4] = tstring[7] = '-'; 	 
  tstring[10] = 'T'; 	 
  tstring[19] = '\0'; 	 
}

int nice_intro(int help)
{
  int usage = cmdparams_get_int(&cmdparams, "h", NULL) != 0;
  verbose = cmdparams_get_int(&cmdparams, "v", NULL) != 0;
  if (usage || help) {
    printf("pfss_backup -h -v ds=output_series ser_beg=sn1 ser_end=sn_stop\n"
        "  -h: print this message\n"
        "  -v: verbose\n"
        "ds=<output series name> default is lm_jps.pfss\n"
        "ser_beg=<first serial number to backup>\n"
        "ser_end=<serial number to stop> (not backup)\n"
        "date_beg=<first date to backup>\n"
        "date_end=<date to stop> (not backup)\n"
        "spath=<base path to surface field files>\n"
        "bpath=<base path to B field files>\n"
        "sbase=<surface field base file name>\n"
        "bbase=<B field field base file name>\n");
    return(1);
  }
  return(0);
}

int DoIt ()
{
  char *date_beg, *date_end, *ds, *spath, *bpath, *sbase, *bbase;
  char sname[512], bname[512], now_str[64];
  int ser_beg, ser_end, ser_num, status=0;
  int s_ok, b_ok, sp_ok, bp_ok; /* yr, mo, da, hr, mn; */
  time_t trec, tnow;
  DRMS_Record_t *outrec;
  DRMS_Segment_t *outseg;
  struct tm tm_rec;
  struct stat sbuf;

  if (nice_intro(0)) return(0);
  ser_beg = cmdparams_get_int(&cmdparams, "ser_beg", NULL);
  ser_end = cmdparams_get_int(&cmdparams, "ser_end", NULL);
  ds = strdup(cmdparams_get_str(&cmdparams, "ds", NULL));
  spath = strdup(cmdparams_get_str(&cmdparams, "spath", NULL));
  bpath = strdup(cmdparams_get_str(&cmdparams, "bpath", NULL));
  sbase = strdup(cmdparams_get_str(&cmdparams, "sbase", NULL));
  bbase = strdup(cmdparams_get_str(&cmdparams, "bbase", NULL));
if (verbose) fprintf(stdout, "'%s'\n'%s'\n", spath, bpath);
if (verbose) fprintf(stdout, "'%s'\n'%s'\n", sbase, bbase);
  if (ser_beg < 0) {
    time_t tr_b, tr_e;
    date_beg = strdup(cmdparams_get_str(&cmdparams, "date_beg", NULL));
    tr_b = sscan_time(date_beg) - UNIX_EPOCH + 218;
    ser_beg = (tr_b - 836179440)/21600;
    date_end = strdup(cmdparams_get_str(&cmdparams, "date_end", NULL));
    tr_e = sscan_time(date_end) - UNIX_EPOCH + 218;
    ser_end = (tr_e - 836179440)/21600;
    if (verbose) {
      fprintf(stderr, "trec: %ld %ld,ser_beg, end: %d, %d\n",tr_b,tr_e,ser_beg,ser_end);
    }
  }
  if (stat(spath, &sbuf)) {
    sp_ok = 0;
    fprintf(stderr, "Can not stat %s\n", spath);
//    return(1);
  } else sp_ok = 1;
  if (stat(bpath, &sbuf)) {
    bp_ok = 0;
    fprintf(stderr, "Can not stat %s\n", bpath);
//    return(1);
  } else bp_ok = 1;

//sleep(60);
  for (ser_num = ser_beg; ser_num < ser_end; ser_num++) {
    trec = 21600*ser_num + 836179440 - 8;
    if (verbose) {
      fprintf(stderr, "trec: %ld,ser_beg, end: %d, %d\n", trec, ser_beg, ser_end);
    }
    gmtime_r(&trec, &tm_rec);
    snprintf(sname, 512, sbase, spath, ser_num);
    snprintf(bname, 512, bbase, bpath, ser_num);
    outrec = drms_create_record(drms_env, ds, DRMS_PERMANENT, &status);
    if (status) DIE("Can't create output record");
//  drms_setkey_time(outrec, "model_date", (double) (trec + UNIX_EPOCH));
    sprint_time_ISO(now_str, trec + UNIX_EPOCH);
    drms_setkey_string(outrec, "model_date", now_str);
    if (verbose) fprintf(stderr, "model_date: %s\n", now_str);
    drms_setkey_int(outrec, "serial", ser_num);
    if (stat(sname, &sbuf)) {
      s_ok = 0;
      if (s_ok) fprintf(stderr, "Can not stat %s\n", sname);
    } else {
      s_ok = 1;
//    drms_setkey_time(outrec,"s_calc_date",(double)(sbuf.st_mtime+UNIX_EPOCH));
      sprint_time_ISO(now_str, sbuf.st_mtime + UNIX_EPOCH);
      drms_setkey_string(outrec, "s_calc_date", now_str);
    }
    if (stat(bname, &sbuf)) {
      b_ok = 0;
      if (b_ok) fprintf(stderr, "Can not stat %s\n", bname);
    } else {
      b_ok = 1;
//    drms_setkey_time(outrec,"b_calc_date",(double)(sbuf.st_mtime+UNIX_EPOCH));
      sprint_time_ISO(now_str, sbuf.st_mtime + UNIX_EPOCH);
      drms_setkey_string(outrec, "b_calc_date", now_str);
    }
    tnow = CURRENT_SYSTEM_TIME;
    drms_setkey_time(outrec, "backup_date", tnow);
    sprint_time_ISO(now_str, tnow);
    if (s_ok) {
      outseg = drms_segment_lookup(outrec, "surffield");
      if(drms_segment_write_from_file(outseg, sname)) {
        fprintf(stderr, "Can not write surface field segment for %s.\n", sname);
      }
    }
    if (b_ok) {
      outseg = drms_segment_lookup(outrec, "Bfield");
      if(drms_segment_write_from_file(outseg, bname)) {
        fprintf(stderr, "Can not write B field segment for %s.\n", bname);
      }
    }
    if (s_ok || b_ok) status = drms_close_record(outrec, DRMS_INSERT_RECORD);
    else status = drms_close_record(outrec, DRMS_FREE_RECORD);
    if(status) fprintf(stderr, "Error closing rec for ser #: %d.\n", ser_num);
  }
  return status;
}

Karen Tian
Powered by
ViewCVS 0.9.4