SEXP kx_r_execute_with_params(SEXP connection, SEXP query, SEXP param) { K result; SEXP s; kx_connection = INTEGER_VALUE(connection); int i, n = length(param); K vector = ktn(KF,n); for (i = 0; i < n; i++) { kF(vector)[i] = REAL(param)[i]; } result = k(kx_connection, (char*) CHARACTER_VALUE(query), vector, (K)0); if (0 == result) { error("Error: not connected to kdb+ server\n"); } else if (-128 == result->t) { char *e = calloc(strlen(result->s) + 1, 1); strcpy(e, result->s); r0(result); error("Error from kdb+: `%s\n", e); } s = from_any_kobject(result); r0(result); return s; }
static PyObject* from_list_of_kobjects(K x) { PyObject* result; Py_ssize_t i, length ; length = (Py_ssize_t)(x->n); result = PyList_New(length); for(i = 0; i != length; ++i) PyList_SetItem(result, i, from_any_kobject(xK[i])); return result; }
static PyObject* from_table_kobject(K x){ /* the strategy is to create a list of tuples these are then passed to OrderedDict to retain the order of the columns for example OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]). OrderedDict does not have a c-api so use a callback constructor */ PyObject* result ; Py_ssize_t i, length; PyObject *keys ; PyObject *vals ; PyObject *collectionsName, *collectionsMod, *OrderedDict, *pDict, *list, *tple, *args; keys = from_any_kobject( kK(x->k)[0] ); vals = from_columns_kobject( kK(x->k)[1] ); collectionsName = PyUnicode_FromString((char*)"collections"); collectionsMod = PyImport_Import(collectionsName); Py_DECREF(collectionsName); if(collectionsMod != NULL) { /* printf("creating ordered table\n"); */ length = PyList_Size(keys); list = PyList_New(length); for(i = 0; i != length; ++i) { /* tple create new ref, pylist_setitem steals it */ tple = PyTuple_Pack(2, PyList_GetItem(keys, i), PyList_GetItem(vals, i)); PyList_SetItem(list, i, tple); } pDict = PyModule_GetDict(collectionsMod); // borrowed ref OrderedDict = PyDict_GetItemString(pDict, (char*)"OrderedDict"); // borrowed ref args = PyTuple_Pack(1, list); // new ref result = PyObject_CallObject(OrderedDict, args); // new ref Py_DECREF(args); Py_DECREF(collectionsMod); Py_DECREF(list); } else { /* printf("creating unordered table\n"); */ result = PyDict_New(); if( PyList_CheckExact(keys)) { length = PyList_Size(keys); for(i = 0; i != length; ++i) { PyDict_SetItem(result, PyList_GetItem(keys, i), PyList_GetItem(vals, i)); } } } Py_DECREF(keys); Py_DECREF(vals); return result; }
static PyObject* from_dictionary_kobject(K x){ PyObject *result; PyObject* keys; PyObject* vals; K table; Py_ssize_t i, length ; if(98 == xx->t && 98 == xy->t) { r1(x); if(table = ktd(x)) { result = from_table_kobject(table); r0(table); return result; } } result = PyDict_New(); length = (Py_ssize_t)(xx->n); keys = from_any_kobject(xx); vals = from_any_kobject(xy); if( PyList_CheckExact(keys)) { for(i=0; i!= length; ++i) { PyDict_SetItem(result, PyList_GetItem(keys, i), PyList_GetItem(vals, i)) ; } } else { PyDict_SetItem(result, keys, vals); } Py_DECREF(keys); Py_DECREF(vals); return result; }
/* * Execute a kdb+ query over the given connection. */ SEXP kx_r_execute(SEXP connection, SEXP query) { K result; SEXP s; kx_connection = INTEGER_VALUE(connection); result = k(kx_connection, (char*) CHARACTER_VALUE(query), (K)0); if (0 == result) { error("Error: not connected to kdb+ server\n"); } else if (-128 == result->t) { char *e = calloc(strlen(result->s) + 1, 1); strcpy(e, result->s); r0(result); error("Error from kdb+: `%s\n", e); } s = from_any_kobject(result); r0(result); return s; }
static PyObject* from_columns_kobject(K x) { PyObject *col, *result; Py_ssize_t i, length ; int type; K c; length = (Py_ssize_t)(x->n); result = PyList_New(length); for(i = 0; i != length; ++i) { c = xK[i]; type = abs(c->t); if( type == 10) { col = from_string_column_kobject(c); } else { col = from_any_kobject(c); } PyList_SetItem(result, i, col); } return result; }
static PyObject* from_table_kobject(K x){ PyObject* result ; Py_ssize_t i, length; PyObject *keys ; PyObject *vals ; keys = from_any_kobject( kK(x->k)[0] ); vals = from_columns_kobject( kK(x->k)[1] ); result = PyDict_New(); if( PyList_CheckExact(keys)) { length = PyList_Size(keys); for(i = 0; i != length; ++i) { PyDict_SetItem(result, PyList_GetItem(keys, i), PyList_GetItem(vals, i)); } } Py_DECREF(keys); Py_DECREF(vals); return result; }