Ejemplo n.º 1
0
        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) ) }
Ejemplo n.º 2
0
 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) ) }
Ejemplo n.º 3
0
 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) ) }
Ejemplo n.º 4
0
        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) ) }
Ejemplo n.º 5
0
        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) ); }
Ejemplo n.º 6
0
 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();
}