1 // Copyright (c) 2009 Satoshi Nakamoto
\r
2 // Distributed under the MIT/X11 software license, see the accompanying
\r
3 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
\r
8 class CDiskBlockIndex;
\r
16 extern map<string, string> mapAddressBook;
\r
17 extern bool fClient;
\r
21 extern void DBFlush(bool fShutdown);
\r
31 vector<DbTxn*> vTxn;
\r
33 explicit CDB(const char* pszFile, const char* pszMode="r+", bool fTxn=false);
\r
39 void operator=(const CDB&);
\r
42 template<typename K, typename T>
\r
43 bool Read(const K& key, T& value)
\r
49 CDataStream ssKey(SER_DISK);
\r
50 ssKey.reserve(1000);
\r
52 Dbt datKey(&ssKey[0], ssKey.size());
\r
56 datValue.set_flags(DB_DBT_MALLOC);
\r
57 int ret = pdb->get(GetTxn(), &datKey, &datValue, 0);
\r
58 memset(datKey.get_data(), 0, datKey.get_size());
\r
59 if (datValue.get_data() == NULL)
\r
62 // Unserialize value
\r
63 CDataStream ssValue((char*)datValue.get_data(), (char*)datValue.get_data() + datValue.get_size(), SER_DISK);
\r
66 // Clear and free memory
\r
67 memset(datValue.get_data(), 0, datValue.get_size());
\r
68 free(datValue.get_data());
\r
72 template<typename K, typename T>
\r
73 bool Write(const K& key, const T& value, bool fOverwrite=true)
\r
79 CDataStream ssKey(SER_DISK);
\r
80 ssKey.reserve(1000);
\r
82 Dbt datKey(&ssKey[0], ssKey.size());
\r
85 CDataStream ssValue(SER_DISK);
\r
86 ssValue.reserve(10000);
\r
88 Dbt datValue(&ssValue[0], ssValue.size());
\r
91 int ret = pdb->put(GetTxn(), &datKey, &datValue, (fOverwrite ? 0 : DB_NOOVERWRITE));
\r
93 // Clear memory in case it was a private key
\r
94 memset(datKey.get_data(), 0, datKey.get_size());
\r
95 memset(datValue.get_data(), 0, datValue.get_size());
\r
99 template<typename K>
\r
100 bool Erase(const K& key)
\r
106 CDataStream ssKey(SER_DISK);
\r
107 ssKey.reserve(1000);
\r
109 Dbt datKey(&ssKey[0], ssKey.size());
\r
112 int ret = pdb->del(GetTxn(), &datKey, 0);
\r
115 memset(datKey.get_data(), 0, datKey.get_size());
\r
116 return (ret == 0 || ret == DB_NOTFOUND);
\r
119 template<typename K>
\r
120 bool Exists(const K& key)
\r
126 CDataStream ssKey(SER_DISK);
\r
127 ssKey.reserve(1000);
\r
129 Dbt datKey(&ssKey[0], ssKey.size());
\r
132 int ret = pdb->exists(GetTxn(), &datKey, 0);
\r
135 memset(datKey.get_data(), 0, datKey.get_size());
\r
143 Dbc* pcursor = NULL;
\r
144 int ret = pdb->cursor(NULL, &pcursor, 0);
\r
150 int ReadAtCursor(Dbc* pcursor, CDataStream& ssKey, CDataStream& ssValue, unsigned int fFlags=DB_NEXT)
\r
154 if (fFlags == DB_SET || fFlags == DB_SET_RANGE || fFlags == DB_GET_BOTH || fFlags == DB_GET_BOTH_RANGE)
\r
156 datKey.set_data(&ssKey[0]);
\r
157 datKey.set_size(ssKey.size());
\r
160 if (fFlags == DB_GET_BOTH || fFlags == DB_GET_BOTH_RANGE)
\r
162 datValue.set_data(&ssValue[0]);
\r
163 datValue.set_size(ssValue.size());
\r
165 datKey.set_flags(DB_DBT_MALLOC);
\r
166 datValue.set_flags(DB_DBT_MALLOC);
\r
167 int ret = pcursor->get(&datKey, &datValue, fFlags);
\r
170 else if (datKey.get_data() == NULL || datValue.get_data() == NULL)
\r
173 // Convert to streams
\r
174 ssKey.SetType(SER_DISK);
\r
176 ssKey.write((char*)datKey.get_data(), datKey.get_size());
\r
177 ssValue.SetType(SER_DISK);
\r
179 ssValue.write((char*)datValue.get_data(), datValue.get_size());
\r
181 // Clear and free memory
\r
182 memset(datKey.get_data(), 0, datKey.get_size());
\r
183 memset(datValue.get_data(), 0, datValue.get_size());
\r
184 free(datKey.get_data());
\r
185 free(datValue.get_data());
\r
192 return vTxn.back();
\r
202 DbTxn* ptxn = NULL;
\r
203 int ret = dbenv.txn_begin(GetTxn(), &ptxn, 0);
\r
204 if (!ptxn || ret != 0)
\r
206 vTxn.push_back(ptxn);
\r
216 int ret = vTxn.back()->commit(0);
\r
227 int ret = vTxn.back()->abort();
\r
232 bool ReadVersion(int& nVersion)
\r
235 return Read(string("version"), nVersion);
\r
238 bool WriteVersion(int nVersion)
\r
240 return Write(string("version"), nVersion);
\r
251 class CTxDB : public CDB
\r
254 CTxDB(const char* pszMode="r+", bool fTxn=false) : CDB(!fClient ? "blkindex.dat" : NULL, pszMode, fTxn) { }
\r
256 CTxDB(const CTxDB&);
\r
257 void operator=(const CTxDB&);
\r
259 bool ReadTxIndex(uint256 hash, CTxIndex& txindex);
\r
260 bool UpdateTxIndex(uint256 hash, const CTxIndex& txindex);
\r
261 bool AddTxIndex(const CTransaction& tx, const CDiskTxPos& pos, int nHeight);
\r
262 bool EraseTxIndex(const CTransaction& tx);
\r
263 bool ContainsTx(uint256 hash);
\r
264 bool ReadOwnerTxes(uint160 hash160, int nHeight, vector<CTransaction>& vtx);
\r
265 bool ReadDiskTx(uint256 hash, CTransaction& tx, CTxIndex& txindex);
\r
266 bool ReadDiskTx(uint256 hash, CTransaction& tx);
\r
267 bool ReadDiskTx(COutPoint outpoint, CTransaction& tx, CTxIndex& txindex);
\r
268 bool ReadDiskTx(COutPoint outpoint, CTransaction& tx);
\r
269 bool WriteBlockIndex(const CDiskBlockIndex& blockindex);
\r
270 bool EraseBlockIndex(uint256 hash);
\r
271 bool ReadHashBestChain(uint256& hashBestChain);
\r
272 bool WriteHashBestChain(uint256 hashBestChain);
\r
273 bool LoadBlockIndex();
\r
280 class CReviewDB : public CDB
\r
283 CReviewDB(const char* pszMode="r+", bool fTxn=false) : CDB("reviews.dat", pszMode, fTxn) { }
\r
285 CReviewDB(const CReviewDB&);
\r
286 void operator=(const CReviewDB&);
\r
288 bool ReadUser(uint256 hash, CUser& user)
\r
290 return Read(make_pair(string("user"), hash), user);
\r
293 bool WriteUser(uint256 hash, const CUser& user)
\r
295 return Write(make_pair(string("user"), hash), user);
\r
298 bool ReadReviews(uint256 hash, vector<CReview>& vReviews);
\r
299 bool WriteReviews(uint256 hash, const vector<CReview>& vReviews);
\r
306 class CMarketDB : public CDB
\r
309 CMarketDB(const char* pszMode="r+", bool fTxn=false) : CDB("market.dat", pszMode, fTxn) { }
\r
311 CMarketDB(const CMarketDB&);
\r
312 void operator=(const CMarketDB&);
\r
319 class CAddrDB : public CDB
\r
322 CAddrDB(const char* pszMode="r+", bool fTxn=false) : CDB("addr.dat", pszMode, fTxn) { }
\r
324 CAddrDB(const CAddrDB&);
\r
325 void operator=(const CAddrDB&);
\r
327 bool WriteAddress(const CAddress& addr);
\r
328 bool LoadAddresses();
\r
331 bool LoadAddresses();
\r
337 class CWalletDB : public CDB
\r
340 CWalletDB(const char* pszMode="r+", bool fTxn=false) : CDB("wallet.dat", pszMode, fTxn) { }
\r
342 CWalletDB(const CWalletDB&);
\r
343 void operator=(const CWalletDB&);
\r
345 bool ReadName(const string& strAddress, string& strName)
\r
348 return Read(make_pair(string("name"), strAddress), strName);
\r
351 bool WriteName(const string& strAddress, const string& strName)
\r
353 mapAddressBook[strAddress] = strName;
\r
354 return Write(make_pair(string("name"), strAddress), strName);
\r
357 bool EraseName(const string& strAddress)
\r
359 mapAddressBook.erase(strAddress);
\r
360 return Erase(make_pair(string("name"), strAddress));
\r
363 bool ReadTx(uint256 hash, CWalletTx& wtx)
\r
365 return Read(make_pair(string("tx"), hash), wtx);
\r
368 bool WriteTx(uint256 hash, const CWalletTx& wtx)
\r
370 return Write(make_pair(string("tx"), hash), wtx);
\r
373 bool EraseTx(uint256 hash)
\r
375 return Erase(make_pair(string("tx"), hash));
\r
378 bool ReadKey(const vector<unsigned char>& vchPubKey, CPrivKey& vchPrivKey)
\r
380 vchPrivKey.clear();
\r
381 return Read(make_pair(string("key"), vchPubKey), vchPrivKey);
\r
384 bool WriteKey(const vector<unsigned char>& vchPubKey, const CPrivKey& vchPrivKey)
\r
386 return Write(make_pair(string("key"), vchPubKey), vchPrivKey, false);
\r
389 bool ReadDefaultKey(vector<unsigned char>& vchPubKey)
\r
392 return Read(string("defaultkey"), vchPubKey);
\r
395 bool WriteDefaultKey(const vector<unsigned char>& vchPubKey)
\r
397 return Write(string("defaultkey"), vchPubKey);
\r
400 template<typename T>
\r
401 bool ReadSetting(const string& strKey, T& value)
\r
403 return Read(make_pair(string("setting"), strKey), value);
\r
406 template<typename T>
\r
407 bool WriteSetting(const string& strKey, const T& value)
\r
409 return Write(make_pair(string("setting"), strKey), value);
\r
412 bool LoadWallet(vector<unsigned char>& vchDefaultKeyRet);
\r
417 inline bool SetAddressBookName(const string& strAddress, const string& strName)
\r
419 return CWalletDB().WriteName(strAddress, strName);
\r