Log cache can be disabled
[TortoiseGit.git] / src / TortoiseProc / gitlogcache.h
blob61f0e5efd2a7531336df222bf1f2c2b338042e19
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2013 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #pragma once
21 #include "Git.h"
22 #include "TGitPath.h"
23 #include "GitRev.h"
24 #include "GitHash.h"
26 #define LOG_INDEX_MAGIC 0x88AA5566
27 #define LOG_DATA_MAGIC 0x99BB0FFF
28 #define LOG_DATA_ITEM_MAGIC 0x0FCC9ACC
29 #define LOG_DATA_FILE_MAGIC 0x19EE9DFF
30 #define LOG_INDEX_VERSION 0xF
32 #pragma pack (1)
33 struct SLogCacheIndexHeader
35 DWORD m_Magic;
36 DWORD m_Version;
37 DWORD m_ItemCount;
40 struct SLogCacheIndexItem
42 CGitHash m_Hash;
43 ULONGLONG m_Offset;
46 struct SLogCacheIndexFile
48 struct SLogCacheIndexHeader m_Header;
49 struct SLogCacheIndexItem m_Item[1]; //dynmatic size
52 struct SLogCacheRevFileHeader
54 DWORD m_Magic;
55 DWORD m_Version;
56 DWORD m_Action;
57 DWORD m_Stage;
58 DWORD m_ParentNo;
59 DWORD m_Add;
60 DWORD m_Del;
61 DWORD m_FileNameSize;
62 DWORD m_OldFileNameSize;
63 TCHAR m_FileName[1];
65 # pragma pack ()
67 struct SLogCacheRevItemHeader
69 DWORD m_Magic;
70 DWORD m_Version;
71 DWORD m_FileCount;
74 struct SLogCacheDataFileHeader
76 DWORD m_Magic;
77 DWORD m_Version;
80 class CGitHashMap:public std::map<CGitHash,GitRev>
82 public:
83 bool IsExist(CGitHash &hash)
85 return find(hash) != end();
89 #define INDEX_FILE_NAME _T("tortoisegit.index")
90 #define DATA_FILE_NAME _T("tortoisegit.data")
91 #define LOCK_FILE_NAME _T("tortoisegit.lock")
94 class CLogCache
96 public:
98 protected:
99 BOOL m_bEnabled;
101 HANDLE m_IndexFile;
102 HANDLE m_IndexFileMap;
103 SLogCacheIndexFile *m_pCacheIndex;
107 HANDLE m_DataFile;
108 HANDLE m_DataFileMap;
109 BYTE *m_pCacheData;
110 DWORD m_DataFileLength;
112 void CloseDataHandles();
113 void CloseIndexHandles();
114 void Sort();
116 BOOL CheckHeader(SLogCacheIndexHeader *header)
118 __try
120 if(header->m_Magic != LOG_INDEX_MAGIC)
121 return FALSE;
123 if(header->m_Version != LOG_INDEX_VERSION)
124 return FALSE;
126 return TRUE;
128 __finally
131 return FALSE;
134 BOOL CheckHeader(SLogCacheRevFileHeader *header)
136 __try
138 if(header->m_Magic != LOG_DATA_FILE_MAGIC)
139 return FALSE;
141 if(header->m_Version != LOG_INDEX_VERSION)
142 return FALSE;
144 return TRUE;
146 __finally
149 return FALSE;
152 BOOL CheckHeader(SLogCacheRevItemHeader *header)
154 __try
156 if(header->m_Magic != LOG_DATA_ITEM_MAGIC)
157 return FALSE;
159 if(header->m_Version != LOG_INDEX_VERSION)
160 return FALSE;
162 return TRUE;
164 __finally
167 return FALSE;
170 BOOL CheckHeader(SLogCacheDataFileHeader *header)
172 __try
174 if(header->m_Magic != LOG_DATA_MAGIC)
175 return FALSE;
177 if(header->m_Version != LOG_INDEX_VERSION)
178 return FALSE;
180 return TRUE;
182 __finally
185 return FALSE;
188 int SaveOneItem(GitRev &Rev, LONG offset);
190 CString m_GitDir;
191 int RebuildCacheFile();
193 public:
194 CLogCache();
195 ~CLogCache();
196 int FetchCacheIndex(CString GitDir);
197 int LoadOneItem(GitRev &Rev,ULONGLONG offset);
198 ULONGLONG GetOffset(CGitHash &hash, SLogCacheIndexFile *pData =NULL);
200 CGitHashMap m_HashMap;
202 GitRev * GetCacheData(CGitHash &Rev);
203 int AddCacheEntry(GitRev &Rev);
204 int SaveCache();
206 int ClearAllParent();