Change Log Code structure Unfinished
[TortoiseGit.git] / src / TortoiseProc / GitLogCache.cpp
blob8b0458c220a91874dbe4e32e1c9fa76519fe25fa
1 #include "stdafx.h"
2 #include "GitLogCache.h"
4 CLogCache::CLogCache()
9 CLogCache::~CLogCache()
11 //this->m_IndexFile.Close();
12 //this->m_DataFile.Close();
14 int CLogCache::AddCacheEntry(GitRev &Rev)
16 this->m_HashMap[Rev.m_CommitHash] = Rev;
17 return 0;
20 int CLogCache::GetCacheData(GitRev &Rev)
22 if(this->m_HashMapIndex.find(Rev.m_CommitHash)==m_HashMapIndex.end())
24 if(this->m_HashMap.IsExist(Rev.m_CommitHash))
26 Rev.CopyFrom(m_HashMap[Rev.m_CommitHash]);
27 return 0;
29 return -1;
31 else
33 return LoadOneItem(Rev,m_HashMapIndex[Rev.m_CommitHash]);
35 return 0;
37 int CLogCache::FetchCacheIndex(CString GitDir)
40 if(this->m_IndexFile.m_hFile == CFile::hFileNull)
42 BOOL b=m_IndexFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
43 CFile::modeRead|CFile::shareDenyNone|
44 CFile::modeNoTruncate|CFile::modeCreate);
45 if(!b)
46 return -1;
48 //Cache has been fetched.
49 //if(m_GitDir == GitDir)
50 // return 0;
52 m_GitDir=GitDir;
53 m_IndexFile.SeekToBegin();
55 SLogCacheIndexHeader header;
56 UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));
57 if(count != sizeof(SLogCacheIndexHeader))
58 return -2;
60 if( header.m_Magic != LOG_INDEX_MAGIC )
61 return -3;
63 if( header.m_Version != LOG_INDEX_VERSION )
64 return -4;
67 SLogCacheItem Item;
69 //for(int i=0;i<header.m_ItemCount;i++)
70 this->m_HashMapIndex.clear();
72 while(1)
74 count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem));
75 if( count != sizeof(SLogCacheItem) )
76 break;
78 this->m_HashMapIndex[Item.m_Hash]=Item.m_Offset;
81 return 0;
84 int CLogCache::SaveOneItem(GitRev &Rev,ULONGLONG offset)
87 SLogCacheRevItemHeader header;
88 m_DataFile.Seek(offset,CFile::begin);
90 if(this->m_DataFile.m_hFile == CFile::hFileNull)
92 BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
93 CFile::modeRead|CFile::shareDenyNone|
94 CFile::modeNoTruncate|CFile::modeCreate);
95 if(!b)
96 return -1;
99 header.m_Magic=LOG_DATA_ITEM_MAGIC;
100 header.m_Version=LOG_INDEX_VERSION;
101 header.m_FileCount=Rev.m_Files.GetCount();
103 m_DataFile.Write(&header,sizeof(SLogCacheRevItemHeader));
105 CArchive ar(&m_DataFile, CArchive::store);
107 ar<<Rev.m_AuthorName;
108 ar<<Rev.m_AuthorEmail;
109 ar<<Rev.m_AuthorDate;
110 ar<<Rev.m_CommitterName;
111 ar<<Rev.m_CommitterEmail;
112 ar<<Rev.m_CommitterDate;
113 ar<<Rev.m_Subject;
114 ar<<Rev.m_Body;
115 ar<<Rev.m_CommitHash;
116 ar<<Rev.m_Action;
118 for(int i=0;i<Rev.m_Files.GetCount();i++)
120 SLogCacheRevFileHeader header;
121 header.m_Magic=LOG_DATA_FILE_MAGIC;
122 header.m_Version=LOG_INDEX_VERSION;
124 ar<<header.m_Magic;
125 ar<<header.m_Version;
126 ar<<Rev.m_Files[i].GetGitPathString();
127 ar<<Rev.m_Files[i].GetGitOldPathString();
128 ar<<Rev.m_Files[i].m_Action;
129 ar<<Rev.m_Files[i].m_Stage;
130 ar<<Rev.m_Files[i].m_StatAdd;
131 ar<<Rev.m_Files[i].m_StatDel;
134 return 0;
137 int CLogCache::LoadOneItem(GitRev &Rev,ULONGLONG offset)
139 SLogCacheRevItemHeader header;
141 if(this->m_DataFile.m_hFile == CFile::hFileNull)
143 BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,
144 CFile::modeRead|CFile::shareDenyNone|
145 CFile::modeNoTruncate|CFile::modeCreate);
146 if(!b)
147 return -1;
149 m_DataFile.Seek(offset,CFile::begin);
151 UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevItemHeader));
152 if( count != sizeof(SLogCacheRevItemHeader))
153 return -1;
154 if( !CheckHeader(header))
155 return -2;
158 CArchive ar(&m_DataFile, CArchive::load);
160 ar>>Rev.m_AuthorName;
161 ar>>Rev.m_AuthorEmail;
162 ar>>Rev.m_AuthorDate;
163 ar>>Rev.m_CommitterName;
164 ar>>Rev.m_CommitterEmail;
165 ar>>Rev.m_CommitterDate;
166 ar>>Rev.m_Subject;
167 ar>>Rev.m_Body;
168 ar>>Rev.m_CommitHash;
169 ar>>Rev.m_Action;
171 Rev.m_Files.Clear();
173 for(int i=0;i<header.m_FileCount;i++)
175 CTGitPath path;
176 CString file,oldfile;
177 path.Reset();
178 SLogCacheRevFileHeader header;
180 ar>>header.m_Magic;
181 ar>>header.m_Version;
183 if( this->CheckHeader(header) )
184 return -1;
185 ar>>file;
186 ar>>oldfile;
187 path.SetFromGit(file,&oldfile);
189 ar>>path.m_Action;
190 ar>>path.m_Stage;
191 ar>>path.m_StatAdd;
192 ar>>path.m_StatDel;
195 Rev.m_Files.AddPath(path);
197 return 0;
199 int CLogCache::RebuildCacheFile()
201 m_IndexFile.SetLength(0);
202 m_DataFile.SetLength(0);
204 SLogCacheIndexHeader header;
205 header.m_Magic=LOG_INDEX_MAGIC;
206 header.m_Version=LOG_INDEX_VERSION;
207 m_IndexFile.SeekToBegin();
208 m_IndexFile.Write(&header,sizeof(SLogCacheIndexHeader));
212 SLogCacheRevFileHeader header;
213 header.m_Magic=LOG_DATA_MAGIC;
214 header.m_Version=LOG_INDEX_VERSION;
216 m_DataFile.SeekToBegin();
217 m_DataFile.Write(&header,sizeof(SLogCacheRevFileHeader));
219 return 0;
221 int CLogCache::SaveCache()
223 if( this->m_HashMap.size() == 0 )
224 return 0;
226 bool bIsRebuild=false;
227 if(this->m_DataFile.m_hFile != CFile::hFileNull)
228 m_DataFile.Close();
229 if(this->m_IndexFile.m_hFile!=CFile::hFileNull)
230 m_IndexFile.Close();
232 if(this->m_IndexFile.m_hFile == CFile::hFileNull)
234 BOOL b=m_IndexFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
235 CFile::modeReadWrite|CFile::shareDenyWrite|
236 CFile::modeNoTruncate|CFile::modeCreate);
237 if(!b)
238 return -1;
241 if(this->m_DataFile.m_hFile == CFile::hFileNull)
243 BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,
244 CFile::modeReadWrite|CFile::shareDenyWrite|
245 CFile::modeNoTruncate|CFile::modeCreate);
248 if(!b)
250 m_IndexFile.Close();
251 return -1;
256 SLogCacheIndexHeader header;
257 memset(&header,0,sizeof(SLogCacheIndexHeader));
258 UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));
259 if(count != sizeof(SLogCacheIndexHeader) || !this->CheckHeader(header))
260 {// new file
261 RebuildCacheFile();
262 bIsRebuild=true;
268 SLogCacheRevFileHeader header;
270 UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevFileHeader));
271 if( count != sizeof(SLogCacheRevFileHeader) || !CheckHeader(header))
273 RebuildCacheFile();
274 bIsRebuild=true;
279 m_DataFile.SeekToEnd();
280 m_IndexFile.SeekToEnd();
281 CGitHashMap::iterator i;
282 for(i=m_HashMap.begin();i!=m_HashMap.end();i++)
284 if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)
286 if((*i).second.m_IsFull)
288 ULONGLONG offset = m_DataFile.GetPosition();
289 this->SaveOneItem((*i).second,offset);
291 SLogCacheItem item;
292 item.m_Hash = (*i).second.m_CommitHash;
293 item.m_Offset=offset;
295 m_IndexFile.Write(&item,sizeof(SLogCacheItem));
299 m_IndexFile.Close();
300 m_DataFile.Close();
301 return 0;