Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
// 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();
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
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"));
	}
}