diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2009-09-28 11:05:44 -0230 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2009-09-28 11:05:44 -0230 |
commit | 7d20430028f05cc26c412465176a75ce4ea5af9e (patch) | |
tree | 593695acf366f7e3a7081d15af8f474683ce4af7 /cpp/src/IceGrid/SqlStringAdapterInfoDict.cpp | |
parent | Removed unused __checkTwoway(const char*) from Proxy (diff) | |
download | ice-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.cpp | 228 |
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()); + } +} |