Caffe
db_lmdb.hpp
1 #ifdef USE_LMDB
2 #ifndef CAFFE_UTIL_DB_LMDB_HPP
3 #define CAFFE_UTIL_DB_LMDB_HPP
4 
5 #include <string>
6 #include <vector>
7 
8 #include "lmdb.h"
9 
10 #include "caffe/util/db.hpp"
11 
12 namespace caffe { namespace db {
13 
14 inline void MDB_CHECK(int mdb_status) {
15  CHECK_EQ(mdb_status, MDB_SUCCESS) << mdb_strerror(mdb_status);
16 }
17 
18 class LMDBCursor : public Cursor {
19  public:
20  explicit LMDBCursor(MDB_txn* mdb_txn, MDB_cursor* mdb_cursor)
21  : mdb_txn_(mdb_txn), mdb_cursor_(mdb_cursor), valid_(false) {
22  SeekToFirst();
23  }
24  virtual ~LMDBCursor() {
25  mdb_cursor_close(mdb_cursor_);
26  mdb_txn_abort(mdb_txn_);
27  }
28  virtual void SeekToFirst() { Seek(MDB_FIRST); }
29  virtual void Next() { Seek(MDB_NEXT); }
30  virtual string key() {
31  return string(static_cast<const char*>(mdb_key_.mv_data), mdb_key_.mv_size);
32  }
33  virtual string value() {
34  return string(static_cast<const char*>(mdb_value_.mv_data),
35  mdb_value_.mv_size);
36  }
37  virtual bool valid() { return valid_; }
38 
39  private:
40  void Seek(MDB_cursor_op op) {
41  int mdb_status = mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, op);
42  if (mdb_status == MDB_NOTFOUND) {
43  valid_ = false;
44  } else {
45  MDB_CHECK(mdb_status);
46  valid_ = true;
47  }
48  }
49 
50  MDB_txn* mdb_txn_;
51  MDB_cursor* mdb_cursor_;
52  MDB_val mdb_key_, mdb_value_;
53  bool valid_;
54 };
55 
56 class LMDBTransaction : public Transaction {
57  public:
58  explicit LMDBTransaction(MDB_env* mdb_env)
59  : mdb_env_(mdb_env) { }
60  virtual void Put(const string& key, const string& value);
61  virtual void Commit();
62 
63  private:
64  MDB_env* mdb_env_;
65  vector<string> keys, values;
66 
67  void DoubleMapSize();
68 
69  DISABLE_COPY_AND_ASSIGN(LMDBTransaction);
70 };
71 
72 class LMDB : public DB {
73  public:
74  LMDB() : mdb_env_(NULL) { }
75  virtual ~LMDB() { Close(); }
76  virtual void Open(const string& source, Mode mode);
77  virtual void Close() {
78  if (mdb_env_ != NULL) {
79  mdb_dbi_close(mdb_env_, mdb_dbi_);
80  mdb_env_close(mdb_env_);
81  mdb_env_ = NULL;
82  }
83  }
84  virtual LMDBCursor* NewCursor();
85  virtual LMDBTransaction* NewTransaction();
86 
87  private:
88  MDB_env* mdb_env_;
89  MDB_dbi mdb_dbi_;
90 };
91 
92 } // namespace db
93 } // namespace caffe
94 
95 #endif // CAFFE_UTIL_DB_LMDB_HPP
96 #endif // USE_LMDB
A layer factory that allows one to register layers. During runtime, registered layers can be called b...
Definition: blob.hpp:14