From ea7a6070439e85db5afcee399b920c975f4ea7d2 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 5 Jan 2015 23:19:57 +0000 Subject: very-very first version (create, open, check headers) git-svn-id: http://svn.miranda-ng.org/main/trunk@11777 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Dbx_mdb/src/dbmodulechain.cpp | 120 ++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 plugins/Dbx_mdb/src/dbmodulechain.cpp (limited to 'plugins/Dbx_mdb/src/dbmodulechain.cpp') diff --git a/plugins/Dbx_mdb/src/dbmodulechain.cpp b/plugins/Dbx_mdb/src/dbmodulechain.cpp new file mode 100644 index 0000000000..33cb289561 --- /dev/null +++ b/plugins/Dbx_mdb/src/dbmodulechain.cpp @@ -0,0 +1,120 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org) +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +void CDbxMdb::AddToList(char *name, DWORD ofs) +{ + ModuleName *mn = (ModuleName*)HeapAlloc(m_hModHeap, 0, sizeof(ModuleName)); + mn->name = name; + mn->ofs = ofs; + + m_lMods.insert(mn); + m_lOfs.insert(mn); +} + +int CDbxMdb::InitModuleNames(void) +{ + MDB_txn *txn; + mdb_txn_begin(m_pMdbEnv, NULL, 0, &txn); + mdb_open(txn, "mods", MDB_CREATE | MDB_DUPSORT | MDB_DUPFIXED, &m_dbModules); + + MDB_cursor *cursor; + mdb_cursor_open(txn, m_dbModules, &cursor); + + int rc, moduleId; + char moduleName[100]; + MDB_val key = { sizeof(int), &moduleId }, data = { sizeof(moduleName), moduleName }; + while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) + AddToList(moduleName, moduleId); + + mdb_cursor_close(cursor); + mdb_txn_abort(txn); + return 0; +} + +DWORD CDbxMdb::FindExistingModuleNameOfs(const char *szName) +{ + ModuleName mn = { (char*)szName, 0 }; + if (m_lastmn && !strcmp(mn.name, m_lastmn->name)) + return m_lastmn->ofs; + + int index = m_lMods.getIndex(&mn); + if (index != -1) { + ModuleName *pmn = m_lMods[index]; + m_lastmn = pmn; + return pmn->ofs; + } + + return 0; +} + +// will create the offset if it needs to +DWORD CDbxMdb::GetModuleNameOfs(const char *szName) +{ + DWORD ofsExisting = FindExistingModuleNameOfs(szName); + if (ofsExisting) + return ofsExisting; + + if (m_bReadOnly) + return 0; + + int nameLen = (int)strlen(szName); + + // need to create the module name + + // add to cache + char *mod = (char*)HeapAlloc(m_hModHeap, 0, nameLen + 1); + strcpy(mod, szName); + AddToList(mod, -1); + + // quit + return -1; +} + +char* CDbxMdb::GetModuleNameByOfs(DWORD ofs) +{ + if (m_lastmn && m_lastmn->ofs == ofs) + return m_lastmn->name; + + ModuleName mn = { NULL, ofs }; + int index = m_lOfs.getIndex(&mn); + if (index != -1) { + ModuleName *pmn = m_lOfs[index]; + m_lastmn = pmn; + return pmn->name; + } + + return NULL; +} + +STDMETHODIMP_(BOOL) CDbxMdb::EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam) +{ + for (int i = 0; i < m_lMods.getCount(); i++) { + ModuleName *pmn = m_lMods[i]; + int ret = pFunc(pmn->name, pmn->ofs, (LPARAM)pParam); + if (ret) + return ret; + } + return 0; +} -- cgit v1.2.3