+void bench_insert(ISAMB isb, int number_of_trees,
+ int number_of_rounds, int number_of_elements)
+{
+ ISAMC_I isamc_i;
+ ISAM_P *isamc_p = xmalloc(sizeof(ISAM_P) * number_of_trees);
+ struct read_info ri;
+ int round, i;
+
+ for (i = 0; i<number_of_trees; i++)
+ isamc_p[i] = 0; /* initially, is empty */
+
+ ri.val = 0;
+ ri.step = 1;
+ ri.insertMode = 1;
+
+ for (round = 0; round < number_of_rounds; round++)
+ {
+#if HAVE_SYS_TIMES_H
+#if HAVE_SYS_TIME_H
+ struct tms tms1, tms2;
+ struct timeval start_time, end_time;
+ double usec;
+ times(&tms1);
+ gettimeofday(&start_time, 0);
+#endif
+#endif
+ for (i = 0; i<number_of_trees; i++)
+ {
+
+ /* insert a number of entries */
+ ri.no = 0;
+
+ ri.val = (rand());
+ ri.max = number_of_elements;
+
+ isamc_i.clientData = &ri;
+ isamc_i.read_item = code_read;
+
+
+ isamb_merge (isb, &isamc_p[i] , &isamc_i);
+ }
+#if HAVE_SYS_TIMES_H
+#if HAVE_SYS_TIME_H
+ gettimeofday(&end_time, 0);
+ times(&tms2);
+
+ usec = (end_time.tv_sec - start_time.tv_sec) * 1000000.0 +
+ end_time.tv_usec - start_time.tv_usec;
+
+ yaz_log (YLOG_LOG, "round=%d times: %5.4f %5.2f %5.2f",
+ round,
+ usec / 1000000,
+ (double) (tms2.tms_utime - tms1.tms_utime)/100,
+ (double) (tms2.tms_stime - tms1.tms_stime)/100);
+#endif
+#endif
+ }
+}
+
+void tst_insert(ISAMB isb, int n)
+{
+ ISAMC_I isamc_i;
+ ISAM_P isamc_p;
+ struct read_info ri;
+ ISAMB_PP pp;
+ char key_buf[20];
+ int nerrs = 0;
+
+ /* insert a number of entries */
+ ri.no = 0;
+ ri.max = n;
+
+ ri.val = 0;
+ ri.step = 1;
+ ri.insertMode = 1;
+
+ isamc_i.clientData = &ri;
+ isamc_i.read_item = code_read;
+
+ isamc_p = 0; /* new list */
+ isamb_merge (isb, &isamc_p , &isamc_i);
+
+ /* read the entries */
+ pp = isamb_pp_open (isb, isamc_p, 1);
+
+ ri.val = 0;
+ while(isamb_pp_read (pp, key_buf))
+ {
+ int x;
+ memcpy (&x, key_buf, sizeof(int));
+ if (x != ri.val)
+ {
+ yaz_log(YLOG_WARN, "isamb_pp_read. n=%d Got %d (expected %d)",
+ n, x, ri.val);
+ nerrs++;
+ }
+ else if (nerrs)
+ yaz_log(YLOG_LOG, "isamb_pp_read. n=%d Got %d",
+ n, x);
+
+ ri.val++;
+ }
+ if (ri.val != ri.max)
+ {
+ yaz_log(YLOG_WARN, "ri.max != ri.max (%d != %d)", ri.val, ri.max);
+ nerrs++;
+ }
+ isamb_dump(isb, isamc_p, log_pr);
+ isamb_pp_close(pp);
+
+ if (nerrs)
+ exit(3);
+ /* delete a number of entries (even ones) */
+ ri.no = 0;
+ ri.max = n - n/2;
+
+ ri.val = 0;
+ ri.step = 2;
+ ri.insertMode = 0;
+
+ isamc_i.clientData = &ri;
+ isamc_i.read_item = code_read;
+
+ isamb_merge (isb, &isamc_p , &isamc_i);
+
+ /* delete a number of entries (odd ones) */
+ ri.no = 0;
+ ri.max = n/2;
+
+ ri.val = 1;
+ ri.step = 2;
+ ri.insertMode = 0;
+
+ isamc_i.clientData = &ri;
+ isamc_i.read_item = code_read;
+
+ isamb_merge (isb, &isamc_p, &isamc_i);
+
+ if (isamc_p)
+ {
+ yaz_log(YLOG_WARN, "isamb_merge did not return empty list n=%d",
+ n);
+ exit(3);
+ }
+}
+