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 }