+ssize_t GET_generate_list(void *cls, uint64_t pos, char *buf, size_t max) {
+ struct get_state *gs = cls;
+ const unsigned char *ybuf;
+ char *data;
+ unsigned int len;
+
+ if (gs->yoff > 0) {
+ yajl_gen_get_buf(gs->g, &ybuf, &len);
+ size_t bytes_remaining = len - gs->yoff;
+ if (bytes_remaining > max) {
+ memcpy(buf, ybuf + gs->yoff, max);
+ gs->yoff += max;
+ printf("generate list: gave %d bytes\n", max);
+ return max;
+ } else {
+ memcpy(buf, ybuf + gs->yoff, bytes_remaining);
+ gs->yoff = 0;
+ yajl_gen_clear(gs->g);
+ printf("generate list: gave %d bytes\n", bytes_remaining);
+ return bytes_remaining;
+ }
+ }
+
+ if (gs->done)
+ return -1;
+
+ if (pos == 0) { /* Start iterating */
+ gs->yoff = 0;
+ yajl_gen_array_open(gs->g);
+ uint64_t record_count = blerg_get_record_count(gs->b);
+ if (record_count == 0) {
+ gs->from = 1;
+ gs->to = 0;
+ } else {
+ gs->to = record_count - 1;
+ gs->from = (record_count > 50 ? gs->to - 49 : 0);
+ }
+ }
+
+ if (gs->from > gs->to) { /* Done iterating */
+ yajl_gen_array_close(gs->g);
+ gs->done = 1;
+ } else {
+ /* Snarf one record */
+ blerg_fetch(gs->b, gs->from, &data, &len);
+ yajl_gen_string(gs->g, data, len);
+ free(data);
+ gs->from++;
+ }
+
+
+ yajl_gen_get_buf(gs->g, &ybuf, &len);
+ printf("%d bytes in yajl buffer\n", len);
+ if (len > max) {
+ memcpy(buf, ybuf, max);
+ gs->yoff = max;
+ printf("generate list: gave %d bytes\n", max);
+ return max;
+ } else {
+ memcpy(buf, ybuf, len);
+ yajl_gen_clear(gs->g);
+ printf("generate list: gave %d bytes\n", len);
+ return len;
+ }
+}
+
+void GET_generate_list_free(void *cls) {
+ struct get_state *gs = cls;
+
+ blerg_close(gs->b);
+ yajl_gen_free(gs->g);
+ free(gs);
+}
+