static void mt_setget(void) { char value[100]; memset(value, 0, sizeof(value)); uint32_t n = 1000000; uint32_t i, k; srand(82351); for (i = 0; i < n; i++) { k = rand(); *(uint32_t*)value = k; void *o = sp_object(st_r.db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(st_r.db, o) == 0 ); print_current(i); } srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_object(st_r.db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(st_r.db, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", NULL) == k ); sp_destroy(o); print_current(i); } }
static void mt_async_read(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setint(env, "compaction.0.async", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setstring(env, "db.test.format", "kv", 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int i = 0; while (i < 100000) { void *o = sp_object(db); assert(o != NULL); sp_setstring(o, "key", &i, sizeof(i)); int rc = sp_set(db, o); t( rc == 0 ); print_current(i); i++; } fprintf(st_r.output, " (insert done..iterate) "); void *async = sp_asynchronous(db); t( async != NULL ); /* trigger iteration */ void *o = sp_object(async); sp_setstring(o, "order", ">=", 0); o = sp_get(db, o); t( o != NULL ); sp_destroy(o); i = 0; while (i < 100000) { o = sp_poll(env); if (o == NULL) continue; t( strcmp(sp_getstring(o, "type", 0), "on_read") == 0 ); t( sp_getint(o, "status") == 1 ); t( *(int*)sp_getstring(o, "key", NULL) == i ); o = sp_get(db, o); t( o != NULL ); sp_destroy(o); print_current(i); i++; } t( i == 100000 ); fprintf(st_r.output, "(complete)"); t( sp_destroy(env) == 0 ); }
static void mt_set_delete_get(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); char value[100]; memset(value, 0, sizeof(value)); uint32_t n = 700000; uint32_t i, k; srand(82351); for (i = 0; i < n; i++) { k = rand(); *(uint32_t*)value = k; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } srand(82351); for (i = 0; i < n; i++) { k = rand(); *(uint32_t*)value = k; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_delete(db, o) == 0 ); print_current(i); } srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o == NULL ); print_current(i); } t( sp_destroy(env) == 0 ); }
static void mt_set_get_kv_multipart(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.compression_key", 1) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "string", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key_b", 0) == 0 ); t( sp_setstring(env, "db.test.index.key_b", "u32", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); uint32_t n = 500000; uint32_t i; char key_a[] = "very_long_long_key_part"; srand(82351); for (i = 0; i < n; i++) { uint32_t key_b = rand(); uint32_t value = key_b; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", key_a, sizeof(key_a)) == 0 ); t( sp_setstring(o, "key_b", &key_b, sizeof(key_b)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } srand(82351); for (i = 0; i < n; i++) { uint32_t key_b = rand(); uint32_t value = key_b; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", key_a, sizeof(key_a)) == 0 ); t( sp_setstring(o, "key_b", &key_b, sizeof(key_b)) == 0 ); o = sp_get(db, o); t( o != NULL ); int size = 0; t( memcmp(sp_getstring(o, "key", &size), key_a, sizeof(key_a)) == 0 ); t( *(uint32_t*)sp_getstring(o, "key_b", &size) == key_b ); t( *(uint32_t*)sp_getstring(o, "value", &size) == value ); sp_destroy(o); print_current(i); } t( sp_destroy(env) == 0 ); }
static void mt_set_get_anticache(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setint(env, "memory.anticache", 500 * 1024) == 0 ); t( sp_setint(env, "compaction.node_size", 100 * 1024) == 0 ); t( sp_setint(env, "compaction.page_size", 8 * 1024) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.storage", "anti-cache", 0) == 0 ); t( sp_setint(env, "db.test.compression_key", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); uint32_t n = 700000; uint32_t i, k; char value[100]; memset(value, 0, sizeof(value)); srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o != NULL ); sp_destroy(o); print_current(i); } t( sp_destroy(env) == 0 ); }
void try_profile(uint8_t slave_addr, uint8_t profile, uint8_t dce, uint8_t* draw_best_ptr, uint8_t* best_profile_ptr, uint8_t* best_dce_ptr) { uint8_t draw_now, cnt; // Try cycling each of the DCE profiles on one at a time TODO is there a better way to do this? //REG21 enable single legacy profiles during DCE cycling. skip if null (non DCE profile attempts) if (dce) i2c_slave_command(slave_addr, 0x21, dce); i2c_slave_command(slave_addr, 0x17, (profile & ~(1 << 1))); //disable port power putstring0("Config REG17 0 (hex): "); puthexbyte0(i2c_slave_read(slave_addr, 0x17)); terpri0(); soc_update(0x00); // i2c_slave_command(slave_addr, 0x15, 0x10); // discharge vbus, disable port power for (cnt = 0; cnt < PRFL_WAIT_MS/10; cnt++) //TODO see how much this can be reduced __delay_ms(10); // i2c_slave_command(slave_addr, 0x15, 0x00); // i2c_slave_command(slave_addr, 0x17, profile); //enable port power putstring0("Config REG17 1 (hex): "); puthexbyte0(i2c_slave_read(slave_addr, 0x17)); terpri0(); soc_update(0xFF); for (cnt = 0; cnt < PRFL_WAIT_MS/10; cnt++) //wait for profile to be applied and go into effect on device __delay_ms(10); draw_now = i2c_slave_read(slave_addr, 0x00); //update the current reading if (draw_now > *draw_best_ptr) { *best_dce_ptr = dce; *best_profile_ptr = profile; *draw_best_ptr = draw_now; } //debug if (slave_addr == USBA_ADDR) { putstring0("USBA try profile port current: "); print_current(draw_now); print_status(USBA_ADDR, 0x12, i2c_slave_read(USBA_ADDR, 0x12)); terpri0(); // show applied profile 1 BC 1.2 print_status(USBA_ADDR, 0x13, i2c_slave_read(USBA_ADDR, 0x13)); terpri0(); // show applied profile 2 legacy putstring0("Config REG17 (hex): "); puthexbyte0(i2c_slave_read(USBA_ADDR, 0x17)); terpri0(); putstring0("Applied emulation REG30 (hex): "); puthexbyte0(i2c_slave_read(USBA_ADDR, 0x30)); terpri0(); terpri0(); // IOCBF3 = 0; } if (slave_addr == USBB_ADDR) { putstring0("USBB try profile port current: "); print_current(draw_now); print_status(USBB_ADDR, 0x12, i2c_slave_read(USBB_ADDR, 0x12)); terpri0(); print_status(USBB_ADDR, 0x13, i2c_slave_read(USBB_ADDR, 0x13)); terpri0(); putstring0("Config REG17 (hex): "); puthexbyte0(i2c_slave_read(USBB_ADDR, 0x17)); terpri0(); putstring0("Applied emulation REG30 (hex): "); puthexbyte0(i2c_slave_read(USBB_ADDR, 0x30)); terpri0(); terpri0(); // IOCBF4 = 0; } return; }
static int getrand(int n) { int rc; int i; for (i = 0; i < n; i++) { uint32_t k = rand(); memcpy(key, &k, sizeof(k)); k = rand(); memcpy(key + 4, &k, sizeof(k)); k = rand(); memcpy(key + 8, &k, sizeof(k)); k = rand(); memcpy(key + 12, &k, sizeof(k)); void *v = NULL; size_t vsize = 0; rc = sp_get(db, key, sizeof(key), &v, &vsize); if (rc <= 0) { printf("get: %s\n", sp_error(db)); break; } free(v); print_current(i); } return 0; }
void RelocIterator::print() { RelocIterator save_this = (*this); relocInfo* scan = _current; if (!has_current()) scan += 1; // nothing to scan here! bool skip_next = has_current(); bool got_next; while (true) { got_next = (skip_next || next()); skip_next = false; tty->print(" @" INTPTR_FORMAT ": ", scan); relocInfo* newscan = _current+1; if (!has_current()) newscan -= 1; // nothing to scan here! while (scan < newscan) { tty->print("%04x", *(short*)scan & 0xFFFF); scan++; } tty->cr(); if (!got_next) break; print_current(); } (*this) = save_this; }
static void print_power(char *tag, cistpl_power_t *power) { int i, n; for (i = n = 0; i < 8; i++) if (power->present & (1<<i)) n++; i = 0; printf("%s %s", indent, tag); if (power->present & (1<<CISTPL_POWER_VNOM)) { printf(" Vnom "); i++; print_volt(power->param[CISTPL_POWER_VNOM]); } if (power->present & (1<<CISTPL_POWER_VMIN)) { printf(" Vmin "); i++; print_volt(power->param[CISTPL_POWER_VMIN]); } if (power->present & (1<<CISTPL_POWER_VMAX)) { printf(" Vmax "); i++; print_volt(power->param[CISTPL_POWER_VMAX]); } if (power->present & (1<<CISTPL_POWER_ISTATIC)) { printf(" Istatic "); i++; print_current(power->param[CISTPL_POWER_ISTATIC]); } if (power->present & (1<<CISTPL_POWER_IAVG)) { if (++i == 5) printf("\n%s ", indent); printf(" Iavg "); print_current(power->param[CISTPL_POWER_IAVG]); } if (power->present & (1<<CISTPL_POWER_IPEAK)) { if (++i == 5) printf("\n%s ", indent); printf(" Ipeak "); print_current(power->param[CISTPL_POWER_IPEAK]); } if (power->present & (1<<CISTPL_POWER_IDOWN)) { if (++i == 5) printf("\n%s ", indent); printf(" Idown "); print_current(power->param[CISTPL_POWER_IDOWN]); } if (power->flags & CISTPL_POWER_HIGHZ_OK) { if (++i == 5) printf("\n%s ", indent); printf(" [highz OK]"); } if (power->flags & CISTPL_POWER_HIGHZ_REQ) { printf(" [highz]"); } putchar('\n'); }
static void mt_upsert2(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.index.upsert", upsert_op, 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); uint32_t n = 700000; uint32_t i, k = 1234; uint32_t value = 1; void *tx = sp_begin(env); t( tx != NULL ); for (i = 0; i < n; i++) { if (i > 0 && (i % 1000) == 0) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); void *c = sp_cursor(env); t( c != NULL ); o = sp_get(c, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", NULL) == i); sp_destroy(o); sp_destroy(c); t( sp_commit(tx) == 0 ); tx = sp_begin(env); t( tx != NULL ); } void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_upsert(db, o) == 0 ); print_current(i); } t( sp_commit(tx) == 0 ); t( sp_destroy(env) == 0 ); }
static int setseq(int n) { int rc; int i; for (i = 0; i < n; i++) { memcpy(key + 8, &keyseq, sizeof(keyseq)); keyseq++; rc = sp_set(db, key, sizeof(key), value, sizeof(value)); if (rc == -1) { printf("sp_set: %s\n", sp_error(db)); return 1; } print_current(i); } return 0; }
static int getseq(int n) { int rc; int i; for (i = 0; i < n; i++) { memcpy(key + 8, &keyseq, sizeof(keyseq)); keyseq++; void *v = NULL; size_t vsize = 0; rc = sp_get(db, key, sizeof(key), &v, &vsize); if (rc <= 0) { printf("get: %s\n", sp_error(db)); break; } free(v); print_current(i); } return 0; }
static int setrand(int n) { int rc; int i; for (i = 0; i < n; i++) { uint32_t k = rand(); memcpy(key, &k, sizeof(k)); k = rand(); memcpy(key + 4, &k, sizeof(k)); k = rand(); memcpy(key + 8, &k, sizeof(k)); k = rand(); memcpy(key + 12, &k, sizeof(k)); rc = sp_set(db, key, sizeof(key), value, sizeof(value)); if (rc == -1) { printf("sp_set: %s\n", sp_error(db)); return 1; } print_current(i); } return 0; }
int main(void) { char c; int i, num; node* ptr = first; printf("How many entries do you want to enter initially?\n"); // ask user for a initial list length scanf("%i", &num); // create user defined length of a list of structures for (i = 0; i < num ; i++) { ptr = insert(ptr); } do { printf("Currently you have %i entry(ies)", num_list); if (num_list > 0) { if (ptr != NULL) { print_current(ptr); } } // print instructions printf("\nMENU\n\n" "1 - delete\n" "2 - insert\n" "3 - search\n" "4 - print_list\n" "5 - move to the previous list\n" "6 - move to the next list\n" "0 - quit\n\n"); // get command printf("Command: "); fflush(stdin); scanf("%c", &c); // try to execute command switch (c) { case '1': del(); break; case '2': ptr = insert(ptr); break; case '3': search(); break; case '4': print_list(); break; case '5': ptr = move_pred(ptr); break; case '6': ptr = move_next(ptr); break; } } while (c != '0'); // free list before quitting(to prevent memory leakage) while (ptr != NULL) { node* predptr = ptr; ptr = ptr->next; if (predptr->person != NULL) { if (predptr->person->name != NULL) { free(predptr->person->name); } free(predptr->person); } free(predptr); } }
static void mt_set_snapshot_recover_get(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); char value[100]; memset(value, 0, sizeof(value)); uint32_t n = 300000; uint32_t i, k; srand(82351); for (i = 0; i < n; i++) { k = rand(); *(uint32_t*)value = k; void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } t( sp_setint(env, "log.rotate", 0) == 0 ); t( sp_setint(env, "scheduler.snapshot", 0) == 0 ); fprintf(st_r.output, " (snapshot.."); fflush(st_r.output); for (;;) { int active = sp_getint(env, "scheduler.snapshot_active"); if (!active) break; } fprintf(st_r.output, "done)"); t( sp_destroy(env) == 0 ); fprintf(st_r.output, "(recover.."); fflush(st_r.output); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); fprintf(st_r.output, "done)"); srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", NULL) == k ); sp_destroy(o); print_current(i); } t( sp_destroy(env) == 0 ); }
static void mt_set_checkpoint_get(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); char value[100]; memset(value, 0, sizeof(value)); uint32_t n = 300000; uint32_t i, k; srand(82351); for (i = 0; i < n; i++) { k = rand(); *(uint32_t*)value = k; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } t( sp_setint(env, "log.rotate", 0) == 0 ); t( sp_setint(env, "scheduler.checkpoint", 0) == 0 ); fprintf(st_r.output, " (checkpoint.."); for (;;) { int active = sp_getint(env, "scheduler.checkpoint_active"); if (!active) break; } fprintf(st_r.output, "done)"); /* This works only with thread = 1. * * Real data flush can happed before index got * collected and any other worker trigger * checkpoint complete. */ t( sp_setint(env, "log.gc", 0) == 0 ); t( sp_getint(env, "log.files") == 1 ); srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", NULL) == k ); sp_destroy(o); print_current(i); } t( sp_destroy(env) == 0 ); }
static void mt_set_get_document_multipart_cursor(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setstring(env, "db.test.format", "document", 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key_b", 0) == 0 ); t( sp_setstring(env, "db.test.index.key_b", "u32", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); struct document { uint32_t value; char used0[89]; uint32_t key_a; char used1[15]; uint32_t key_b; char used2[10]; } sspacked; struct document doc; memset(&doc, 'x', sizeof(doc)); uint32_t n = 500000; uint32_t i; for (i = 0; i < n; i++) { doc.key_a = i; doc.key_b = i; doc.value = doc.key_a ^ doc.key_b; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &doc.key_a, sizeof(doc.key_a)) == 0 ); t( sp_setstring(o, "key_b", &doc.key_b, sizeof(doc.key_b)) == 0 ); t( sp_setstring(o, "value", &doc, sizeof(doc)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } i = 0; void *o = sp_object(db); t( o != NULL ); void *cursor = sp_cursor(env); t( cursor != NULL ); while ((o = sp_get(cursor, o))) { int valuesize = 0; struct document *ret = (struct document*)sp_getstring(o, "value", &valuesize); t( valuesize == sizeof(doc) ); t( ret->key_a == i ); t( ret->key_b == i ); print_current(i); i++; } sp_destroy(cursor); t( i == n ); t( sp_destroy(env) == 0 ); }