+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);
+ }
+}
+