| 417 | } |
| 418 | |
| 419 | void Write(bool sync, Order order, DBState state, int num_entries, |
| 420 | int value_size, int entries_per_batch) { |
| 421 | // Create new database if state == FRESH |
| 422 | if (state == FRESH) { |
| 423 | if (FLAGS_use_existing_db) { |
| 424 | message_ = "skipping (--use_existing_db is true)"; |
| 425 | return; |
| 426 | } |
| 427 | delete db_; |
| 428 | db_ = nullptr; |
| 429 | Open(sync); |
| 430 | Start(); // Do not count time taken to destroy/open |
| 431 | } |
| 432 | |
| 433 | if (num_entries != num_) { |
| 434 | char msg[100]; |
| 435 | snprintf(msg, sizeof(msg), "(%d ops)", num_entries); |
| 436 | message_ = msg; |
| 437 | } |
| 438 | |
| 439 | // Write to database |
| 440 | for (int i = 0; i < num_entries; i++) { |
| 441 | const int k = (order == SEQUENTIAL) ? i : (rand_.Next() % num_entries); |
| 442 | char key[100]; |
| 443 | snprintf(key, sizeof(key), "%016d", k); |
| 444 | bytes_ += value_size + strlen(key); |
| 445 | std::string cpp_key = key; |
| 446 | if (!db_->set(cpp_key, gen_.Generate(value_size).ToString())) { |
| 447 | fprintf(stderr, "set error: %s\n", db_->error().name()); |
| 448 | } |
| 449 | FinishedSingleOp(); |
| 450 | } |
| 451 | } |
| 452 | |
| 453 | void ReadSequential() { |
| 454 | kyotocabinet::DB::Cursor* cur = db_->cursor(); |