summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/QueryI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceGrid/QueryI.cpp')
-rw-r--r--cpp/src/IceGrid/QueryI.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/cpp/src/IceGrid/QueryI.cpp b/cpp/src/IceGrid/QueryI.cpp
new file mode 100644
index 00000000000..ace487f7fcf
--- /dev/null
+++ b/cpp/src/IceGrid/QueryI.cpp
@@ -0,0 +1,108 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2011 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 <IceGrid/Internal.h>
+#include <IceGrid/QueryI.h>
+#include <IceGrid/Database.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceGrid;
+
+QueryI::QueryI(const CommunicatorPtr& communicator, const DatabasePtr& database) :
+ _communicator(communicator),
+ _database(database)
+{
+}
+
+QueryI::~QueryI()
+{
+}
+
+Ice::ObjectPrx
+QueryI::findObjectById(const Ice::Identity& id, const Ice::Current&) const
+{
+ try
+ {
+ return _database->getObjectProxy(id);
+ }
+ catch(const ObjectNotRegisteredException&)
+ {
+ return 0;
+ }
+}
+
+Ice::ObjectPrx
+QueryI::findObjectByType(const string& type, const Ice::Current&) const
+{
+ return _database->getObjectByType(type);
+}
+
+Ice::ObjectPrx
+QueryI::findObjectByTypeOnLeastLoadedNode(const string& type, LoadSample sample, const Ice::Current&) const
+{
+ return _database->getObjectByTypeOnLeastLoadedNode(type, sample);
+}
+
+Ice::ObjectProxySeq
+QueryI::findAllObjectsByType(const string& type, const Ice::Current&) const
+{
+ return _database->getObjectsByType(type);
+}
+
+
+Ice::ObjectProxySeq
+QueryI::findAllReplicas(const Ice::ObjectPrx& proxy, const Ice::Current&) const
+{
+ if(!proxy)
+ {
+ return Ice::ObjectProxySeq();
+ }
+
+ //
+ // If the given proxy has an empty adapter id, we check if it's a
+ // well-known object. If it's a well-known object we use the
+ // registered proxy instead.
+ //
+ Ice::ObjectPrx prx = proxy;
+ if(prx->ice_getAdapterId().empty())
+ {
+ try
+ {
+ ObjectInfo info = _database->getObjectInfo(prx->ice_getIdentity());
+ prx = info.proxy;
+ }
+ catch(const ObjectNotRegisteredException&)
+ {
+ return Ice::ObjectProxySeq();
+ }
+ }
+
+ try
+ {
+ AdapterInfoSeq infos = _database->getAdapterInfo(prx->ice_getAdapterId());
+ assert(!infos.empty());
+ if(infos[0].replicaGroupId != prx->ice_getAdapterId()) // The adapter id doesn't refer to a replica group.
+ {
+ return Ice::ObjectProxySeq();
+ }
+
+ Ice::ObjectProxySeq proxies;
+ for(AdapterInfoSeq::const_iterator p = infos.begin(); p != infos.end(); ++p)
+ {
+ assert(!p->id.empty());
+ proxies.push_back(prx->ice_adapterId(p->id));
+ }
+ return proxies;
+ }
+ catch(const AdapterNotExistException&)
+ {
+ return Ice::ObjectProxySeq();
+ }
+}