cdbstats.c
changeset 0 eeadadee24f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdbstats.c	Fri Oct 19 11:01:15 2007 +0200
@@ -0,0 +1,125 @@
+#include "uint32.h"
+#include "fmt.h"
+#include "buffer.h"
+#include "strerr.h"
+#include "seek.h"
+#include "cdb.h"
+
+#define FATAL "cdbstats: fatal: "
+
+void die_read(void)
+{
+  strerr_die2sys(111,FATAL,"unable to read input: ");
+}
+void die_readformat(void)
+{
+  strerr_die2x(111,FATAL,"unable to read input: truncated file");
+}
+void die_write(void)
+{
+  strerr_die2sys(111,FATAL,"unable to write output: ");
+}
+void put(char *buf,unsigned int len)
+{
+  if (buffer_put(buffer_1small,buf,len) == -1) die_write();
+}
+void putflush(void)
+{
+  if (buffer_flush(buffer_1small) == -1) die_write();
+}
+
+uint32 pos = 0;
+
+void get(char *buf,unsigned int len)
+{
+  int r;
+  while (len > 0) {
+    r = buffer_get(buffer_0,buf,len);
+    if (r == -1) die_read();
+    if (r == 0) die_readformat();
+    pos += r;
+    buf += r;
+    len -= r;
+  }
+}
+
+void getnum(uint32 *num)
+{
+  char buf[4];
+  get(buf,4);
+  uint32_unpack(buf,num);
+}
+
+char strnum[FMT_ULONG];
+
+void putnum(char *label,unsigned long count)
+{
+  unsigned int i;
+  put(label,str_len(label));
+  for (i = fmt_ulong(0,count);i < 10;++i) put(" ",1);
+  put(strnum,fmt_ulong(strnum,count));
+  put("\n",1);
+}
+
+char key[1024];
+
+static struct cdb c;
+
+static unsigned long numrecords;
+static unsigned long numd[11];
+
+main()
+{
+  uint32 eod;
+  uint32 klen;
+  uint32 dlen;
+  seek_pos rest;
+  int r;
+
+  cdb_init(&c,0);
+
+  getnum(&eod);
+  while (pos < 2048) getnum(&dlen);
+
+  while (pos < eod) {
+    getnum(&klen);
+    getnum(&dlen);
+    if (klen > sizeof key) {
+      while (klen) { get(key,1); --klen; }
+    }
+    else {
+      get(key,klen);
+      rest = seek_cur(0);
+      cdb_findstart(&c);
+      do {
+        switch(cdb_findnext(&c,key,klen)) {
+	  case -1: die_read();
+	  case 0: die_readformat();
+        }
+      } while (cdb_datapos(&c) != pos);
+      if (!c.loop) die_readformat();
+      ++numrecords;
+      if (c.loop > 10)
+	++numd[10];
+      else
+	++numd[c.loop - 1];
+      if (seek_set(0,rest) == -1) die_read();
+    }
+    while (dlen) { get(key,1); --dlen; }
+  }
+  
+  putnum("records ",numrecords);
+  putnum("d0      ",numd[0]);
+  putnum("d1      ",numd[1]);
+  putnum("d2      ",numd[2]);
+  putnum("d3      ",numd[3]);
+  putnum("d4      ",numd[4]);
+  putnum("d5      ",numd[5]);
+  putnum("d6      ",numd[6]);
+  putnum("d7      ",numd[7]);
+  putnum("d8      ",numd[8]);
+  putnum("d9      ",numd[9]);
+  putnum(">9      ",numd[10]);
+  putflush();
+  _exit(0);
+}