42 static int _dsdb_change_dsdod_att_value(
60 parent = (var_name) ? (
void *)
cds_get_var(cds, var_name) : (void *)cds;
75 if (type != att->
type) {
96 value = (
void *)att_value;
97 length = strlen(att_value) + 1;
104 length = (size_t)nelems;
107 else if (nelems == 0) {
119 if (free_value) free(value);
125 if (free_value) free(value);
149 static time_t *_dsdb_insert_time_array_value(
163 else if (new_time > (*times)[*ntimes - 1]) {
164 insert_index = *ntimes;
167 for (i = 0; new_time > (*times)[i]; i++);
169 if (new_time == (*times)[i]) {
177 new_times = (time_t *)realloc(*times, (*ntimes+1) *
sizeof(time_t));
179 return((time_t *)NULL);
184 for (i = (*ntimes); i > insert_index; i--) {
185 (*times)[i] = (*times)[i-1];
189 (*times)[i] = new_time;
215 if (dsdod->
site) free((
void *)dsdod->
site);
217 if (dsdod->
name) free((
void *)dsdod->
name);
284 const char *facility,
285 const char *dsc_name,
286 const char *dsc_level,
294 data_time = time(NULL);
304 (*dsdod)->data_time = data_time;
309 if (nversions <= 0) {
311 *dsdod = (
DSDOD *)NULL;
320 *dsdod = (
DSDOD *)NULL;
351 const char *dod_version;
364 dsdod_version = msngr_copy_string(dod_version);
366 if (!dsdod_version) {
369 "Could not update DSDOD for: %s%s%s.%s\n"
370 " -> memory allocation error\n",
379 dsdb, dsdod->
name, dsdod->
level, dsdod_version, &cds_group);
395 dsdod->
version = dsdod_version;
407 if (natt_times < 0) {
413 if (natt_times > 0) {
457 const char *dod_version;
461 return((
const char *)NULL);
465 if (data_time < dsdod->dod_times[i]) {
478 if (strcmp(dod_version, dsdod->
version) != 0) {
482 return((
const char *)NULL);
527 if (t1 < tn && tn <= t2) {
532 if (n < dsdod->natt_times) {
562 const char *facility,
563 const char *dsc_name,
564 const char *dsc_level)
572 goto RETURN_MEM_ERROR;
577 dsdod->
site = msngr_copy_string(site);
579 goto RETURN_MEM_ERROR;
582 dsdod->
facility = msngr_copy_string(facility);
584 goto RETURN_MEM_ERROR;
587 dsdod->
name = msngr_copy_string(dsc_name);
589 goto RETURN_MEM_ERROR;
592 dsdod->
level = msngr_copy_string(dsc_level);
594 goto RETURN_MEM_ERROR;
602 "Could not create new DSDOD structure for: %s%s%s.%s\n"
603 " -> memory allocation error\n",
604 site, dsc_name, facility, dsc_level);
610 return((
DSDOD *)NULL);
647 const char *dsc_name,
648 const char *dsc_level,
649 const char *dod_version,
667 const char *var_dims[8];
680 sprintf(cds_name,
"%s.%s-%s", dsc_name, dsc_level, dod_version);
691 status = dodog_get_dod_dims(dsdb->
dbconn,
692 dsc_name, dsc_level, dod_version, &dims);
705 for (dims_row = 0; dims_row < dims->
nrows; dims_row++) {
707 dim_name = DodDimName(dims,dims_row);
708 strval = DodDimLength(dims,dims_row);
712 if (strval == NULL) {
716 length = (size_t)atoi(strval);
740 status = dodog_get_dod_atts(dsdb->
dbconn,
741 dsc_name, dsc_level, dod_version, &atts);
754 for (atts_row = 0; atts_row < atts->
nrows; atts_row++) {
756 att_name = DodAttName(atts,atts_row);
757 strval = DodAttType(atts,atts_row);
759 strval = DodAttValue(atts,atts_row);
763 if (strval == (
char *)NULL) {
765 value = (
void *)NULL;
768 value = (
void *)strval;
769 length = strlen(strval) + 1;
775 if (nelems == (
size_t)-1) {
778 "Could not convert string to array: '%s'\n"
779 " -> memory allocation error\n", strval);
795 if (free_value) free(value);
803 if (free_value) free(value);
811 status = dodog_get_dod_vars(dsdb->
dbconn,
812 dsc_name, dsc_level, dod_version, &vars);
827 status = dodog_get_dod_var_dims(dsdb->
dbconn,
828 dsc_name, dsc_level, dod_version,
"%", &dims);
843 status = dodog_get_dod_var_atts(dsdb->
dbconn,
844 dsc_name, dsc_level, dod_version,
"%", &atts);
848 if (dims) dims->
free(dims);
860 for (vars_row = 0; vars_row < vars->
nrows; vars_row++) {
862 var_name = DodVarName(vars,vars_row);
863 strval = DodVarType(vars,vars_row);
870 for (; dims_row < dims->
nrows; dims_row++) {
872 strval = DodVarDimVarName(dims,dims_row);
874 if ((strcmp(var_name, strval) != 0)) {
878 var_dims[nvar_dims++] = DodVarDimName(dims,dims_row);
884 *cds_group, var_name, type, nvar_dims, var_dims);
887 if (dims) dims->
free(dims);
888 if (atts) atts->
free(atts);
897 for (; atts_row < atts->
nrows; atts_row++) {
899 strval = DodVarAttVarName(atts,atts_row);
901 if ((strcmp(var_name, strval) != 0)) {
905 att_name = DodVarAttName(atts,atts_row);
906 strval = DodVarAttType(atts,atts_row);
908 strval = DodVarAttValue(atts,atts_row);
912 if (strval == (
char *)NULL) {
914 value = (
void *)NULL;
917 value = (
void *)strval;
918 length = strlen(strval) + 1;
924 if (nelems == (
size_t)-1) {
927 "Could not convert string to array: '%s'\n"
928 " -> memory allocation error\n", strval);
930 if (dims) dims->
free(dims);
931 if (atts) atts->
free(atts);
938 length = (size_t)nelems;
946 if (dims) dims->
free(dims);
947 if (atts) atts->
free(atts);
948 if (free_value) free(value);
955 if ((strcmp(var_name,
"time") == 0) ||
956 (strcmp(var_name,
"base_time") == 0) ||
957 (strcmp(var_name,
"time_offset") == 0)) {
959 if ((strcmp(att_name,
"long_name") == 0) ||
960 (strcmp(att_name,
"units") == 0) ||
961 (strcmp(att_name,
"string") == 0)) {
968 if (free_value) free(value);
974 if (dims) dims->
free(dims);
975 if (atts) atts->
free(atts);
1025 char **dod_versions = (
char **)NULL;
1026 time_t *dod_times = (time_t *)NULL;
1030 status = dodog_get_ds_dod_versions(dsdb->
dbconn,
1035 dod_times = (time_t *)calloc((dbres->
nrows + 1),
sizeof(time_t));
1037 goto RETURN_MEM_ERROR;
1040 dod_versions = (
char **)calloc((dbres->
nrows + 1),
sizeof(
char *));
1041 if (!dod_versions) {
1042 goto RETURN_MEM_ERROR;
1045 for (row = 0; row < dbres->
nrows; row++) {
1047 dod_version = DsDodVersion(dbres,row);
1048 time_string = DsDodTime(dbres,row);
1052 dod_times[row] = dod_time;
1053 dod_versions[row] = msngr_copy_string(dod_version);
1055 if (!dod_versions[row]) {
1056 goto RETURN_MEM_ERROR;
1067 for (row = 0; row < dsdod->
ndod_times; row++) {
1089 for (row = 0; row < ndod_times; row++) {
1090 free(dod_versions[row]);
1094 if (dbres) dbres->
free(dbres);
1095 if (dod_times) free(dod_times);
1099 "Could not get DSDOD versions for: %s%s%s.%s\n"
1100 " -> memory allocation error\n",
1143 time_t *att_times = (time_t *)NULL;
1147 status = dodog_get_ds_att_times(dsdb->
dbconn,
1156 for (row = 0; row < dbres->
nrows; row++) {
1158 att_name = DsAttTimeName(dbres,row);
1169 time_string = DsAttTimeTime(dbres,row);
1173 if (!_dsdb_insert_time_array_value(
1174 &att_times, &natt_times, secs1970)) {
1177 "Could not get DSDOD attribute change times for: %s%s%s.%s\n"
1178 " -> memory allocation error\n",
1181 if (att_times) free(att_times);
1193 status = dodog_get_ds_var_att_times(dsdb->
dbconn,
1203 for (row = 0; row < dbres->
nrows; row++) {
1205 var_name = DsVarAttTimeVar(dbres,row);
1206 att_name = DsVarAttTimeName(dbres,row);
1222 time_string = DsVarAttTimeTime(dbres,row);
1226 if (!_dsdb_insert_time_array_value(
1227 &att_times, &natt_times, secs1970)) {
1230 "Could not get DSDOD attribute change times for: %s%s%s.%s\n"
1231 " -> memory allocation error\n",
1234 if (att_times) free(att_times);
1298 status = dodog_get_ds_atts(dsdb->
dbconn,
1308 for (row = 0; row < dbres->
nrows; row++) {
1310 att_name = DsAttName(dbres,row);
1311 att_type = DsAttType(dbres,row);
1312 att_value = DsAttValue(dbres,row);
1314 if (!_dsdb_change_dsdod_att_value(dsdod->
cds_group,
1315 NULL, att_name, att_type, att_value, 2)) {
1318 "Could not get DSDOD attribute values for: %s%s%s.%s\n"
1319 " -> memory allocation error\n",
1334 status = dodog_get_ds_var_atts(dsdb->
dbconn,
1344 for (row = 0; row < dbres->
nrows; row++) {
1346 var_name = DsVarAttVar(dbres,row);
1347 att_name = DsVarAttName(dbres,row);
1348 att_type = DsVarAttType(dbres,row);
1349 att_value = DsVarAttValue(dbres,row);
1351 if (!_dsdb_change_dsdod_att_value(dsdod->
cds_group,
1352 var_name, att_name, att_type, att_value, 2)) {
1355 "Could not get DSDOD attribute values for: %s%s%s.%s\n"
1356 " -> memory allocation error\n",
1414 status = dodog_get_ds_time_atts(dsdb->
dbconn,
1425 for (row = 0; row < dbres->
nrows; row++) {
1427 att_name = DsTimeAttName(dbres,row);
1428 att_type = DsTimeAttType(dbres,row);
1429 att_value = DsTimeAttValue(dbres,row);
1431 if (!_dsdb_change_dsdod_att_value(dsdod->
cds_group,
1432 NULL, att_name, att_type, att_value, 3)) {
1435 "Could not get DSDOD attribute values for: %s%s%s.%s\n"
1436 " -> memory allocation error\n",
1451 status = dodog_get_ds_var_time_atts(dsdb->
dbconn,
1462 for (row = 0; row < dbres->
nrows; row++) {
1464 var_name = DsVarTimeAttVar(dbres,row);
1465 att_name = DsVarTimeAttName(dbres,row);
1466 att_type = DsVarTimeAttType(dbres,row);
1467 att_value = DsVarTimeAttValue(dbres,row);
1469 if (!_dsdb_change_dsdod_att_value(dsdod->
cds_group,
1470 var_name, att_name, att_type, att_value, 3)) {
1473 "Could not get DSDOD attribute values for: %s%s%s.%s\n"
1474 " -> memory allocation error\n",
1516 const char *dsc_name,
1517 const char *dsc_level,
1522 status = dodog_get_highest_dod_version(
1523 dsdb->
dbconn, dsc_name, dsc_level, dod_version);