34 bool do_delete =
false;
50 uint64_t
Size()
const {
return size_; }
56 const uint64_t available = size_ - offset;
58 n =
static_cast<size_t>(available);
66 size_t block =
static_cast<size_t>(offset /
kBlockSize);
71 *result =
Slice(blocks_[block] + block_offset, n);
75 size_t bytes_to_copy = n;
78 while (bytes_to_copy > 0) {
80 if (avail > bytes_to_copy) {
81 avail = bytes_to_copy;
83 memcpy(dst, blocks_[block] + block_offset, avail);
85 bytes_to_copy -= avail;
91 *result =
Slice(scratch, n);
96 const char* src = data.
data();
97 size_t src_len = data.
size();
112 if (avail > src_len) {
115 memcpy(blocks_.back() + offset, src, avail);
127 for (std::vector<char*>::iterator i = blocks_.begin(); i != blocks_.end();
160 Status s = file_->Read(pos_, n, result, scratch);
162 pos_ += result->
size();
168 if (pos_ > file_->Size()) {
171 const uint64_t available = file_->Size() - pos_;
195 char* scratch)
const {
196 return file_->Read(offset, n, result, scratch);
214 return file_->Append(data);
227 virtual void Logv(
const char* format, va_list ap) { }
235 for (FileSystem::iterator i = file_map_.begin(); i != file_map_.end(); ++i){
244 if (file_map_.find(fname) == file_map_.end()) {
256 if (file_map_.find(fname) == file_map_.end()) {
268 if (file_map_.find(fname) != file_map_.end()) {
269 DeleteFileInternal(fname);
274 file_map_[fname] = file;
295 return file_map_.find(fname) != file_map_.end();
299 std::vector<std::string>* result) {
303 for (FileSystem::iterator i = file_map_.begin(); i != file_map_.end(); ++i){
304 const std::string& filename = i->first;
306 if (filename.size() >= dir.size() + 1 && filename[dir.size()] ==
'/' &&
308 result->push_back(filename.substr(dir.size() + 1));
316 if (file_map_.find(fname) == file_map_.end()) {
320 file_map_[fname]->Unref();
321 file_map_.erase(fname);
326 if (file_map_.find(fname) == file_map_.end()) {
330 DeleteFileInternal(fname);
344 if (file_map_.find(fname) == file_map_.end()) {
348 *file_size = file_map_[fname]->Size();
353 const std::string& target) {
355 if (file_map_.find(src) == file_map_.end()) {
359 DeleteFileInternal(target);
360 file_map_[target] = file_map_[src];
361 file_map_.erase(src);
395 return new InMemoryEnv(base_env);
virtual Status Append(const Slice &data)
SequentialFileImpl(FileState *file)
virtual Status LockFile(const std::string &fname, FileLock **lock)
virtual Status NewLogger(const std::string &fname, Logger **result)
InMemoryEnv(Env *base_env)
Status Append(const Slice &data)
virtual Status DeleteFile(const std::string &fname)
virtual Status GetFileSize(const std::string &fname, uint64_t *file_size)
void DeleteFileInternal(const std::string &fname)
std::vector< char * > blocks_
virtual bool FileExists(const std::string &fname)
virtual Status GetTestDirectory(std::string *path)
virtual Status Read(size_t n, Slice *result, char *scratch)
RandomAccessFileImpl(FileState *file)
virtual Status GetChildren(const std::string &dir, std::vector< std::string > *result)
virtual Status CreateDir(const std::string &dirname)
static const int kBlockSize
virtual Status NewSequentialFile(const std::string &fname, SequentialFile **result)
virtual Status UnlockFile(FileLock *lock)
virtual Status NewWritableFile(const std::string &fname, WritableFile **result)
virtual Status RenameFile(const std::string &src, const std::string &target)
virtual Status NewRandomAccessFile(const std::string &fname, RandomAccessFile **result)
std::map< std::string, FileState * > FileSystem
virtual void Logv(const char *format, va_list ap)
virtual Status Read(uint64_t offset, size_t n, Slice *result, char *scratch) const
virtual Status NewAppendableFile(const std::string &fname, WritableFile **result)
bool starts_with(const Slice &x) const
virtual Status DeleteDir(const std::string &dirname)
const char * data() const
WritableFileImpl(FileState *file)
virtual Status Skip(uint64_t n)
static Status IOError(const Slice &msg, const Slice &msg2=Slice())
Status Read(uint64_t offset, size_t n, Slice *result, char *scratch) const
Env * NewMemEnv(Env *base_env)