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

File: [Development] / JSOC / proj / dsdsmigr / apps / store_dsds_migrate.c (download)
Revision: 1.6, Tue May 22 18:12:04 2012 UTC (11 years ago) by production
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-6, Ver_8-5, Ver_8-4, Ver_8-3, Ver_8-2, Ver_8-12, Ver_8-11, Ver_8-10, Ver_8-1, Ver_8-0, Ver_7-1, Ver_7-0, Ver_6-4, HEAD
Changes since 1.5: +28 -5 lines
*** empty log message ***

/* store_dsds_migrate - stores a ds from DSDS into  DRMS/SUMS. */

/* Usage:
 *  store_dsds_migrate pname=<name> lname=<name> lnum=<number> sname=<name> 
 *              snum=<number> dsdsseries=<name> dirname=<dir> {note=<comment>}
 *         
 *     Store a dir into SUMS for a DSDS dataset of the given name.
 *     "dir" is the directory that will be copied in SUMS.
 *
 * The DRMS series is in name space 'dsds'. So, for example, the dsds ds
 * prog:mdi,level:lev1.5[4],series:fd_V_01h[60000] will be ingested into:
 *
 * dsds.mdi__lev1_5__fd_V_01h
 *NOTE: "-" in the dsds name are changed to '_' in the drms name before the
 *	call to this program.
 *
 * where PrimeKeys in the .jsd is the series#, and the level# is a DBIndex.
 * Note the double '__' to separate the fields.
 *
 * Example:
 *   store_dsds_migrate pname=mdi lname=lev1.5 lnum=4 sname=fd_V_01h snum=60000
 *		dsdsseries=prog:mdi,level:lev1.5,series:fd_V_01h
 *		dirname=/PDS83/D9666638
 *
 */
#include "jsoc_main.h"
#include "drms.h"
#include "drms_names.h"
#include <unistd.h>
#include <strings.h>


#define NOTSPECIFIED "***NOTSPECIFIED***"
/* List of default parameter values. */
ModuleArgs_t module_args[] = { 
  {ARG_STRING, "pname", "", "prog: name to store the dir into"},
  {ARG_STRING, "lname", "", "level: name to store the dir into"},
  {ARG_INT, "lnum", "0", ""}, /* level: number (i.e. a version #) */
  {ARG_STRING, "sname", "", "series: name to store the dir into"},
  {ARG_INT, "snum", "-1", ""}, /* series: number */
  {ARG_STRING, "dsdsseries", "", "orig name of dsds series prog: etc."},
  {ARG_STRING, "dirname", "", "Dir to store into SUMS"},
  {ARG_STRING, "note", "N/A", "comment field"},
  {ARG_STRING, "namespace", "dsds", "namespace of output ds"},
  {ARG_FLAG, "v", "0", "verbose flag"},
  {ARG_FLAG, "j", "0", "only print the jsd"},
  {ARG_END}
};

char *outputseries = "su_production.dsds_migrate";

/* Module name presented to DRMS. */
char *module_name = "store_dsds_migrate";

/* Some global variables for this module. */
int verbose = 0;
int jsdflg = 0;
char *pname, *lname, *sname, *namespace;
char *dsdsseries;

static char * make_series_jsd(char *series);

/* Check DRMS session status and calling arguments and set verbose variable */
int nice_intro () {
  verbose = cmdparams_get_int (&cmdparams, "v", NULL);
  if (verbose) cmdparams_printall (&cmdparams);
  return(0);
}

/* Module main function. */
int DoIt (void) {
int status = 0;
int lnum, snum;

char *in, *note, *dirname, *cptr;
char path[DRMS_MAXPATHLEN];
char drmsseries[256];
char cmd[DRMS_MAXPATHLEN+1024];
DRMS_Record_t *rec, *template;

if (nice_intro())
  return(0);

jsdflg = cmdparams_get_int (&cmdparams, "j", NULL);
pname = cmdparams_get_str(&cmdparams, "pname", NULL);
lname = cmdparams_get_str(&cmdparams, "lname", NULL);
sname = cmdparams_get_str(&cmdparams, "sname", NULL);
note = cmdparams_get_str(&cmdparams, "note", NULL);
lnum = cmdparams_get_int (&cmdparams, "lnum", NULL);
snum = cmdparams_get_int (&cmdparams, "snum", NULL);
dsdsseries = cmdparams_get_str(&cmdparams, "dsdsseries", NULL);
namespace = cmdparams_get_str(&cmdparams, "namespace", NULL);
if(!dsdsseries) {
  printf("Must give a dsdsseries= %s\n");
  return(1);
}
in = cmdparams_get_str(&cmdparams, "dirname", NULL);
/* First, check to see that the dir exists */
if (access(in, R_OK) != 0)
  {
  printf("The requested dir can not be accessed.  %s\n", in);
  return(1);
  }
  dirname = in;

/* Check to see if series exists, and if we should make it */
cptr = (char *)index(lname, '.'); //no dsds lname has more then one '.'
if(cptr) { 
  *cptr = '_';		//replace '.' with '_'
}
sprintf(drmsseries, "%s.%s__%s__%s", namespace, pname, lname, sname);
if(jsdflg) {
  printf("%s", make_series_jsd(drmsseries));
  return(1);
}
template = drms_template_record(drms_env, drmsseries, &status);
if (template==NULL && status == DRMS_ERROR_UNKNOWNSERIES)
  {
    int create_series(char *series);
    printf("Going to make series: %s\n", drmsseries);
    if (create_series(drmsseries))
      {
      printf("Series '%s' does not exist. Create_series failed. Give up.\n", drmsseries);
      return(1);
      }
  }
else
  if(status)
    {
    fprintf(stderr, "DRMS problem looking up drmsseries.\n");
    return(status);
    }

/* Now ready to make a new record and set keywords */
rec = drms_create_record(drms_env, drmsseries, DRMS_PERMANENT, &status);
if (!rec || status)
    {
    printf("drms_create_record failed, series=%s, status=%d.  Aborting.\n", drmsseries,status);
    return(status);
    }
if ((status = drms_setkey_string(rec, "dirname", dirname)))
   {
     printf("ERROR: drms_setkey_string failed for 'dirname'\n");
     return(1);
   }
if ((status = drms_setkey_int(rec, "lnum", lnum)))
   {
     printf("ERROR: drms_setkey_int failed for 'lnum'\n");
     return(1);
   }
if ((status = drms_setkey_int(rec, "snum", snum)))
   {
     printf("ERROR: drms_setkey_int failed for 'snum'\n");
     return(1);
   }
if ((status = drms_setkey_string(rec, "note", note))) 
   {
     printf("WARNING: drms_setkey_string failed for 'note'\n");
     printf("Your note was not saved: %s\n",note);
   }
/* a SU should have been allocated since there is a segment in the series defn */
drms_record_directory(rec, path, 1);
if (! *path)
  {
  fprintf(stderr,"no path found\n");
  return(1);
  }
sprintf(cmd, "cd %s; cp -rp . %s", in, path);
status = system(cmd);
if (status)
    {
    printf("Copy failed: %s\n", cmd);
    return(status);
    }
else
    printf("Command success: %s\n", cmd);
if ((status = drms_close_record(rec, DRMS_INSERT_RECORD)))
  printf("drms_close_record failed!\n");

return(status);
}

char * make_series_jsd(char *series)
{
  char *user = getenv("USER");
  char jsd[2048];
  if(!strcmp(namespace, "dsds_bak")) {
  sprintf(jsd,
    "Seriesname:     %s\n"
    "Author:         %s\n"
    "Owners:         %s\n"
    "Unitsize:       1\n"
    "Archive:        1\n"
    "Retention:      1\n"
    "Tapegroup:      200\n"
    "PrimeKeys:      snum\n"
    "DBIndex:        snum,lnum\n"
    "Description:    \"%s\"\n"
    "Keyword: dirname,  string, variable, record, \" \",  %%s, none, \"Original dirname\"\n"
    "Keyword: note,      string, variable, record, \" \",  %%s, none, \" \"\n"
    "Keyword: lnum,      int, variable, record, \"0\",  %%d, none, \"level: number\"\n"
    "Keyword: snum,      int, variable, record, \"-1\",  %%d, none, \"series: number\"\n"
    "Data: dir, constant, int, 0, none, generic, \" \"\n",
    series, user, user, dsdsseries);
  }
  else {
  sprintf(jsd,
    "Seriesname:     %s\n"
    "Author:         %s\n"
    "Owners:         %s\n"
    "Unitsize:       1\n"
    "Archive:        1\n"
    "Retention:      270\n"
    "Tapegroup:      9\n"
    "PrimeKeys:      snum\n"
    "DBIndex:        snum,lnum\n"
    "Description:    \"%s\"\n"
    "Keyword: dirname,  string, variable, record, \" \",  %%s, none, \"Original dirname\"\n"
    "Keyword: note,      string, variable, record, \" \",  %%s, none, \" \"\n"
    "Keyword: lnum,      int, variable, record, \"0\",  %%d, none, \"level: number\"\n"
    "Keyword: snum,      int, variable, record, \"-1\",  %%d, none, \"series: number\"\n"
    "Data: dir, constant, int, 0, none, generic, \" \"\n",
    series, user, user, dsdsseries);
  }
  return (strdup(jsd));
}


int create_series(char *series)
  {
  char *jsd;
  int perm = cmdparams_get_int(&cmdparams, "perm", NULL);
  DRMS_Record_t *template;
  jsd = make_series_jsd(series);
  template = drms_parse_description(drms_env, jsd);
  if (template==NULL)
    {
    fprintf(stderr, "Failed to parse series description.  JSD was:\n%s\n",jsd);
    return(1);
    }
  if (drms_create_series(template, perm))
    {
    fprintf(stderr, "Failed to create series. JSD was:\n%s\n", jsd);
    return(1);
    }
  if (verbose)
    printf("Create_series successful, JSD was:\n%s\n", jsd);
  drms_free_record_struct(template);
  free(template);
  free(jsd);
  return(0);
  }
  

Karen Tian
Powered by
ViewCVS 0.9.4