| 269 | } |
| 270 | |
| 271 | Status Append(const Slice& data) override { |
| 272 | size_t write_size = data.size(); |
| 273 | const char* write_data = data.data(); |
| 274 | |
| 275 | // Fit as much as possible into buffer. |
| 276 | size_t copy_size = std::min(write_size, kWritableFileBufferSize - pos_); |
| 277 | std::memcpy(buf_ + pos_, write_data, copy_size); |
| 278 | write_data += copy_size; |
| 279 | write_size -= copy_size; |
| 280 | pos_ += copy_size; |
| 281 | if (write_size == 0) { |
| 282 | return Status::OK(); |
| 283 | } |
| 284 | |
| 285 | // Can't fit in buffer, so need to do at least one write. |
| 286 | Status status = FlushBuffer(); |
| 287 | if (!status.ok()) { |
| 288 | return status; |
| 289 | } |
| 290 | |
| 291 | // Small writes go to buffer, large writes are written directly. |
| 292 | if (write_size < kWritableFileBufferSize) { |
| 293 | std::memcpy(buf_, write_data, write_size); |
| 294 | pos_ = write_size; |
| 295 | return Status::OK(); |
| 296 | } |
| 297 | return WriteUnbuffered(write_data, write_size); |
| 298 | } |
| 299 | |
| 300 | Status Close() override { |
| 301 | Status status = FlushBuffer(); |