\r
CLogCache::~CLogCache()\r
{\r
- this->m_IndexFile.Close();\r
- this->m_DataFile.Close();\r
+ //this->m_IndexFile.Close();\r
+ //this->m_DataFile.Close();\r
+}\r
+int CLogCache::AddCacheEntry(GitRev &Rev)\r
+{\r
+ this->m_HashMap[Rev.m_CommitHash] = Rev;\r
+ return 0;\r
}\r
\r
-int CLogCache::FetchCache(CString GitDir)\r
+GitRev * CLogCache::GetCacheData(CGitHash &hash)\r
+{\r
+ if(this->m_HashMapIndex.find(hash)==m_HashMapIndex.end())\r
+ {\r
+ if(this->m_HashMap.IsExist(hash))\r
+ {\r
+ return &m_HashMap[hash];\r
+ }\r
+ m_HashMap[hash].m_CommitHash=hash;\r
+ return &m_HashMap[hash];\r
+ }\r
+ else\r
+ {\r
+ GitRev rev;\r
+ if(!LoadOneItem(rev,m_HashMapIndex[hash]))\r
+ {\r
+ m_HashMap[hash].CopyFrom(rev);\r
+ m_HashMap[hash].m_IsFull=true;\r
+ \r
+ return &m_HashMap[hash];\r
+ }\r
+ }\r
+ m_HashMap[hash].m_CommitHash=hash;\r
+ return &m_HashMap[hash];\r
+}\r
+int CLogCache::FetchCacheIndex(CString GitDir)\r
{\r
+\r
if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
{\r
BOOL b=m_IndexFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
if(!b)\r
return -1;\r
}\r
+ //Cache has been fetched.\r
+ //if(m_GitDir == GitDir)\r
+ // return 0;\r
+\r
+ m_GitDir=GitDir;\r
+ m_IndexFile.SeekToBegin();\r
\r
SLogCacheIndexHeader header;\r
UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));\r
\r
SLogCacheItem Item;\r
\r
- for(int i=0;i<header.m_ItemCount;i++)\r
+ //for(int i=0;i<header.m_ItemCount;i++)\r
+ this->m_HashMapIndex.clear();\r
+\r
+ while(1)\r
{\r
count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem)); \r
if( count != sizeof(SLogCacheItem) )\r
break;\r
\r
- CString str;\r
- g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);\r
- this->m_HashMapIndex[str]=Item.m_Offset;\r
+ this->m_HashMapIndex[Item.m_Hash]=Item.m_Offset;\r
}\r
\r
return 0;\r
}\r
\r
-int CLogCache::SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
+int CLogCache::SaveOneItem(GitRev &Rev,ULONGLONG offset)\r
{\r
\r
SLogCacheRevItemHeader header;\r
\r
if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
{\r
- BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
+ BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
CFile::modeRead|CFile::shareDenyNone|\r
CFile::modeNoTruncate|CFile::modeCreate);\r
if(!b)\r
\r
ar<<header.m_Magic;\r
ar<<header.m_Version;\r
-\r
+ ar<<Rev.m_Files[i].GetGitPathString();\r
+ ar<<Rev.m_Files[i].GetGitOldPathString();\r
ar<<Rev.m_Files[i].m_Action;\r
ar<<Rev.m_Files[i].m_Stage;\r
ar<<Rev.m_Files[i].m_StatAdd;\r
ar<<Rev.m_Files[i].m_StatDel;\r
- ar<<Rev.m_Files[i].GetGitPathString();\r
+ \r
}\r
return 0;\r
}\r
\r
-int CLogCache::LoadOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
+int CLogCache::LoadOneItem(GitRev &Rev,ULONGLONG offset)\r
{\r
SLogCacheRevItemHeader header;\r
- m_DataFile.Seek(offset,CFile::begin);\r
\r
if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
{\r
- BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
+ BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,\r
CFile::modeRead|CFile::shareDenyNone|\r
CFile::modeNoTruncate|CFile::modeCreate);\r
if(!b)\r
return -1;\r
}\r
+ m_DataFile.Seek(offset,CFile::begin);\r
\r
UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevItemHeader));\r
if( count != sizeof(SLogCacheRevItemHeader))\r
for(int i=0;i<header.m_FileCount;i++)\r
{\r
CTGitPath path;\r
- CString file;\r
+ CString file,oldfile;\r
path.Reset();\r
SLogCacheRevFileHeader header;\r
\r
\r
if( this->CheckHeader(header) )\r
return -1;\r
+ ar>>file;\r
+ ar>>oldfile;\r
+ path.SetFromGit(file,&oldfile);\r
\r
ar>>path.m_Action;\r
ar>>path.m_Stage;\r
ar>>path.m_StatAdd;\r
ar>>path.m_StatDel;\r
- ar>>file;\r
- path.SetFromGit(file);\r
+ \r
+ \r
Rev.m_Files.AddPath(path);\r
}\r
return 0;\r
+}\r
+int CLogCache::RebuildCacheFile()\r
+{\r
+ m_IndexFile.SetLength(0);\r
+ m_DataFile.SetLength(0);\r
+ {\r
+ SLogCacheIndexHeader header;\r
+ header.m_Magic=LOG_INDEX_MAGIC;\r
+ header.m_Version=LOG_INDEX_VERSION;\r
+ m_IndexFile.SeekToBegin();\r
+ m_IndexFile.Write(&header,sizeof(SLogCacheIndexHeader));\r
+ }\r
+ \r
+ {\r
+ SLogCacheRevFileHeader header;\r
+ header.m_Magic=LOG_DATA_MAGIC;\r
+ header.m_Version=LOG_INDEX_VERSION;\r
+\r
+ m_DataFile.SeekToBegin();\r
+ m_DataFile.Write(&header,sizeof(SLogCacheRevFileHeader));\r
+ }\r
+ return 0;\r
+}\r
+int CLogCache::SaveCache()\r
+{\r
+ if( this->m_HashMap.size() == 0 )\r
+ return 0;\r
+\r
+ if( this->m_GitDir.IsEmpty())\r
+ return 0;\r
+\r
+ bool bIsRebuild=false;\r
+ if(this->m_DataFile.m_hFile != CFile::hFileNull)\r
+ m_DataFile.Close();\r
+ if(this->m_IndexFile.m_hFile!=CFile::hFileNull)\r
+ m_IndexFile.Close();\r
+\r
+ if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
+ {\r
+ BOOL b=m_IndexFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
+ CFile::modeReadWrite|CFile::shareDenyWrite|\r
+ CFile::modeNoTruncate|CFile::modeCreate);\r
+ if(!b)\r
+ return -1;\r
+ }\r
+\r
+ if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
+ {\r
+ BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,\r
+ CFile::modeReadWrite|CFile::shareDenyWrite|\r
+ CFile::modeNoTruncate|CFile::modeCreate);\r
+\r
+ \r
+ if(!b)\r
+ {\r
+ m_IndexFile.Close();\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ {\r
+ SLogCacheIndexHeader header;\r
+ memset(&header,0,sizeof(SLogCacheIndexHeader));\r
+ UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));\r
+ if(count != sizeof(SLogCacheIndexHeader) || !this->CheckHeader(header))\r
+ {// new file\r
+ RebuildCacheFile();\r
+ bIsRebuild=true;\r
+ }\r
+ }\r
+\r
+ {\r
+\r
+ SLogCacheRevFileHeader header;\r
+ \r
+ UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevFileHeader));\r
+ if( count != sizeof(SLogCacheRevFileHeader) || !CheckHeader(header))\r
+ {\r
+ RebuildCacheFile();\r
+ bIsRebuild=true;\r
+ }\r
+ \r
+ }\r
+\r
+ m_DataFile.SeekToEnd();\r
+ m_IndexFile.SeekToEnd();\r
+ CGitHashMap::iterator i;\r
+ for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
+ {\r
+ if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
+ {\r
+ if((*i).second.m_IsFull && !(*i).second.m_CommitHash.IsEmpty())\r
+ {\r
+ ULONGLONG offset = m_DataFile.GetPosition();\r
+ this->SaveOneItem((*i).second,offset);\r
+\r
+ SLogCacheItem item;\r
+ item.m_Hash = (*i).second.m_CommitHash;\r
+ item.m_Offset=offset;\r
+\r
+ m_IndexFile.Write(&item,sizeof(SLogCacheItem));\r
+ }\r
+ }\r
+ }\r
+ m_IndexFile.Close();\r
+ m_DataFile.Close();\r
+ return 0;\r
+}\r
+\r
+int CLogCache::ClearAllParent()\r
+{\r
+ CGitHashMap::iterator i;\r
+ for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
+ {\r
+ (*i).second.m_ParentHash.clear();\r
+ (*i).second.m_Lanes.clear();\r
+ }\r
+ return 0;\r
}
\ No newline at end of file