IoObject *IoTagDB_atKeyPutTags(IoTagDB *self, IoObject *locals, IoMessage *m) { /*doc TagDB atKeyPutTags(key, tagNameList) Sets the tags for key to those in tagNameList. Returns self. */ TagDB *tdb = DATA(self); IoSeq *key = IoMessage_locals_seqArgAt_(m, locals, 0); IoList *tagNames = IoMessage_locals_listArgAt_(m, locals, 1); symbolid_t keyid = TagDB_idForSymbol_size_(tdb, CSTRING(key), IoSeq_rawSize(key)); // debugging check /* Datum *keyDatum = TagDB_symbolForId_(tdb, keyid); printf("%s -> %i\n", CSTRING(key), (int)keyid); printf("%i -> %s\n", (int)keyid, (char *)(keyDatum->data)); assert(strcmp((char *)(keyDatum->data), (char *)CSTRING(key)) == 0); Datum_free(keyDatum); */ { Uint64Array *tags = IoTagDB_tagArrayForTagNames_(self, m, tagNames); TagDB_begin(tdb); TagDB_atKey_putTags_(tdb, keyid, tags); TagDB_commit(tdb); Uint64Array_free(tags); } return self; }
int main (int argc, const char * argv[]) { TagDB *tagDB = TagDB_new(); int i; int max = 10000; printf("\ntagdb performance tests:\n"); Timer_Begin(); remove("testdb"); TagDB_setPath_(tagDB, "testdb"); if(TagDB_open(tagDB) == 0) { exit(-1); } Timer_EndShowNumPerSecond(TagDB_size(tagDB), " load-record-from-disk op"); printf(" inserting...\n"); if (TagDB_size(tagDB) < max) { Timer_Begin(); for (i = TagDB_size(tagDB); i < max; i = i + 1) { TagIdArray *tags = TagIdArray_new(); tagid_t tid = rand() % 3; //printf("inserting %i\n", i); TagIdArray_append_(tags, tid); tid += 1 + rand() % 3; TagIdArray_append_(tags, tid); tid += 1 + rand() % 3; TagIdArray_append_(tags, tid); TagDB_atKey_putTags_(tagDB, i, tags); TagIdArray_free(tags); } Timer_EndShowNumPerSecond(max, "insert"); } printf(" searching...\n"); { int n, numSearches = 10000; TagIdArray *tags = TagIdArray_new(); KeyIdArray *results; TagIdArray_append_(tags, rand() % 5); TagIdArray_append_(tags, 3 + rand() % 3); Timer_Begin(); for(n = 0; n < numSearches; n ++) { results = TagDB_keysForTags_(tagDB, tags); } //printf("%i matches found\n", (int)results->size); TagIdArray_free(tags); Timer_EndShowNumPerSecond((numSearches * TagDB_size(tagDB)), "records searche"); } printf(" closing...\n"); TagDB_close(tagDB); printf(" reopening...\n"); Timer_Begin(); TagDB_open(tagDB); Timer_EndShowNumPerSecond(TagDB_size(tagDB), "records read"); printf(" removing...\n"); { size_t numToRemove = TagDB_size(tagDB); Timer_Begin(); for (i = 0; i < numToRemove; i = i + 1) { TagDB_removeKey_(tagDB, i); } Timer_EndShowNumPerSecond(numToRemove, "remove"); } TagDB_close(tagDB); TagDB_delete(tagDB); printf("\n"); return 0; }