/** \brief Store data on the RTDB Store data on the specified RTDB. The data is stored with a key by which it can be reference for retrieval. \param handle [Input] the RTDB handle \param name [Input] the key for the data \param ma_type [Input] the type of the data specified by one of the MA data types (see mafdecls.fh) \param nelem [Input] the number of elements of the specified type \param array [Input] the actual data \return the status of the write operation */ int rtdb_put(const int handle, const char *name, const int ma_type, const int nelem, const void *array) { int status; #ifdef GAGROUPS int me = GA_Nodeid(); #endif if (!verify_parallel_access()) return 0; if (handle < 0 || handle >= MAX_RTDB) { (void) fprintf(stderr, "rtdb_put: handle out of range %d\n", handle); (void) fflush(stderr); return 0; } if (par_mode[handle] == INACTIVE) { (void) fprintf(stderr, "rtdb_put: handle not active %d\n",handle); (void) fflush(stderr); return 0; } if (par_mode[handle] == RTDB_SEQ_MODE && parallel_mode == RTDB_PAR_MODE) { (void) fprintf(stderr, "rtdb_put: seq. open and par. put\n"); (void) fflush(stderr); return 0; } if (parallel_mode == RTDB_SEQ_MODE || me == 0) status = rtdb_seq_put(handle, name, ma_type, nelem, array); if (parallel_mode == RTDB_PAR_MODE) rtdb_broadcast(TYPE_RTDB_STATUS, MT_INT, 1, (void *) &status); return status; }
static PyObject *wrap_rtdb_put(PyObject *self, PyObject *args) { int i, list, list_len; int ma_type = -1; char *name; Integer* int_array; double *dbl_array; char *char_array; char cbuf[8192], *ptr; void *array = 0; PyObject *obj; if ((PyTuple_Size(args) == 2) ) { PyArg_ParseTuple(args, "sO", &name,&obj); if (PyList_Check(obj)) list = 1; else list = 0; if (list) { list_len = PyList_Size(obj); if ( PyInt_Check(PyList_GetItem(obj, 0))) ma_type = MT_F_INT; else if ( PyFloat_Check(PyList_GetItem(obj, 0))) ma_type = MT_F_DBL; else if (PyString_Check(PyList_GetItem(obj, 0))) ma_type = MT_CHAR; else { printf("ERROR A\n"); ma_type = -1; } } else { list_len = 1; if ( PyInt_Check(obj)) ma_type = MT_F_INT; else if ( PyFloat_Check(obj)) ma_type = MT_F_DBL; else if (PyString_Check(obj)) ma_type = MT_CHAR; else { printf("ERROR B\n"); ma_type = -1; } } if (ma_type == -1) { PyErr_SetString(PyExc_TypeError, "Usage: rtdb_put - ma_type is confused"); return NULL; } if (ma_type != MT_CHAR) { if (!(array = malloc(MA_sizeof(ma_type, list_len, MT_CHAR)))) { PyErr_SetString(PyExc_MemoryError, "rtdb_put failed allocating work array"); return NULL; } } switch (ma_type) { case MT_INT: case MT_F_INT: case MT_BASE + 11: /* Logical */ int_array = array; for (i = 0; i < list_len; i++) { if (list) int_array[i] = PyInt_AS_LONG(PyList_GetItem(obj, i)); else int_array[i] = PyInt_AS_LONG(obj); } break; case MT_DBL: case MT_F_DBL: dbl_array = array; for (i = 0; i < list_len; i++) { if (list) PyArg_ParseTuple(PyList_GetItem(obj, i), "d", dbl_array+i); else PyArg_ParseTuple(obj, "d", dbl_array+i); } break; case MT_CHAR: ptr = cbuf; *ptr = 0; for (i = 0; i < list_len; i++) { if (list) PyArg_ParseTuple(PyList_GetItem(obj, i), "s", &char_array); else PyArg_ParseTuple(obj, "s", &char_array); /*printf("PROCESSED '%s'\n", char_array);*/ if ((ptr+strlen(char_array)) >= (cbuf+sizeof(cbuf))) { PyErr_SetString(PyExc_MemoryError,"rtdb_put too many strings"); return NULL; } strcpy(ptr,char_array); ptr = ptr+strlen(char_array); strcpy(ptr,"\n"); ptr = ptr + 1; } list_len = strlen(cbuf) + 1; array = cbuf; break; default: PyErr_SetString(NwchemError, "rtdb_put: ma_type is incorrect"); if (array) free(array); return NULL; break; } if (!(rtdb_seq_put(rtdb_handle, name, ma_type, list_len, array))) { PyErr_SetString(NwchemError, "rtdb_seq_put failed"); if ((ma_type != MT_CHAR) && array) free(array); return NULL; } } else { PyErr_SetString(PyExc_TypeError, "Usage: rtdb_put(value or values,[optional type])"); if ((ma_type != MT_CHAR) && array) free(array); return NULL; } Py_INCREF(Py_None); if ((ma_type != MT_CHAR) && array) free(array); return Py_None; Py_RETURN_NONE; }
int main(int argc, char *argv[]) { int rtdb = -1, ma_type, nelem; char filename[256], mode[256], name[1024], date[26]; void *data; char carray[MAX_NELEM+1]; int iarray[MAX_NELEM]; double darray[MAX_NELEM]; #define N_OPTS 9 const char *opts[N_OPTS] = {"quit", "open", "close", "info", "put", "get", "first", "next", "print"}; if (!MA_init(MT_DBL, -1, -1)) exit(1); while (1) { int opt; printf("\n\n\n Interactive RTDB\n ----------------\n\n"); for (opt=0; opt<N_OPTS; opt++) printf(" %-8s %3d\n", opts[opt], opt); printf("\nEnter option number -> "); fflush(stdout); if (scanf("%d", &opt) != 1) break; switch (opt) { case 0: exit(0); break; case 1: printf("\nOpen database\n-----------\n\n"); printf("Enter filename -> "); fflush(stdout); if (scanf("%s",filename) != 1) exit(1); printf("Enter mode (new, old, unknown, empty, scratch) -> "); fflush(stdout); if (scanf("%s",mode) != 1) exit(1); if (!rtdb_seq_open(filename, mode, &rtdb)) printf("\nOpen of %s with mode %s failed\n", filename, mode); break; case 2: printf("\nClose database\n-------------\n\n"); fflush(stdout); if (rtdb < 0) printf("database is not open\n"); else { printf("Enter mode (keep, delete) -> "); fflush(stdout); if (scanf("%s",mode) != 1) exit(1); if (!rtdb_seq_close(rtdb, mode)) printf("Close of %s with mode %s failed\n", filename, mode); else rtdb = -1; } break; case 3: printf("\nInformation on entry\n--------------------\n\n"); if (rtdb < 0) printf("database is not open\n"); else { printf("Enter name -> "); fflush(stdout); if (!read_string(name, sizeof name)) exit(1); if (!rtdb_seq_get_info(rtdb, name, &ma_type, &nelem, date)) printf("Get info on \"%s\" failed\n", name); else printf("%s -> type=%s, nelem=%d, date=%s\n", name, ma_typename(ma_type), nelem, date); } break; case 4: printf("\nPut entry\n---------\n\n"); if (rtdb < 0) printf("database is not open\n"); else { printf("Enter name -> "); fflush(stdout); if (!read_string(name, sizeof name)) exit(1); printf("Enter type (int, char, double) -> "); fflush(stdout); if (scanf("%s", mode) != 1) exit(1); if (!strcmp(mode,"int")) { int i; if ((nelem = ReadNelem()) <= 0) break; ma_type = MT_INT; for (i=0; i<nelem; i++) if (scanf("%d", iarray+i) != 1) exit(1); data = (void *) iarray; } else if (!strcmp(mode, "char")) { int i; ma_type = MT_CHAR; if (!read_string(carray, MAX_NELEM)) break; nelem = strlen(carray) + 1; data = (void *) carray; } else if (!strcmp(mode, "double")) { int i; if ((nelem = ReadNelem()) <= 0) break; ma_type = MT_DBL; for (i=0; i<nelem; i++) if (scanf("%lf", darray+i) != 1) exit(1); data = (void *) darray; } else { printf("invalid type\n"); break; } if(!rtdb_seq_put(rtdb, name, ma_type, nelem, data)) printf("put %s, nelem=%d, type=%s failed", name, nelem, ma_typename(ma_type)); fflush(stdout); } break; case 5: printf("\nGet entry\n---------\n\n"); if (rtdb < 0) printf("database is not open\n"); else { int ma_handle; if(rtdb_seq_ma_get(rtdb, name, &ma_type, &nelem, &ma_handle)) { ma_print(stdout, ma_type, nelem, MA_get_pointer(ma_handle, &data)); MA_free_heap(ma_handle); } else printf("Get of %s failed\n", name); } break; case 8: printf("\nPrint database\n--------------\n\n"); if (rtdb < 0) printf("database is not open\n"); else { int values; printf("Print values (0=no, 1=yes) -> "); fflush(stdout); if (scanf("%d", &values) != 1) exit(1); rtdb_seq_print(rtdb, values); } break; default: break; } } return 0; }