Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

DAGDBFile.cpp

Go to the documentation of this file.
00001 
00037 #include "DAGDBFile.h"
00038 #include "ShockGraph.h"
00039 #include "GestureGraph.h"
00040 #include "Exceptions.h"
00041 
00042 #define UNK_GRAPH                       0
00043 #define SHOCK_GRAPH                     1
00044 #define GESTURE_GRAPH           2
00045 
00046 
00047 int DAGDBFile::GetClassID(const String& strClassName) const
00048 {
00049         if (strClassName == "ShockGraph")
00050                 return SHOCK_GRAPH;
00051         else if (strClassName == "GestureGraph")
00052                 return GESTURE_GRAPH;
00053         
00054         DBG_MSG1("Warning: Unknown graph class", strClassName);
00055         return UNK_GRAPH;
00056 }
00057 
00058 DAG* DAGDBFile::CreateDAGObj(int nClassID) const
00059 {
00060         switch (nClassID)
00061         {
00062                 case SHOCK_GRAPH:
00063                         return new ShockGraph;
00064                 case GESTURE_GRAPH:
00065                         return new GestureGraph;
00066         }
00067 
00068         DBG_MSG1("Warning: Unknown class ID", nClassID);
00069         return NULL;
00070 }
00071 
00073 void DAGDBFile::open(const char* szName, ios_base::openmode nMode)
00074 {
00075         ASSERT(!IsDBModified());
00076 
00077         // append cannot be specified because we need to overwrite
00078         // the tail info!
00079         if (nMode & ios_base::app)
00080         {
00081                 nMode &= ~ios_base::app;
00082                 nMode |= ios_base::out;
00083         }
00084 
00085         nMode |= ios_base::in; // We always need to read the tail info
00086 
00087         m_strFileName = szName;
00088         fstream::open(szName, nMode);
00089 
00090         if (!fail())
00091         {
00092                 if (!ReadTailInfo())
00093                 {
00094                         if (!(nMode & ios_base::out))
00095                         {
00096                                 fstream::close();
00097                                 nMode |= ios_base::out;
00098                                 fstream::open(szName, nMode);
00099                         }
00100 
00101                         DBG_MSG("Warning: DB tail info has to be rebuilt.");
00102                         
00103                         if (!RebuildTailInfo())
00104                                 THROW_EXCEPTION("Cannot read database info.");
00105                 }
00106         }
00107 }
00108 
00110 void DAGDBFile::close()
00111 {
00112         if (IsDBModified())
00113                 WriteTailInfo();
00114 
00115         m_nDBSize = 0;
00116         SetDBModified(false);
00117         m_strFileName.Clear();
00118         DBInfo().Clear();
00119         m_dagInfo.Clear();
00120 
00121         fstream::close();
00122 }
00123 
00124 bool DAGDBFile::ReadTailInfo()
00125 {
00126         ASSERT(is_open());
00127         ASSERT(!IsDBModified());
00128 
00129         MoveToEnd();
00130         m_nDBSize = tellg();
00131 
00132         if (m_nDBSize > 0)
00133         {
00134                 MoveTo(m_nDBSize - sizeof(DBINFO));
00135                 
00136                 read((char*) m_pDBInfo, sizeof(DBINFO));
00137 
00138                 ASSERT(gcount() == sizeof(DBINFO));
00139 
00140                 if (!DBInfo().IsValid())
00141                         return false;
00142 
00143                 MoveTo(DBInfo().m_nTailOffset);
00144                 m_dagInfo.Read(*this);
00145         }
00146 
00147         return true;
00148 }
00149 
00150 void DAGDBFile::WriteTailInfo()
00151 {
00152         seekp(DBInfo().m_nTailOffset);
00153 
00154         DBInfo().MakeValid();
00155 
00156         m_dagInfo.Write(*this);
00157         
00158         write((char*) m_pDBInfo, sizeof(DBINFO));
00159         flush();
00160 
00161         SetDBModified(false);
00162 }
00163 
00164 DAGPtr DAGDBFile::ReadDAG(int nDagId, bool bOnlyDataForMatching /*= false*/)
00165 {
00166         ASSERT(nDagId < m_dagInfo.GetSize());
00167 
00168         DAGPtr ptrDag;
00169         DAGINFO info = m_dagInfo[nDagId];
00170         
00171         ASSERT(info.nOffset < DBInfo().m_nTailOffset);
00172         MoveTo(info.nOffset);
00173 
00174         ptrDag = CreateDAGObj(info.nType);
00175         ASSERT(!ptrDag.IsNull());
00176         
00177         try {
00178                 ptrDag->Read(*this, bOnlyDataForMatching);
00179         }
00180         catch(ExceptionInfo e)
00181         {
00182                 e.Print();
00183                 return (DAG*)NULL;
00184         }
00185 
00186         ptrDag->SetDAGId(nDagId);
00187 
00188         return ptrDag;
00189 }
00190 
00191 DAGPtr DAGDBFile::ReadDAG(streamoff nDagOffset, const String& strClassName)
00192 {
00193         DAGPtr ptrDag;
00194 
00195         ptrDag = CreateDAGObj(GetClassID(strClassName));
00196 
00197         if (!ptrDag.IsNull())
00198         {
00199                 ASSERT(nDagOffset < DBInfo().m_nTailOffset);
00200                 MoveTo(nDagOffset);
00201 
00202                 try {
00203                         ptrDag->Read(*this);
00204                 }
00205                 catch(ExceptionInfo e)
00206                 {
00207                         e.Print();
00208                         return (DAG*)NULL;
00209                 }
00210         }
00211 
00212         return ptrDag;
00213 }
00214 
00215 bool DAGDBFile::AddDAG(const DAG* pDag, bool bReadSaveTailInfo)
00216 {
00217         DAGINFO info;
00218 
00219         if (bReadSaveTailInfo)
00220                 ReadTailInfo();
00221 
00222         info.nType = GetClassID(pDag->ClassName());
00223         ASSERT(info.nType != UNK_GRAPH);
00224 
00225         info.nOffset = DBInfo().m_nTailOffset;
00226         seekp(DBInfo().m_nTailOffset);
00227 
00228         pDag->Write(*this);
00229         DBInfo().m_nTailOffset = tellp();
00230 
00231         m_dagInfo.AddTail(info);
00232 
00233         if (pDag->GetMaxTSVDimension() > DBInfo().m_nMaxTSVDimension)
00234                 DBInfo().m_nMaxTSVDimension = pDag->GetMaxTSVDimension();
00235 
00236         SetDBModified(true);
00237         flush();
00238 
00239         if (bReadSaveTailInfo)
00240                 WriteTailInfo();
00241 
00242         return true;
00243 }
00244 
00245 bool DAGDBFile::RebuildTailInfo()
00246 {
00247         String strClassName;
00248         streampos pos;
00249         DAGPtr ptrDag;
00250         DAGINFO dagInfo;
00251 
00252         MoveToEnd();
00253         DBInfo().m_nTailOffset = tellg();
00254         DBInfo().m_nMaxTSVDimension = 0;
00255 
00256         MoveToBeg();
00257 
00258         while(!fail())
00259         {
00260                 pos = tellg();
00261                 strClassName.Read(*this);
00262 
00263                 ptrDag = ReadDAG(pos, strClassName);
00264 
00265                 if (ptrDag.IsNull())
00266                         break;
00267 
00268                 dagInfo.nOffset = pos;
00269                 dagInfo.nType = GetClassID(strClassName);
00270 
00271                 m_dagInfo.AddTail(dagInfo);
00272 
00273                 if (ptrDag->GetMaxTSVDimension() > DBInfo().m_nMaxTSVDimension)
00274                         DBInfo().m_nMaxTSVDimension = ptrDag->GetMaxTSVDimension();
00275         }
00276 
00277         return SetDBModified(m_dagInfo.GetSize() > 0);
00278 }
00279 

Generated on Sat Nov 13 11:21:22 2004 for Noisy DAG Matcher by doxygen1.2.18