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 }