1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
76
  
77
  
78
  
79
  
80
  
81
  
82
  
83
  
84
  
85
  
86
  
87
  
88
  
89
  
90
  
91
  
92
  
93
  
94
  
#!/usr/local/bin/pike 
/* 
 * $Id$ 
 * 
 * name = "PDB Inspector"; 
 * doc = "This is a tool to inspect PDB databases."; 
 */ 
 
int rowsize(object o, string table, string row) 
{ 
  return sizeof(encode_value(o[table][row])); 
} 
 
int tablesize(object o, string table) 
{ 
  int n = 0; 
  foreach(indices(o[table]), string row) 
    n += rowsize(o, table, row); 
  return n; 
} 
 
int du(object o, string|void table, string|void row) 
{ 
  if(row) 
    return rowsize(o, table, row); 
  if(table) 
    return tablesize(o, table); 
   
  int n = 0; 
  foreach(indices(o), string table) 
    n += tablesize(o, table); 
  return n; 
} 
 
void main(int argc, array argv) 
{ 
  object o = PDB.db(argv[1], "r"); 
  write("Per Database Inspector\nOK.\n"); 
 
  string cmd, table, arg; 
  do { 
    array a = ((readline("> ") || "exit")/" ") - ({}); 
    cmd = a[0]; 
    arg = a[1..]*" "; 
    if(!sizeof(arg)) 
      arg = 0; 
 
    switch(cmd) { 
    case "du": 
      int n; 
      if(table) 
        n = du(o, table, arg); 
      else 
        n = du(o, arg); 
      write(sprintf("%d\n", n)); 
      break; 
    case "ls": 
      if(table || arg) 
        write(indices(o[table || arg])*"\n"+"\n"); 
      else 
        write(indices(o)*"\n"+"\n"); 
      break; 
    case "cat": 
      if(table && mkmultiset(indices(o[table]))[arg]) 
        write(sprintf("%O\n", o[table][arg])); 
      else 
        write(sprintf("%O: %O: No such row\n", table, arg)); 
      break; 
    case "pwd": 
      write("["+(table?table:"")+"]\n"); 
      break; 
    case "cd": 
      if(arg == "..") { 
        table = 0; 
      } else { 
        if(mkmultiset(indices(o))[arg]) 
          table = arg; 
        else 
          write(sprintf("%O: %O: No such table\n", argv[0], arg)); 
      } 
      break; 
    case "help": 
      write("Available commands are: du, ls, cat, pwd, cd, exit.\n"); 
      break; 
    case "": 
    case "exit": 
      break; 
    default: 
      write("nada\n"); 
    } 
  } while(cmd != "exit");     
}