1 module tagion.devutils.dartstat;
2 
3 import std.algorithm : countUntil;
4 import std.file;
5 import std.stdio;
6 import std.traits;
7 import std.typetuple;
8 import std.array;
9 
10 import tagion.basic.Types : Buffer, FileExtension, hasExtension;
11 import tagion.dart.BlockFile;
12 import tagion.dart.DART;
13 import tagion.dart.DARTFile;
14 import tagion.dart.DARTBasic;
15 import tagion.script.common;
16 import tagion.crypto.SecureNet;
17 import tagion.hibon.Document;
18 import tagion.hibon.HiBONRecord;
19 
20 alias darttypes = AliasSeq!(
21         TagionBill,
22         GenesisEpoch,
23         Epoch,
24         TagionHead,
25         TagionGlobals,
26 );
27 
28 struct Statistic {
29     uint count;
30     uint size;
31 }
32 
33 int _main(string[] args) {
34     const dart_file_index = args.countUntil!(file => file.hasExtension(FileExtension.dart) && file.exists);
35 
36     if (dart_file_index < 0) {
37         stderr.writeln("Missing dart file argument or file doesn't exists");
38         return 1;
39     }
40     const dartfilename = args[dart_file_index];
41 
42     auto net = new StdSecureNet;
43     Exception dart_exception;
44     auto db = new DART(net, dartfilename, dart_exception);
45 
46     scope (exit) {
47         db.close;
48     }
49 
50     Statistic[string] statistics;
51 
52     void addStat(string recordname, ulong size) {
53         auto entry = recordname in statistics;
54         if (entry is null) {
55             entry = new Statistic();
56         }
57         entry.count++;
58         entry.size += size;
59     }
60 
61     bool dartTraverse(const(Document) doc, const Index index, const uint rim, Buffer rim_path) {
62         static foreach (alias type; darttypes) {
63             if (doc.isRecord!type) {
64                 const recordname = (fullyQualifiedName!type).split(".")[$ - 1];
65                 addStat(recordname, doc.full_size);
66             }
67         }
68         return false;
69     }
70 
71     db.traverse(&dartTraverse);
72 
73     foreach (key, value; statistics) {
74         writeln(key, ":", value);
75     }
76 
77     return 0;
78 }