-#ifndef pgsql_idl\r
-#define pgsql_idl\r
-\r
-#ifndef CosQuery_idl\r
-#include "CosQuery.idl"\r
-#endif\r
-\r
-#ifndef CosQueryCollection_idl\r
-#include "CosQueryCollection.idl"\r
-#endif\r
-\r
-module PostgreSQL {\r
- \r
- // Built-in types\r
- \r
- module Types {\r
- // Arrays in network order\r
- typedef short int2;\r
- typedef long int4;\r
- typedef long int8[2];\r
- };\r
- \r
- \r
- // NULL support\r
- \r
- typedef boolean Null;\r
- \r
- union Value switch (Null) {\r
- case false: any value;\r
- };\r
- \r
- \r
- // Row definition\r
- \r
- typedef sequence<Value> Row;\r
- \r
- // <info>\r
- // More about the application of COSS:\r
- // \r
- // A Table will be a QueryableCollection of Rows\r
- // A Database will be a QueryableCollection of Tables\r
- // (Currently Tables are not exported... maybe later.)\r
- // Both will be queryable via the Query Service\r
- // \r
- // Other relations will be representable using the Relationship Service\r
- // This includes primary/foreign keys and anything else :)\r
- // \r
- // GRANT/REVOKE can be supplied via the Security Service\r
- // \r
- // See a pattern here? The whole of SQL can be implemented by these services!\r
- // The statements go through a parser. Queries and subqueries are passed to the\r
- // database for processing. Returned items are handled appropriately:\r
- // \r
- // SELECT: return the items to the caller\r
- // UPDATE: modify the items (direct)\r
- // DELETE: call delete() on each Row (direct)\r
- // GRANT/REVOKE: modify ACLs (via Security Service)\r
- // ALTER: modify the items (direct) and/or the relations (via Relationship Service)\r
- // etc.\r
- // \r
- // I'm not sure yet about LOCK and UNLOCK.\r
- // </info>\r
- \r
- \r
- // Connected database object\r
- \r
- interface Database : CosQuery::QueryableCollection {\r
- void disconnect();\r
- };\r
- \r
- \r
- // Server object (stateless)\r
- \r
- interface Server {\r
- Database connect(in string db, in string user, in string password);\r
- };\r
-};\r
-\r
-#endif // pgsql_idl\r
+#ifndef pgsql_idl
+#define pgsql_idl
+
+#ifndef CosQuery_idl
+#include "CosQuery.idl"
+#endif
+
+#ifndef CosQueryCollection_idl
+#include "CosQueryCollection.idl"
+#endif
+
+#pragma prefix ""
+
+module PostgreSQL {
+
+ // Built-in types
+
+ module Types {
+ // Arrays in network order
+ typedef short int2;
+ typedef long int4;
+ typedef long int8[2];
+ };
+
+
+ // NULL support
+
+ typedef boolean Null;
+
+ union Value switch (Null) {
+ case FALSE: any value;
+ };
+
+
+ // Row definition
+
+ typedef sequence<Value> Row;
+
+ // <info>
+ // More about the application of COSS:
+ //
+ // A Table will be a QueryableCollection of Rows
+ // A Database will be a QueryableCollection of Tables
+ // (Currently Tables are not exported... maybe later.)
+ // Both will be queryable via the Query Service
+ //
+ // Other relations will be representable using the Relationship Service
+ // This includes primary/foreign keys and anything else :)
+ //
+ // GRANT/REVOKE can be supplied via the Security Service
+ //
+ // See a pattern here? The whole of SQL can be implemented by these services!
+ // The statements go through a parser. Queries and subqueries are passed to the
+ // database for processing. Returned items are handled appropriately:
+ //
+ // SELECT: return the items to the caller
+ // UPDATE: modify the items (direct)
+ // DELETE: call delete() on each Row (direct)
+ // GRANT/REVOKE: modify ACLs (via Security Service)
+ // ALTER: modify the items (direct) and/or the relations (via Relationship Service)
+ // etc.
+ //
+ // I'm not sure yet about LOCK and UNLOCK.
+ // </info>
+
+ // Expirable object
+
+ interface Expirable {
+ /* oneway? */ void keepalive();
+ void remove();
+ };
+
+
+ // Upcall object
+
+ interface Upcall {
+ void notice(in string message);
+ void abort();
+ };
+
+
+ // Connected database object
+
+ interface Database : CosQuery::QueryableCollection, Expirable {
+ void setupcall(in Upcall obj);
+ };
+
+
+ // Server object (stateless)
+
+ interface Server {
+ Database connect(in string db, in string user, in string password);
+ };
+};
+
+#endif // pgsql_idl
--- /dev/null
+#include <iostream>\r
+#include "pgsql_int.h"\r
+\r
+bool terminate = false;\r
+\r
+int main(int argc, char *argv)\r
+{\r
+ CORBA::ORB_var orb = CORBA::ORB_init(argc,argv,"");\r
+ PortableManager::POA_var poa = PortableServer::POA::_narrow(orb->resolve_initial_references("RootPOA"));\r
+ PortableManager::POAManager_var mgr = poa->the_POAManager();\r
+ \r
+ Server_impl *server = new Server_impl;\r
+ poa->activate_object(server);\r
+ \r
+ CosNaming::NamingContext_var ctx = CosNaming::NamingContext::_narrow(orb->resolve_initial_references("NamingService"));\r
+ CosNaming::Name_var n = new CosNaming::Name(1);\r
+ n[0].id("PostgreSQL");\r
+ n[0].name("service");\r
+ bool bindok = false;\r
+ \r
+ if (!CORBA::Object::is_nil(ctx)) {\r
+ try {\r
+ CosNaming::NamingContext_var myctx = ctx->bind_new_context(n);\r
+ CosNaming::Name_var n2 = new CosNaming::Name(1);\r
+ n2[0].id("Server");\r
+ n2[0].name("Server");\r
+ myctx->bind(n2,server->_this());\r
+ bindok = true;\r
+ } catch (CORBA::Exception &e) {\r
+ cerr << "Warning: Naming Service bind failed" << endl;\r
+ bindok = false;\r
+ }\r
+ } else {\r
+ cerr << "Warning: Naming Service not found" << endl;\r
+ }\r
+ \r
+ mgr->activate();\r
+ while (!terminate) {\r
+ if (orb->work_pending())\r
+ orb->perform_work();\r
+ if (expiry_needed())\r
+ expire_now();\r
+ }\r
+ \r
+ if (!CORBA::Object::is_nil(ctx) && bindok) {\r
+ try {\r
+ CosNaming::NamingContext myctx = ctx->resolve(n);\r
+ ctx->unbind(n);\r
+ myctx->destroy();\r
+ } catch (CORBA::Exception &e) {\r
+ cerr << "Warning: Naming Service unbind failed" << endl;\r
+ }\r
+ }\r
+ \r
+ orb->shutdown(true);\r
+ \r
+ delete server;\r
+ return 0;\r
+}\r