bool Connection::insert(const std::string& db, const std::string& ns, const BSONObj& bson) { if (_logger->isDebug()) _logger->debug(2, "Insert command. db: %s, ns: %s, bson: %s", db.c_str(), ns.c_str(), bson.toChar()); BSONObj obj(bson); InsertCommand cmd; cmd.setDB(db); if (!obj.has("_id")) { std::string* id = uuid(); obj.add("_id", *id); delete id; } if (!obj.has("_revision")) { std::string* rev = uuid(); obj.add("_revision", *rev); delete rev; } cmd.setBSON(obj); cmd.setNameSpace(ns); _commandWriter->writeCommand(&cmd); cmd.readResult(_inputStream); int hasResults = false; //_inputStream->readInt(); if (hasResults) { // When the bson didnt contain an id the server will return a bson with it // At this moment this will never occur, but I will leave this code for later } return true; }
// this method is executed in a thread to simulate multiple clients void* commandClients(void* arg) { NetworkOutputStream* nos = new NetworkOutputStream(); int socket = nos->open("localhost", _port); NetworkInputStream* nis = new NetworkInputStream(socket); Logger* log = getLogger(NULL); CommandWriter* writer = new CommandWriter(nos); for (int x = 0; x < 10; x++) { log->info("client: preparing insert"); InsertCommand* cmd = new InsertCommand(); cmd->setDB("db1"); cmd->setNameSpace("ns"); BSONObj* o = new BSONObj(); std::string* id = uuid(); o->add("_id", id->c_str()); delete id; std::string* rev = uuid(); o->add("_revision", rev->c_str()); delete rev; o->add("name", "John"); cmd->setBSON(o); BSONObj* options = new BSONObj(); cmd->setOptions(options); log->info("client: writing insert command"); writer->writeCommand(cmd); log->info("client: insert command sent"); delete cmd; log->info("client: preparing showdbs command"); ShowdbsCommand* showCmd = new ShowdbsCommand(); BSONObj* options2 = new BSONObj(); showCmd->setOptions(options2); log->info("client: sending showCmd"); writer->writeCommand(showCmd); log->info("client: waiting showDbs answer"); int dbs = nis->readInt(); EXPECT_EQ(dbs, 3); char* db1 = nis->readChars(); EXPECT_TRUE(strcmp(db1, "db1") == 0); char* db2 = nis->readChars(); EXPECT_TRUE(strcmp(db2, "db2") == 0); char* db3 = nis->readChars(); EXPECT_TRUE(strcmp(db3, "db3") == 0); log->info("client: showDbs received"); free(db1); free(db2); free(db3); } log->info("client: sending ShutdownCommand"); ShutdownCommand* shut = new ShutdownCommand(); writer->writeCommand(shut); log->info("client: shutdown sent"); nis->close(); }
bool DjondbConnection::insert(const char* db, const char* ns, const BSONObj& bson) { if (_logger->isDebug()) _logger->debug(2, "Insert command. db: %s, ns: %s", db, ns); if (!isOpen()) { throw DjondbException(D_ERROR_CONNECTION, "Not connected to any server"); } BSONObj* obj = new BSONObj(bson); InsertCommand cmd; cmd.setDB(db); if (!obj->has("_id")) { std::string* id = uuid(); obj->add("_id", const_cast<char*>(id->c_str())); delete id; } if (!obj->has("_revision")) { std::string* rev = uuid(); obj->add("_revision", const_cast<char*>(rev->c_str())); delete rev; } cmd.setBSON(obj); cmd.setNameSpace(ns); prepareOptions((Command*)&cmd); _commandWriter->writeCommand(&cmd); cmd.readResult(_inputStream); int hasResults = false; //_inputStream->readInt(); if (hasResults) { // When the bson didnt contain an id the server will return a bson with it // At this moment this will never occur, but I will leave this code for later } return true; }
TEST(TestCommand, testInsertCommand) { cout << "testInsertCommand" << endl; FileOutputStream* fos = new FileOutputStream("test.dat", "wb"); CommandWriter* commandWriter = new CommandWriter(fos); InsertCommand cmd; cmd.setDB("testdb"); cmd.setNameSpace("test.namespace.db"); BSONObj* obj = new BSONObj(); obj->add("name", "Cross"); obj->add("age", 18); cmd.setBSON(obj); commandWriter->writeCommand(&cmd); fos->close(); delete fos; delete commandWriter; FileInputStream* fis = new FileInputStream("test.dat", "rb"); CommandReader* reader = new CommandReader(fis); InsertCommand* rdCmd = (InsertCommand*) reader->readCommand(); EXPECT_TRUE(rdCmd != NULL); EXPECT_TRUE(rdCmd->nameSpace()->compare("test.namespace.db") == 0); EXPECT_TRUE(rdCmd->DB()->compare("testdb") == 0); const BSONObj* objResult = rdCmd->bson(); EXPECT_TRUE(objResult != NULL); EXPECT_TRUE(objResult->has("name")); EXPECT_TRUE(objResult->getString("name").compare("Cross") == 0); }
TEST(TestCommand, testOptionsCommand) { cout << "testOptionsCommand" << endl; FileOutputStream* fos = new FileOutputStream("test.dat", "wb"); CommandWriter* commandWriter = new CommandWriter(fos); BSONObj* options = new BSONObj(); std::string* txId = uuid(); options->add("_transactionId", const_cast<char*>(txId->c_str())); delete txId; InsertCommand cmd; cmd.setDB("testdb"); cmd.setNameSpace("test.namespace.db"); cmd.setOptions(options); BSONObj* obj = new BSONObj(); obj->add("name", "Cross"); obj->add("age", 18); cmd.setBSON(obj); commandWriter->writeCommand(&cmd); fos->close(); delete fos; delete commandWriter; FileInputStream* fis = new FileInputStream("test.dat", "rb"); CommandReader* reader = new CommandReader(fis); InsertCommand* rdCmd = (InsertCommand*) reader->readCommand(); EXPECT_TRUE(rdCmd != NULL); EXPECT_TRUE(rdCmd->nameSpace()->compare("test.namespace.db") == 0); EXPECT_TRUE(rdCmd->DB()->compare("testdb") == 0); const BSONObj* objResult = rdCmd->bson(); EXPECT_TRUE(objResult != NULL); EXPECT_TRUE(objResult->has("name")); EXPECT_TRUE(objResult->getString("name").compare("Cross") == 0); EXPECT_TRUE(rdCmd->options() != NULL); if (rdCmd->options() != NULL) { const BSONObj* options = rdCmd->options(); EXPECT_TRUE(options->has("_transactionId")); } }