1 module neton.wal.Util; 2 3 import std.string; 4 import std.format; 5 import std.file; 6 import std.stdio; 7 import std.array; 8 import core.stdc.stdio; 9 import std.path; 10 import std.algorithm.sorting; 11 import hunt.logging; 12 13 bool Exist(string dirpath) { 14 return exists(dirpath); 15 } 16 17 bool isEmptyDir(string dirpath) 18 { 19 if(!Exist(dirpath)) 20 return true; 21 string[] names; 22 foreach (string name; dirEntries(dirpath, SpanMode.shallow)) 23 { 24 names ~= name; 25 } 26 27 return names.length == 0; 28 } 29 30 string walName(ulong seq, ulong index) { 31 32 auto walName = appender!string(); 33 formattedWrite(walName, "%s-%s.wal",seq,index); 34 return walName.data; 35 } 36 37 void renameDir(string srcpath ,string dstpath) 38 { 39 core.stdc.stdio.rename(toStringz(srcpath),toStringz(dstpath)); 40 } 41 42 bool cmp_walname_idx(string a , string b) 43 { 44 ulong a_seq,a_idx,b_seq,b_idx; 45 parseWalName(a,a_seq,a_idx); 46 parseWalName(b,b_seq,b_idx); 47 return a_idx < b_idx; 48 } 49 50 bool cmp_walname_seq(string a , string b) 51 { 52 ulong a_seq,a_idx,b_seq,b_idx; 53 parseWalName(a,a_seq,a_idx); 54 parseWalName(b,b_seq,b_idx); 55 return a_seq < b_seq; 56 } 57 58 //按index 由小到大排序,同样index 按seq由小到大排序 59 string[] readWalNames( string dirpath) { 60 string[] names; 61 if(!Exist(dirpath)) 62 return names; 63 foreach (string name; dirEntries(dirpath, SpanMode.shallow)) 64 { 65 names ~= std.path.baseName(name); 66 } 67 multiSort!(cmp_walname_idx,cmp_walname_seq)(names); 68 return names; 69 } 70 71 void parseWalName( string str ,out ulong seq ,out ulong index) { 72 formattedRead(str,"%s-%s.wal",&seq,&index); 73 } 74 75 // searchIndex returns the last array index of names whose raft index section is 76 // equal to or smaller than the given index. 77 // The given names MUST be sorted. 78 long searchIndex(string[] names, ulong index) { 79 long res = -1; 80 if(names.length == 0) 81 return res; 82 ulong seq,idx; 83 logInfo("wal names : ",names ); 84 for(auto i= names.length-1; i>=0; i--) 85 { 86 parseWalName(names[i],seq,idx); 87 if(idx <= index) 88 { 89 res = i; 90 break; 91 } 92 } 93 return res; 94 } 95 96 97 string snapDirPath(ulong id) 98 { 99 auto path = appender!string(); 100 formattedWrite(path, "%s-%s","./snap",id); 101 return path.data; 102 } 103 104 string walDirPath(ulong id) 105 { 106 auto path = appender!string(); 107 formattedWrite(path, "%s-%s","./wal",id); 108 return path.data; 109 }