summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2009-09-28 11:05:44 -0230
committerDwayne Boone <dwayne@zeroc.com>2009-09-28 11:05:44 -0230
commit7d20430028f05cc26c412465176a75ce4ea5af9e (patch)
tree593695acf366f7e3a7081d15af8f474683ce4af7 /cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp
parentRemoved unused __checkTwoway(const char*) from Proxy (diff)
downloadice-7d20430028f05cc26c412465176a75ce4ea5af9e.tar.bz2
ice-7d20430028f05cc26c412465176a75ce4ea5af9e.tar.xz
ice-7d20430028f05cc26c412465176a75ce4ea5af9e.zip
Bug 3231 - alternative storage for IceGrid and IceStorm
Diffstat (limited to 'cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp')
-rw-r--r--cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp228
1 files changed, 228 insertions, 0 deletions
diff --git a/cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp b/cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp
new file mode 100644
index 00000000000..ce11f221560
--- /dev/null
+++ b/cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp
@@ -0,0 +1,228 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Communicator.h>
+#include <IceGrid/SqlStringAdapterInfoDict.h>
+#include <IceSQL/SqlTypes.h>
+#include <QtSql/QSqlQuery>
+#include <QtCore/QVariant>
+#include <QtCore/QStringList>
+
+using namespace IceSQL;
+using namespace IceGrid;
+using namespace std;
+
+SqlStringAdapterInfoDict::SqlStringAdapterInfoDict(const DatabaseConnectionPtr& connection,
+ const string& table,
+ const Ice::CommunicatorPtr& communicator) :
+ _communicator(communicator),
+ _table(table)
+
+{
+ QStringList tables = connection->connection.tables(QSql::Tables);
+ if(!tables.contains(_table.c_str(), Qt::CaseInsensitive))
+ {
+ QSqlQuery query(connection->connection);
+ string queryString = "CREATE TABLE ";
+ queryString += _table;
+ queryString += " (id ";
+ if(connection->connection.driverName() == "QODBC")
+ {
+ queryString += "N";
+ }
+ queryString += "VARCHAR(255) PRIMARY KEY, proxy TEXT, replicaGroupId ";
+ if(connection->connection.driverName() == "QODBC")
+ {
+ queryString += "N";
+ }
+ queryString += "VARCHAR(255));";
+
+ if(!query.exec(queryString.c_str()))
+ {
+ throwDatabaseException(__FILE__, __LINE__, query.lastError());
+ }
+
+ QSqlQuery idxQuery(connection->connection);
+ queryString = "CREATE INDEX IDX_";
+ queryString += _table;
+ queryString += "_REPLICA_GROUP_ID ON ";
+ queryString += _table;
+ queryString += " (replicaGroupId);";
+
+ if(!idxQuery.exec(queryString.c_str()))
+ {
+ throwDatabaseException(__FILE__, __LINE__, idxQuery.lastError());
+ }
+ }
+}
+
+void
+SqlStringAdapterInfoDict::put(const DatabaseConnectionPtr& connection,
+ const AdapterInfo& info)
+{
+ QSqlQuery query(connection->connection);
+ string queryString = "UPDATE ";
+ queryString += _table;
+ queryString += " SET proxy = ?, replicaGroupId = ? WHERE id = ?;";
+
+ query.prepare(queryString.c_str());
+ query.bindValue(0, _communicator->proxyToString(info.proxy).c_str());
+ query.bindValue(1, info.replicaGroupId.c_str());
+ query.bindValue(2, info.id.c_str());
+
+ if(!query.exec())
+ {
+ throwDatabaseException(__FILE__, __LINE__, query.lastError());
+ }
+
+ if(query.numRowsAffected() == 0)
+ {
+ //
+ // We do a find since some databases (MySQL) return 0 for number of rows affected
+ // if row exists but data was not changed from previous values.
+ //
+ try
+ {
+ find(connection, info.id);
+ }
+ catch(const NotFoundException&)
+ {
+ QSqlQuery insertQuery(connection->connection);
+ queryString = "INSERT INTO ";
+ queryString += _table;
+ queryString += " VALUES(?, ?, ?);";
+
+ insertQuery.prepare(queryString.c_str());
+ insertQuery.bindValue(0, info.id.c_str());
+ insertQuery.bindValue(1, _communicator->proxyToString(info.proxy).c_str());
+ insertQuery.bindValue(2, info.replicaGroupId.c_str());
+
+ if(!insertQuery.exec())
+ {
+ throwDatabaseException(__FILE__, __LINE__, insertQuery.lastError());
+ }
+ }
+ }
+}
+
+IceGrid::AdapterInfo
+SqlStringAdapterInfoDict::find(const DatabaseConnectionPtr& connection,
+ const string& id)
+{
+ QSqlQuery query(connection->connection);
+ string queryString = "SELECT * FROM ";
+ queryString += _table;
+ queryString += " WHERE id = ?;";
+
+ query.prepare(queryString.c_str());
+ query.bindValue(0, id.c_str());
+
+ if(!query.exec())
+ {
+ throwDatabaseException(__FILE__, __LINE__, query.lastError());
+ }
+
+ if(query.next())
+ {
+ IceGrid::AdapterInfo info;
+ info.id = query.value(0).toString().toStdString();
+ info.proxy = _communicator->stringToProxy(query.value(1).toString().toStdString());
+ info.replicaGroupId = query.value(2).toString().toStdString();
+ return info;
+ }
+ else
+ {
+ throw NotFoundException(__FILE__, __LINE__);
+ }
+}
+
+vector<IceGrid::AdapterInfo>
+SqlStringAdapterInfoDict::findByReplicaGroupId(const DatabaseConnectionPtr& connection,
+ const string& id)
+{
+ QSqlQuery query(connection->connection);
+ string queryString = "SELECT * FROM ";
+ queryString += _table;
+ queryString += " WHERE replicaGroupId = ?;";
+
+ query.prepare(queryString.c_str());
+ query.bindValue(0, id.c_str());
+
+ if(!query.exec())
+ {
+ throwDatabaseException(__FILE__, __LINE__, query.lastError());
+ }
+
+ vector<IceGrid::AdapterInfo> infos;
+ while(query.next())
+ {
+ IceGrid::AdapterInfo info;
+ info.id = query.value(0).toString().toStdString();
+ info.proxy = _communicator->stringToProxy(query.value(1).toString().toStdString());
+ info.replicaGroupId = query.value(2).toString().toStdString();
+ infos.push_back(info);
+ }
+ return infos;
+}
+
+void
+SqlStringAdapterInfoDict::getMap(const DatabaseConnectionPtr& connection,
+ StringAdapterInfoDict& adapterMap)
+{
+ QSqlQuery query(connection->connection);
+ string queryString = "SELECT * FROM ";
+ queryString += _table;
+ queryString += ";";
+
+ if(!query.exec(queryString.c_str()))
+ {
+ throwDatabaseException(__FILE__, __LINE__, query.lastError());
+ }
+
+ while(query.next())
+ {
+ IceGrid::AdapterInfo info;
+ info.id = query.value(0).toString().toStdString();
+ info.proxy = _communicator->stringToProxy(query.value(1).toString().toStdString());
+ info.replicaGroupId = query.value(2).toString().toStdString();
+ adapterMap[info.id] = info;
+ }
+}
+
+void
+SqlStringAdapterInfoDict::erase(const DatabaseConnectionPtr& connection,
+ const string& id)
+{
+ QSqlQuery query(connection->connection);
+ string queryString = "DELETE FROM ";
+ queryString += _table;
+ queryString += " WHERE id = ?;";
+
+ query.prepare(queryString.c_str());
+ query.bindValue(0, id.c_str());
+
+ if(!query.exec())
+ {
+ throwDatabaseException(__FILE__, __LINE__, query.lastError());
+ }
+}
+
+void
+SqlStringAdapterInfoDict::clear(const DatabaseConnectionPtr& connection)
+{
+ QSqlQuery query(connection->connection);
+ string queryString = "DELETE FROM ";
+ queryString += _table;
+ queryString += ";";
+
+ if(!query.exec(queryString.c_str()))
+ {
+ throwDatabaseException(__FILE__, __LINE__, query.lastError());
+ }
+}