/* RTDBIterValuesValsType.tp_iternext */ static PyObject * RTDBIterValuesVals_tp_iternext(DBIter *self) { RDBBase *rdbbase = (RDBBase *)self->db; void *key; int key_size; TCMAP *value; TCLIST *valuevals; PyObject *pyvaluevals; if (rdbbase->changed) { return set_error(Error, "DB changed during iteration"); } Py_BEGIN_ALLOW_THREADS key = tcrdbiternext(rdbbase->rdb, &key_size); if (key) { value = tcrdbtblget(rdbbase->rdb, key, key_size); } Py_END_ALLOW_THREADS if (!key) { if (tcrdbecode(rdbbase->rdb) == TTENOREC) { return set_stopiteration_error(); } return set_rdb_error(rdbbase->rdb, NULL); } valuevals = tcmapvals(value); pyvaluevals = tclist_to_tuple(valuevals); tcmapdel(value); tclistdel(valuevals); return pyvaluevals; }
/* RTDBIterItemsType.tp_iternext */ static PyObject * RTDBIterItems_tp_iternext(DBIter *self) { RDBBase *rdbbase = (RDBBase *)self->db; void *key; int key_size; TCMAP *value; PyObject *pykey, *pyvalue, *pyresult = NULL; if (rdbbase->changed) { return set_error(Error, "DB changed during iteration"); } Py_BEGIN_ALLOW_THREADS key = tcrdbiternext(rdbbase->rdb, &key_size); if (key) { value = tcrdbtblget(rdbbase->rdb, key, key_size); } Py_END_ALLOW_THREADS if (!key) { if (tcrdbecode(rdbbase->rdb) == TTENOREC) { return set_stopiteration_error(); } return set_rdb_error(rdbbase->rdb, NULL); } pykey = void_to_bytes(key, key_size); pyvalue = tcmap_to_dict(value); if (pykey && pyvalue) { pyresult = PyTuple_Pack(2, pykey, pyvalue); } Py_XDECREF(pykey); Py_XDECREF(pyvalue); tcfree(key); tcmapdel(value); return pyresult; }
void get_cb(struct evhttp_request *req, struct evbuffer *evb, void *ctx) { const char *value, *name; char *uri, *json, *hash, *key; struct evkeyvalq args; struct json_object *jsobj, *jsobj2, *jsobj3; TCMAP *cols; if (rdb == NULL) { evhttp_send_error(req, 503, "database not connected"); return; } uri = evhttp_decode_uri(req->uri); evhttp_parse_query(uri, &args); free(uri); hash = (char *)evhttp_find_header(&args, "hash"); key = (char *)evhttp_find_header(&args, "key"); if (hash == NULL) { evhttp_send_error(req, 400, "hash is required"); evhttp_clear_headers(&args); return; } jsobj = json_object_new_object(); jsobj2 = json_object_new_object(); cols = tcrdbtblget(rdb, hash, sizeof(hash)); if (cols) { tcmapiterinit(cols); jsobj3 = json_object_new_object(); if (key) { value = tcmapget2(cols, key); if (!value) { value = ""; } json_object_object_add(jsobj2, key, json_object_new_string(value)); } else { while ((name = tcmapiternext2(cols)) != NULL) { json_object_object_add(jsobj2, name, json_object_new_string(tcmapget2(cols, name))); } } json_object_object_add(jsobj, "status", json_object_new_string("ok")); json_object_object_add(jsobj, "results", jsobj2); tcmapdel(cols); } else { json_object_object_add(jsobj, "status", json_object_new_string("error")); } finalize_json(req, evb, &args, jsobj); }
void* xtcrdb_tblget(void* connection, const char* pkey) { // XXX from sample code, but is this necessary??? strlen? char pkbuf[256]; int pksiz = sprintf(pkbuf, "%s", pkey); return tcrdbtblget(connection, pkbuf, pksiz); }
/* getimpl */ JNIEXPORT jobjectArray JNICALL Java_tokyotyrant_TCRDB_getimpl (JNIEnv *env, jobject self, jbyteArray pkey){ if(!pkey){ throwillarg(env); return 0; } TCRDB *tcrdb = (TCRDB *)(intptr_t)(*env)->GetLongField(env, self, tcrdb_fid_ptr); jboolean ick; jbyte *kbuf = (*env)->GetByteArrayElements(env, pkey, &ick); if(!kbuf){ throwoutmem(env); return NULL; } int ksiz = (*env)->GetArrayLength(env, pkey); jobjectArray ary = NULL; TCMAP *tcols = tcrdbtblget(tcrdb, kbuf, ksiz); if(tcols){ int anum = tcmaprnum(tcols) * 2; ary = (*env)->NewObjectArray(env, anum, (*env)->GetObjectClass(env, pkey), NULL); anum = 0; tcmapiterinit(tcols); const char *nbuf; int nsiz; while((nbuf = tcmapiternext(tcols, &nsiz)) != NULL){ int vsiz; const char *vbuf = tcmapiterval(nbuf, &vsiz); jbyteArray nary = (*env)->NewByteArray(env, nsiz); if(!nary){ throwoutmem(env); return NULL; } jbyteArray vary = (*env)->NewByteArray(env, vsiz); if(!vary){ throwoutmem(env); return NULL; } (*env)->SetByteArrayRegion(env, nary, 0, nsiz, (jbyte *)nbuf); (*env)->SetByteArrayRegion(env, vary, 0, vsiz, (jbyte *)vbuf); (*env)->SetObjectArrayElement(env, ary, anum++, nary); (*env)->SetObjectArrayElement(env, ary, anum++, vary); (*env)->DeleteLocalRef(env, vary); (*env)->DeleteLocalRef(env, nary); } tcmapdel(tcols); } if(ick) (*env)->ReleaseByteArrayElements(env, pkey, kbuf, JNI_ABORT); return ary; }
/* RTDB_tp_as_mapping.mp_subscript */ static PyObject * RTDB_GetItem(RTDB *self, PyObject *pykey) { void *key; int key_size; TCMAP *value; PyObject *pyvalue; RDBBase *rdbbase = (RDBBase *)self; if (bytes_to_void(pykey, &key, &key_size)) { return NULL; } Py_BEGIN_ALLOW_THREADS value = tcrdbtblget(rdbbase->rdb, key, key_size); Py_END_ALLOW_THREADS if (!value) { return set_rdb_error(rdbbase->rdb, key); } pyvalue = tcmap_to_dict(value); tcmapdel(value); return pyvalue; }
void search_cb(struct evhttp_request *req, struct evbuffer *evb, void *ctx) { char *uri, *json; double lat, lng, distance, minlat, minlng, maxlat, maxlng, miles, lat2, lng2; int x1, x2, y1, y2, id, max; int total; struct evkeyvalq args; int ecode, pksiz, i, rsiz; char pkbuf[256]; char minx[8]; char miny[8]; char maxx[8]; char maxy[8]; const char *rbuf, *name, *buf; RDBQRY *query; TCLIST *result; TCMAP *cols; Geo_Result *georesultPtr, **georesults; struct json_object *jsobj, *jsobj2, *jsarr; if (rdb == NULL) { evhttp_send_error(req, 503, "database not connected"); return; } uri = evhttp_decode_uri(req->uri); evhttp_parse_query(uri, &args); free(uri); argtof(&args, "lat", &lat, 0); argtof(&args, "lng", &lng, 0); argtof(&args, "miles", &miles, 0); argtoi(&args, "max", &max, 1); geo_box(lat, lng, miles, &minlat, &minlng, &maxlat, &maxlng); x1 = (minlat * 10000) + 1800000; y1 = (minlng * 10000) + 1800000; x2 = (maxlat * 10000) + 1800000; y2 = (maxlng * 10000) + 1800000; sprintf(minx, "%d", x1); sprintf(miny, "%d", y1); sprintf(maxx, "%d", x2); sprintf(maxy, "%d", y2); query = tcrdbqrynew(rdb); tcrdbqryaddcond(query, "x", RDBQCNUMGT, minx); tcrdbqryaddcond(query, "x", RDBQCNUMLT, maxx); tcrdbqryaddcond(query, "y", RDBQCNUMGT, miny); tcrdbqryaddcond(query, "y", RDBQCNUMLT, maxy); tcrdbqrysetorder(query, "x", RDBQONUMASC); cols = tcmapnew(); result = tcrdbqrysearch(query); total = tclistnum(result); georesults = malloc(sizeof(Geo_Result *) * total); for(i = 0; i < total; i++){ rbuf = tclistval(result, i, &rsiz); cols = tcrdbtblget(rdb, rbuf, rsiz); if (cols) { georesultPtr = malloc(sizeof(*georesultPtr)); tcmapiterinit(cols); buf = tcmapget2(cols, "lat"); lat2 = atof(buf); georesultPtr->latitude = lat2; buf = tcmapget2(cols, "lng"); lng2 = atof(buf); georesultPtr->longitude = lng2; id = atoi(rbuf); georesultPtr->id = id; georesultPtr->data = strdup(tcmapget2(cols, "data")); distance = geo_distance(lat, lng, lat2, lng2); georesultPtr->distance = distance; georesults[i] = georesultPtr; tcmapdel(cols); } } tclistdel(result); tcrdbqrydel(query); qsort(georesults, total, sizeof(Geo_Result *), CmpElem); jsobj = json_object_new_object(); jsarr = json_object_new_array(); for(i = 0; i < total; i++){ georesultPtr = georesults[i]; if (i < max) { jsobj2 = json_object_new_object(); json_object_object_add(jsobj2, "id", json_object_new_int(georesultPtr->id)); json_object_object_add(jsobj2, "data", json_object_new_string(georesultPtr->data)); json_object_object_add(jsobj2, "latitude", json_object_new_double(georesultPtr->latitude)); json_object_object_add(jsobj2, "longitude", json_object_new_double(georesultPtr->longitude)); json_object_object_add(jsobj2, "distance", json_object_new_double(georesultPtr->distance)); json_object_array_add(jsarr, jsobj2); } free(georesultPtr->data); free(georesultPtr); } free(georesults); json_object_object_add(jsobj, "total", json_object_new_int(total)); json_object_object_add(jsobj, "results", jsarr); finalize_json(req, evb, &args, jsobj); }