OSDN Git Service

Add Log Cache Code
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogCache.cpp
1 #include "stdafx.h"\r
2 #include "GitLogCache.h"\r
3 \r
4 CLogCache::CLogCache()\r
5 {\r
6 \r
7 }\r
8 \r
9 CLogCache::~CLogCache()\r
10 {\r
11         this->m_IndexFile.Close();\r
12         this->m_DataFile.Close();\r
13 }\r
14 \r
15 int CLogCache::FetchCache(CString GitDir)\r
16 {\r
17         if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
18         {\r
19                 BOOL b=m_IndexFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
20                                                 CFile::modeRead|CFile::shareDenyNone|\r
21                                                 CFile::modeNoTruncate|CFile::modeCreate);\r
22                 if(!b)\r
23                         return -1;\r
24         }\r
25 \r
26         SLogCacheIndexHeader header;\r
27         UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));\r
28         if(count != sizeof(SLogCacheIndexHeader))\r
29                 return -2;\r
30 \r
31         if( header.m_Magic != LOG_INDEX_MAGIC )\r
32                 return -3;\r
33 \r
34         if( header.m_Version != LOG_INDEX_VERSION )\r
35                 return -4;\r
36 \r
37 \r
38         SLogCacheItem Item;\r
39 \r
40         for(int i=0;i<header.m_ItemCount;i++)\r
41         {\r
42                 count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem));    \r
43                 if(count != sizeof(SLogCacheItem)\r
44                         break;\r
45 \r
46                 CString str;\r
47                 g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);\r
48                 this->m_HashMapIndex[str]=Item.m_Offset;\r
49         }\r
50 \r
51         return 0;\r
52 }\r
53 \r
54 int CLogCache::SaveOneItem(GitRev &Rev)\r
55 {\r
56         \r
57 }\r
58 \r
59 int CLogCache::LoadOneItem(GitRev &Rev,UINT offset)\r
60 {\r
61         SLogCacheRevItemHeader header;\r
62         m_DataFile.Seek(offset,CFile::begin);\r
63 \r
64         if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
65         {\r
66                 BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
67                                                 CFile::modeRead|CFile::shareDenyNone|\r
68                                                 CFile::modeNoTruncate|CFile::modeCreate);\r
69                 if(!b)\r
70                         return -1;\r
71         }\r
72 \r
73         UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevItemHeader));\r
74         if( count != sizeof(SLogCacheRevItemHeader))\r
75                 return -1;\r
76         if( !CheckHeader(header))\r
77                 return -2;\r
78         \r
79         CGitByteArray stream;\r
80 \r
81         stream.resize(header.m_RevSize-sizeof(SLogCacheRevItemHeader));\r
82 \r
83         count=m_DataFile.Read(&stream[0],stream.size());\r
84         if( count != stream.size)\r
85                 return;\r
86 \r
87         \r
88 \r
89 \r
90         \r
91 }