iterator lower_bound( const Key& key )const { try { FC_ASSERT( is_open(), "Database is not open!" ); std::vector<char> kslice = fc::raw::pack( key ); ldb::Slice key_slice( kslice.data(), kslice.size() ); iterator itr( _db->NewIterator( ldb::ReadOptions() ) ); itr._it->Seek( key_slice ); return itr; } FC_RETHROW_EXCEPTIONS( warn, "error finding ${key}", ("key",key) ) }
iterator lower_bound( const Key& key ) { try { ldb::Slice key_slice( (char*)&key, sizeof(key) ); iterator itr( _db->NewIterator( ldb::ReadOptions() ) ); itr._it->Seek( key_slice ); if( itr.valid() ) { return itr; } return iterator(); } FC_RETHROW_EXCEPTIONS( warn, "error finding ${key}", ("key",key) ) }
iterator find( const Key& key ) { try { std::vector<char> kslice = fc::raw::pack( key ); ldb::Slice key_slice( kslice.data(), kslice.size() ); iterator itr( _db->NewIterator( ldb::ReadOptions() ) ); itr._it->Seek( key_slice ); if( itr.valid() && itr.key() == key ) { return itr; } return iterator(); } FC_RETHROW_EXCEPTIONS( warn, "error finding ${key}", ("key",key) ) }
iterator lower_bound( const Key& key ) { try { FC_ASSERT( is_open(), "Database is not open!" ); ldb::Slice key_slice( (char*)&key, sizeof(key) ); iterator itr( _db->NewIterator( _iter_options ) ); itr._it->Seek( key_slice ); if( itr.valid() ) { return itr; } return iterator(); } FC_RETHROW_EXCEPTIONS( warn, "error finding ${key}", ("key",key) ) }
Value fetch( const Key& key ) { try { FC_ASSERT( is_open(), "Database is not open!" ); ldb::Slice key_slice( (char*)&key, sizeof(key) ); std::string value; auto status = _db->Get( _read_options, key_slice, &value ); if( status.IsNotFound() ) { FC_THROW_EXCEPTION( fc::key_not_found_exception, "unable to find key ${key}", ("key",key) ); } if( !status.ok() ) { FC_THROW_EXCEPTION( level_pod_map_failure, "database error: ${msg}", ("msg", status.ToString() ) ); } fc::datastream<const char*> datastream(value.c_str(), value.size()); Value tmp; fc::raw::unpack(datastream, tmp); return tmp; } FC_RETHROW_EXCEPTIONS( warn, "error fetching key ${key}", ("key",key) ); }
Value fetch( const Key& key ) { try { ldb::Slice key_slice( (char*)&key, sizeof(key) ); std::string value; auto status = _db->Get( ldb::ReadOptions(), key_slice, &value ); if( status.IsNotFound() ) { FC_THROW_EXCEPTION( key_not_found_exception, "unable to find key ${key}", ("key",key) ); } if( !status.ok() ) { FC_THROW_EXCEPTION( exception, "database error: ${msg}", ("msg", status.ToString() ) ); } fc::datastream<const char*> datastream(value.c_str(), value.size()); Value tmp; fc::raw::unpack(datastream, tmp); return tmp; } FC_RETHROW_EXCEPTIONS( warn, "error fetching key ${key}", ("key",key) ); }
mtn::status_t mtn::index_reader_writer_leveldb_t::read_segment(mtn_index_partition_t partition, const std::vector<mtn::byte_t>& bucket, const std::vector<mtn::byte_t>& field, mtn_index_address_t value, mtn_index_address_t offset, mtn::index_segment_ptr output) { std::vector<mtn::byte_t> key; encode_index_key(partition, &bucket[0], bucket.size(), &field[0], field.size(), value, offset, key); leveldb::Slice key_slice(reinterpret_cast<char*>(&key[0]), key.size()); std::auto_ptr<leveldb::Iterator> iter(_db->NewIterator(_read_options)); iter->Seek(key_slice); if (iter->Valid() && iter->key() == key_slice) { assert(iter->value().size() == MTN_INDEX_SEGMENT_SIZE); memcpy(output, iter->value().data(), MTN_INDEX_SEGMENT_SIZE); } else { memset(output, 0, MTN_INDEX_SEGMENT_SIZE); } return mtn::status_t(); }