Thankyou for reply.

I played a few with code and got some successfull experience. Now
users can not only to register but and connect later.
authreg_oracle.c.patch attached.

But it helps only with users authentication, not to store their info.
It works when c2s set to 'oracle' and sm set to 'db'.

Also I've made a patch for sm (storage_oracle.c.patch). With this it
connects to Oracle DB, I can see it does some queries, but there are
still errors (see part of output in file oracle.txt).
--- jabberd-2.2.4-orig/storage/authreg_oracle.c	2008-08-28 15:02:25.000000000 +0300
+++ jabberd-2.2.4/storage/authreg_oracle.c	2008-10-15 15:28:31.000000000 +0300
@@ -29,6 +29,7 @@
 //#define MYSQL_LP   256   /* maximum length of password - should correspond to field length */
 
 #define BLOCKSIZE (1024)
+#define PWSIZE (257) 
 
 typedef struct Oracle_context_st
 {
@@ -100,48 +101,6 @@
 	return nStatus;
 }
 
-static int oracle_ping( authreg_t ar )
-{
-	Oracle_context_t odpOracleDriver = (Oracle_context_t)ar->private;
-
-	// Prepare the check statement
-	int nResultCode = OCIStmtPrepare(odpOracleDriver->ociStatement, odpOracleDriver->ociError,
-					"select sysdate from dual", (ub4) 24, OCI_NTV_SYNTAX,
-					OCI_DEFAULT);
-
-	// This is the real check
-	nResultCode = OCIStmtExecute(odpOracleDriver->ociService, odpOracleDriver->ociStatement, odpOracleDriver->ociError,
-					(ub4) 0, (ub4) 0,
-					(CONST OCISnapshot *) NULL, (OCISnapshot *) NULL,
-					OCI_DESCRIBE_ONLY );
-
-
-	// If there was an error...
-	if (nResultCode != 0)
-	{
-		char szErrorBuffer[250];
-		char *svHost, *svUser, *svPass;
-
-		OCIErrorGet((dvoid *)odpOracleDriver->ociError, (ub4) 1, (text *) NULL, &nResultCode, szErrorBuffer, (ub4) sizeof(szErrorBuffer), OCI_HTYPE_ERROR);
-		log_write(ar->c2s->log, LOG_ERR, "storage_oracle.c (oracle_ping): %s", szErrorBuffer);
-
-		// Obtain user configuration
-		svHost = config_get_one(ar->c2s->config, "storage.oracle.host", 0);
-		svUser = config_get_one(ar->c2s->config, "storage.oracle.user", 0);
-		svPass = config_get_one(ar->c2s->config, "storage.oracle.pass", 0);
-
-		// Logon to the database
-		nResultCode = OCILogon((dvoid *)odpOracleDriver->ociEnvironment, (dvoid *)odpOracleDriver->ociError, &(odpOracleDriver->ociService), svUser, strlen(svUser), svPass, strlen(svPass), svHost, strlen(svHost));
-
-		if (nResultCode != 0)
-		{
-			OCIErrorGet((dvoid *)odpOracleDriver->ociError, (ub4) 1, (text *) NULL, &nResultCode, szErrorBuffer, (ub4) sizeof(szErrorBuffer), OCI_HTYPE_ERROR);
-			log_write(ar->c2s->log, LOG_ERR, "storage_oracle.c (oracle_ping): %s", szErrorBuffer);
-		}
-	}
-
-	return nResultCode;
-}
 
 static int _sql_length( char* sql )
 {
@@ -285,14 +244,14 @@
 }
 
 
-static int _ar_oracle_get_password( authreg_t ar, char *username, char *realm, char password[257] )
+static int _ar_oracle_get_password( authreg_t ar, char *username, char *realm, char password[PWSIZE] )
 {
     Oracle_context_t _ctx = (Oracle_context_t)ar->private;
 	char* _sqlbuf = NULL;
 	int _nNumberOfFields = 0;
 	int _nResultCode = 0;
 	int _len = 0;
-	char _password[257];
+	char _password[PWSIZE];
 	memset( _password, '\0', sizeof(_password) );
  	ORACLE_SAFE( _sqlbuf, strlen(username) + strlen(realm) + _sql_length(_ctx->sql_select), _len );
 	sprintf( _sqlbuf, _ctx->sql_select, username, realm );
@@ -306,7 +265,7 @@
 	}
 
 	_nResultCode = checkOCIError(ar, "_ar_oracle_get_user_tuple:define pos", _ctx->ociError, OCIDefineByPos( _ctx->ociStatement, \
-									&_ctx->ociDefine, _ctx->ociError, 1, &_password, 257, SQLT_STR, 0, 0, 0, OCI_DEFAULT ) );
+									&_ctx->ociDefine, _ctx->ociError, 1, &_password, PWSIZE, SQLT_STR, 0, 0, 0, OCI_DEFAULT ) );
 	if( _nResultCode != 0 )
 	{
 		free( _sqlbuf );
@@ -324,12 +283,13 @@
 	OCIStmtFetch2( _ctx->ociStatement, _ctx->ociError, 1, OCI_FETCH_FIRST, 0, OCI_DEFAULT ); 
 	free( _sqlbuf );
 	
-	if( strlen(_password)  != 0 )strncpy( password, _password, strlen(_password) );
+	strncpy( password, _password, PWSIZE - 1 );
+	password[PWSIZE - 1] = '\0';
 
 	return 0;
 }
 
-static int _ar_oracle_set_password(authreg_t ar, char *username, char *realm, char password[257])
+static int _ar_oracle_set_password(authreg_t ar, char *username, char *realm, char password[PWSIZE])
 {
 	Oracle_context_t _ctx = (Oracle_context_t)ar->private;
 	char* _sqlbuf = NULL;
@@ -573,7 +533,6 @@
 	ar->set_password = _ar_oracle_set_password;
 	ar->create_user = _ar_oracle_create_user;
 	ar->delete_user = _ar_oracle_delete_user;
-	ar->get_authreg_user = _ar_oracle_get_authreg_user;
 
 	return 0;
 }
--- jabberd-2.2.4-orig/storage/storage_oracle.c	2008-08-28 15:02:25.000000000 +0300
+++ jabberd-2.2.4/storage/storage_oracle.c	2008-10-15 17:57:06.000000000 +0300
@@ -556,8 +556,8 @@
   {
     return st_NOTFOUND;
   }
-  else
-  {
+
+
     /*
      * TODO: Handle memory better. 
      * The DDL for the "vcard" table has 21 fields. The following implementation allocates 82K for 21 fields.
@@ -740,7 +740,7 @@
         break;
       }
     }
-  }
+
 
   return st_SUCCESS;
 }
@@ -837,37 +837,61 @@
     free(data);
 }
 
+static int _sql_length( char* sql )
+{
+	const char* _pt = sql;
+	int _num = 0;
+	
+	while( *_pt != '\0' )
+	{
+		if( *_pt == '"' )++_num;
+		++_pt;
+	}
+
+	return (strlen(sql) - _num);
+}
 st_ret_t st_init(st_driver_t drv) {
     int nResultCode;
-    char *svHost, *svUser, *svPass;
+    char *svHost, *svUser, *svPass, *svPort, *svDbnm, *oracle_server_host = NULL;
     OCIEnv     *ociEnvironment;
     OCIError   *ociError;
     OCISvcCtx  *ociService;
     OCIStmt    *ociStatement;
+	static char* oracle_server_parameters = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=\"%s\")(PORT=\"%s\"))(CONNECT_DATA=(SID=\"%s\")))";
+	int _len = 0;
 
     OracleDriverPointer data;
 
     svHost = config_get_one(drv->st->sm->config, "storage.oracle.host", 0);
     svUser = config_get_one(drv->st->sm->config, "storage.oracle.user", 0);
     svPass = config_get_one(drv->st->sm->config, "storage.oracle.pass", 0);
+	svPort = config_get_one(drv->st->sm->config, "storage.oracle.port", 0);
+	svDbnm = config_get_one(drv->st->sm->config, "storage.oracle.dbname", 0);
 
-    if(svHost == NULL || svUser == NULL || svPass == NULL)
+    if(svHost == NULL || svUser == NULL || svPass == NULL || svPort == NULL || svDbnm == NULL)
     {
       log_write(drv->st->sm->log, LOG_ERR, "(st_oracle_init: ) Invalid driver config from XML file.");
       return st_FAILED;
     }
 
-    /* Initialize OCI */
-    nResultCode = OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t))0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0);
+	ORACLE_SAFE( oracle_server_host, strlen(svHost) + strlen(svPort) + strlen(svDbnm) + _sql_length(oracle_server_parameters), _len );
+	sprintf( oracle_server_host, oracle_server_parameters, svHost, svPort, svDbnm );
 
-    if (nResultCode != 0)
-    {
-      log_write(drv->st->sm->log, LOG_ERR, "(st_oracle_init: ) Could not Initialize OCI (%d)", nResultCode);
-      return st_FAILED;
-    }
-
-    /* Initialize evironment */
-    nResultCode = OCIEnvInit((OCIEnv **) &ociEnvironment, OCI_DEFAULT, (size_t) 0, (dvoid **) 0);
+#ifdef __COMPATIBLE
+	/* Initialize OCI */
+	nResultCode = OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t))0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0);
+
+	if (nResultCode != 0)
+	{
+		log_write(drv->st->sm->log, LOG_ERR, "(st_oracle_init: ) Could not Initialize OCI (%d)", nResultCode);
+		return st_FAILED;
+	}
+
+	/* Initialize evironment */
+	nResultCode = OCIEnvInit( (OCIEnv **)&ociEnvironment, OCI_DEFAULT, (size_t)0, (dvoid **)0 );
+#else
+	nResultCode = OCIEnvCreate( (OCIEnv**)&ociEnvironment, OCI_OBJECT, (dvoid*)0, 0, 0, 0, (size_t)0, (dvoid **)0 );
+#endif	
 
     if (nResultCode != 0)
     {
@@ -898,7 +922,7 @@
     /* Connect to database server */
     nResultCode = checkOCIError(drv, "st_oracle_init: Connect to Server", ociError, OCILogon(ociEnvironment, ociError, &ociService,
                                                                                     svUser, strlen(svUser), svPass, strlen(svPass),
-                                                                                    svHost, strlen(svHost)));
+                                                                                    oracle_server_host, strlen(oracle_server_host)));
 
     if (nResultCode != 0)
     {
@@ -922,6 +946,8 @@
       return st_FAILED;
     }
 
+	free(oracle_server_host);
+
     data = (OracleDriverPointer) calloc(1, sizeof(struct OracleDriver));
 
     data->ociEnvironment = ociEnvironment;
$ router &
$ c2s &
sm -D
--------------------------------
...
sx (io.c:237) decoded read data (285 bytes): <route 
xmlns='http://jabberd.jabberstudio.org/ns/component/1.0' to='jabber.polt.ua' 
from='c2s'><sc:session 
xmlns:sc='http://jabberd.jabberstudio.org/ns/session/1.0' sc:c2s='12' 
action='start' target='[EMAIL PROTECTED]/Oracul' 
id='a2476ca2c0aaf5fe0c8860d83a70d1d7e33e2257'/></route>
sx (io.c:91) completed nad: <route 
xmlns='http://jabberd.jabberstudio.org/ns/component/1.0' from='c2s' 
to='jabber.polt.ua'><sc:session 
xmlns:sc='http://jabberd.jabberstudio.org/ns/session/1.0' 
id='a2476ca2c0aaf5fe0c8860d83a70d1d7e33e2257' target='[EMAIL PROTECTED]/Oracul' 
action='start' sc:c2s='12'/></route>
sx (chain.c:119) calling nad read chain
sx (io.c:155) tag 9 event 6 data 0x811ac60
Wed Oct 15 18:44:59 2008 sm.c:203 got a packet
Wed Oct 15 18:44:59 2008 pkt.c:107 creating new packet
Wed Oct 15 18:44:59 2008 mm.c:467 dispatching in-router chain
Wed Oct 15 18:44:59 2008 mm.c:481 calling module session
Wed Oct 15 18:44:59 2008 sess.c:108 session requested for [EMAIL 
PROTECTED]/Oracul
Wed Oct 15 18:44:59 2008 mm.c:653 dispatching user-load chain
Wed Oct 15 18:44:59 2008 mm.c:666 calling module active
Wed Oct 15 18:44:59 2008 storage.c:222 storage_get: type=active [EMAIL 
PROTECTED] filter=(null)
Wed Oct 15 18:44:59 2008 storage.c:102 adding type 'active' to driver 'oracle'
Wed Oct 15 18:44:59 2008 storage_oracle.c:519 _st_oracle_get: Generated Filter: 
"collection-owner" = '[EMAIL PROTECTED]'
Wed Oct 15 18:44:59 2008 storage_oracle.c:525 _st_oracle_get: Prepared SQL: 
SELECT * FROM "active" WHERE "collection-owner" = '[EMAIL PROTECTED]' ORDER BY 
"object-sequence"
Wed Oct 15 18:44:59 2008 storage_oracle.c:601 Field collection-owner of Size 
4000
Wed Oct 15 18:44:59 2008 storage_oracle.c:601 Field object-sequence of Size 22
Wed Oct 15 18:44:59 2008 storage_oracle.c:601 Field time of Size 22
Wed Oct 15 18:44:59 2008 mm.c:673 user-load chain returning 1
Wed Oct 15 18:44:59 2008 user.c:67 modules failed user load for [EMAIL 
PROTECTED]
Wed Oct 15 18:44:59 2008 [notice] user not found, can't start session: [EMAIL 
PROTECTED]/Oracul
...
--------------------------------

Reply via email to