Line data Source code
1 :
2 : /* Copyright (c) 2014, Stefan.Eilemann@epfl.ch
3 : *
4 : * This library is free software; you can redistribute it and/or modify it under
5 : * the terms of the GNU Lesser General Public License version 2.1 as published
6 : * by the Free Software Foundation.
7 : *
8 : * This library is distributed in the hope that it will be useful, but WITHOUT
9 : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10 : * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
11 : * details.
12 : *
13 : * You should have received a copy of the GNU Lesser General Public License
14 : * along with this library; if not, write to the Free Software Foundation, Inc.,
15 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 : */
17 :
18 : #ifdef LUNCHBOX_USE_LEVELDB
19 : #include <leveldb/db.h>
20 :
21 : namespace lunchbox
22 : {
23 : namespace db = ::leveldb;
24 :
25 : namespace leveldb
26 : {
27 : namespace
28 : {
29 7 : db::DB* _open( const URI& uri )
30 : {
31 7 : db::DB* db = 0;
32 7 : db::Options options;
33 7 : options.create_if_missing = true;
34 7 : const std::string& path = uri.getPath().empty() ?
35 7 : "persistentMap.leveldb" : uri.getPath();
36 14 : const db::Status status = db::DB::Open( options, path, &db );
37 7 : if( !status.ok( ))
38 1 : throw status;
39 13 : return db;
40 : }
41 : }
42 :
43 : class PersistentMap : public detail::PersistentMap
44 : {
45 : public:
46 7 : PersistentMap( const URI& uri ) : _db( _open( uri )) {}
47 :
48 12 : virtual ~PersistentMap() { delete _db; }
49 :
50 8 : static bool handles( const URI& uri )
51 8 : { return uri.getScheme() == "leveldb"; }
52 :
53 3 : bool insert( const std::string& key, const std::string& value ) final
54 : {
55 3 : return _db->Put( db::WriteOptions(), key, value ).ok();
56 : }
57 :
58 12 : std::string operator [] ( const std::string& key ) const final
59 : {
60 12 : std::string value;
61 12 : if( _db->Get( db::ReadOptions(), key, &value ).ok( ))
62 6 : return value;
63 6 : return std::string();
64 : }
65 :
66 : private:
67 : db::DB* const _db;
68 : };
69 : }
70 : }
71 :
72 : #endif
|