FragInfo_t *rfraginfo_create (CCREF *refp, DataFragSMsg *fragp, unsigned max_frags) { DB *dbp; FragInfo_t *fip; dbp = db_alloc_data (fragp->sample_size, 1); if (!dbp) { warn_printf ("rfraginfo_create: no memory for sample data!"); return (NULL); } fip = xmalloc (FRAG_INFO_SIZE (max_frags)); if (!fip) { warn_printf ("rfraginfo_create: no memory for fragment info!"); db_free_data (dbp); return (NULL); } memset (fip, 0, FRAG_INFO_SIZE (max_frags)); fip->nrefs = 1; fip->total = fip->num_na = max_frags; fip->fsize = fragp->frag_size; if (refp->relevant) fip->writer = refp->u.c.change->c_writer; else fip->writer = 0; fip->data = dbp; fip->length = fragp->sample_size; tmr_init (&fip->timer, "FragInfo"); refp->fragments = fip; return (fip); }
JNIEXPORT jbyteArray JNICALL Java_org_nessdb_DB_get(JNIEnv *jenv, jobject clazz, jlong ptr, jbyteArray jkey, jint jklen ) { (void)clazz; char *key, *ktmp; struct slice sk, sv; struct nessdb *_db = (struct nessdb *)ptr; if (!_db) { __ERROR("get-->db is null, pls open first"); return NULL; } if (jklen >= NESSDB_MAX_KEY_SIZE) { __ERROR("key length too long...%d", jklen); return NULL; } memset(&sk, 0, sizeof(struct slice)); memset(&sv, 0, sizeof(struct slice)); key = (char*)(*jenv)->GetByteArrayElements(jenv, jkey, 0); if (key == NULL) return NULL; ktmp = malloc(jklen + 1); memset(ktmp, 0, jklen + 1); memcpy(ktmp, key, jklen); sk.data = ktmp; sk.len = jklen; db_get(_db, &sk, &sv); jbyteArray jval = NULL; if (sv.len > 0) { jval = (*jenv)->NewByteArray(jenv, sv.len); if (jval != NULL) { (*jenv)->SetByteArrayRegion(jenv, jval, 0, sv.len, (jbyte*)sv.data); } else { __ERROR("jenv new bytearray(%d) failed...", sv.len); } } /* release */ if (key) { (*jenv)->ReleaseByteArrayElements(jenv, jkey, (jbyte*)key, 0); free(ktmp); } if (sv.data) db_free_data(sv.data); return jval; }
void rfraginfo_delete (CCREF *refp) { FragInfo_t *fip; if ((fip = refp->fragments) == NULL) return; refp->fragments = NULL; rcl_access (fip); fip->nrefs--; rcl_done (fip); if (fip->nrefs > 0) return; db_free_data (fip->data); tmr_stop (&fip->timer); if (fip->key && fip->key != fip->hash.hash) xfree (fip->key); xfree (fip); }
FragInfo_t *rfraginfo_update (CCREF *refp, DataFragSMsg *fragp) { FragInfo_t *fip, *nfip; unsigned max_frags; fip = refp->fragments; if (!fip) return (NULL); if (fip->length != fragp->sample_size) { max_frags = (fragp->sample_size + fragp->frag_size - 1) / fragp->frag_size; if (fragp->frag_start + fragp->num_fragments - 1 > max_frags) { rfraginfo_delete (refp); return (NULL); } if (fip->length < fragp->sample_size) { db_free_data (fip->data); fip->data = db_alloc_data (fragp->sample_size, 1); if (!fip->data) { warn_printf ("rfraginfo_update: no memory for realloc()!"); rfraginfo_delete (refp); return (NULL); } } fip->length = fragp->sample_size; if (fip->total != max_frags) { nfip = xrealloc (fip, FRAG_INFO_SIZE (max_frags)); if (!nfip) { rfraginfo_delete (refp); return (NULL); } fip = refp->fragments = nfip; } } else max_frags = fip->total; memset (fip, 0, FRAG_INFO_SIZE (max_frags)); fip->total = fip->num_na = max_frags; fip->fsize = fragp->frag_size; return (fip); }
static int db_nessdb_select(struct nb_db *db, struct nb_key *key) { struct db_nessdb *t = db->priv; assert (key->size < UINT_MAX); struct slice nkey, nval; nkey.len = key->size; nkey.data = key->data; int count = db_get(t->instance->db, &nkey, &nval); if (count != 1) { printf("db_get() failed: %d\n", count); return -1; } #if defined(HAVE_NESSDB_SST) db_free_data(nval.data); #endif ++t->sent; return 0; }