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
...
--------------------------------