Try<Option<Entry> > LevelDBStorageProcess::read(const string& name) { CHECK_NONE(error); leveldb::ReadOptions options; string value; leveldb::Status status = db->Get(options, name, &value); if (status.IsNotFound()) { return None(); } else if (!status.ok()) { return Error(status.ToString()); } google::protobuf::io::ArrayInputStream stream(value.data(), value.size()); Entry entry; if (!entry.ParseFromZeroCopyStream(&stream)) { return Error("Failed to deserialize Entry"); } return Some(entry); }
void load(unsigned short bamIndex) { size_t n_reads=0; std::string value; bam1_t *b= bam_init1(); index2chromNames.resize(bamIndex+1); WHERE(in->header); for(int32_t i=0;i< in->header->n_targets;++i) { string target_name(in->header->target_name[i]); index2chromNames.back().push_back(target_name); } while(samread(this->in, b) > 0) /* loop over the records */ { std::auto_ptr<vector<Hit> > hits(0); Bam1Sequence seq(b); leveldb::Slice key1(seq.name()); value.clear(); WHERE(n_reads); leveldb::Status status = db->Get(this->read_options, key1, &value); if(!status.ok()) { hits.reset(new vector<Hit>()); n_reads++; if(n_reads%1000000UL==0) { clog << n_reads << endl; //break;//TODO } } else { hits=decode(value); } Hit hit; hit.bamIndex=bamIndex; hit.tid = seq.tid(); hit.pos = seq.pos(); hit.flag = seq.flag(); hits->push_back(hit); std::auto_ptr<string> encoded = this->encode(hits.get()); leveldb::Slice value1(encoded->data(),encoded->size()); status = db->Put(this->write_options, key1, value1); if(!status.ok()) { cerr << "Cannot insert into db" << endl; break; } } bam_destroy1(b); }
Status Get(const std::string& key, std::string* value) { leveldb::Status s = db->Get(leveldb::ReadOptions(), key, value); if (s.ok()) { return Status::OK(); } return Status::NotFound(); }