Modified: webservices/savan/trunk/c/samples/server/publisher/publisher_skeleton.c URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/samples/server/publisher/publisher_skeleton.c?rev=574548&r1=574547&r2=574548&view=diff ============================================================================== --- webservices/savan/trunk/c/samples/server/publisher/publisher_skeleton.c (original) +++ webservices/savan/trunk/c/samples/server/publisher/publisher_skeleton.c Tue Sep 11 03:54:44 2007 @@ -256,12 +256,7 @@ while(1) { axutil_hash_t *subs_list = NULL; - AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Inside while loop"); - - param = axis2_svc_get_param(svc, env, SAVAN_SUBSCRIBER_LIST); - if(param) - subs_list = axutil_param_get_value(param, env); - if(subs_list) + AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[SAVAN] Inside while loop"); { savan_publishing_client_t *pub_client = NULL; @@ -280,10 +275,12 @@ axiom_element_set_text(test_elem, env, "test data", test_node); /*printf("%s\n", axiom_node_to_string(test_node, env));*/ + AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[savan] came10"); savan_publishing_client_publish(pub_client, env, test_node); + AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[savan] came11"); savan_publishing_client_free(pub_client, env); } - AXIS2_SLEEP(1); + AXIS2_SLEEP(5); } }
Modified: webservices/savan/trunk/c/samples/server/publisher/services.xml URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/samples/server/publisher/services.xml?rev=574548&r1=574547&r2=574548&view=diff ============================================================================== --- webservices/savan/trunk/c/samples/server/publisher/services.xml (original) +++ webservices/savan/trunk/c/samples/server/publisher/services.xml Tue Sep 11 03:54:44 2007 @@ -6,6 +6,9 @@ </description> <module ref="savan"/> + <parameter name="TopicURL" locked="xsd:false">http://localhost:9090/axis2/services/publisher</parameter> + <parameter name="SubscriptionMgrName" >subscription</parameter> + <parameter name="SubscriptionMgrURL" locked="xsd:false">http://localhost:9090/axis2/services/subscription</parameter> <operation name="start"> <!--messageReceiver class="axis2_receivers" /--> Modified: webservices/savan/trunk/c/src/client/savan_publishing_client.c URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/client/savan_publishing_client.c?rev=574548&r1=574547&r2=574548&view=diff ============================================================================== --- webservices/savan/trunk/c/src/client/savan_publishing_client.c (original) +++ webservices/savan/trunk/c/src/client/savan_publishing_client.c Tue Sep 11 03:54:44 2007 @@ -25,6 +25,7 @@ #include <savan_publishing_client.h> #include <savan_subscriber.h> +#include <savan_util.h> #include <savan_constants.h> struct savan_publishing_client_t @@ -78,31 +79,91 @@ const axutil_env_t *env, axiom_node_t *payload) { - axutil_hash_t *store = NULL; axutil_param_t *param = NULL; axutil_hash_index_t *hi = NULL; + axis2_svc_t *pubs_svc = NULL; + axutil_hash_t *subs_store = NULL; AXIS2_ENV_CHECK(env, AXIS2_FAILURE); AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[savan] " "Start:savan_publishing_client_publish"); - - param = axis2_svc_get_param(client->svc, env, SAVAN_SUBSCRIBER_LIST); - if (!param) + + pubs_svc = client->svc; + param = axis2_svc_get_param(pubs_svc, env, "SubscriptionMgrName"); + if(param) { - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan][out handler] " - "Subscribe store not found"); - return AXIS2_SUCCESS; /* returning FAILURE will break handler chain */ + axis2_svc_t *subs_svc = NULL; + axis2_conf_ctx_t *conf_ctx = NULL; + axis2_conf_t *conf = NULL; + axutil_param_t *subs_store_param = NULL; + axis2_char_t *subs_svc_name = NULL; + + subs_svc_name = axutil_param_get_value(param, env); + conf_ctx = client->conf_ctx; + conf = axis2_conf_ctx_get_conf(conf_ctx, env); + if(conf) + subs_svc = axis2_conf_get_svc(conf, env, subs_svc_name); + if(subs_svc) + { + subs_store_param = axis2_svc_get_param(subs_svc, env, + SAVAN_SUBSCRIBER_LIST); + if(!subs_store_param) + { + AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, + "[SAVAN] No Subscriber found"); + return AXIS2_SUCCESS;/* returning FAILURE will break handler chain */ + } + subs_store = axutil_param_get_value(subs_store_param, env); + } + else + { + axis2_char_t *subs_mgr_url = NULL; + + param = axis2_svc_get_param(pubs_svc, env, "SubscriptionMgrURL"); + if(param) + { + axis2_svc_client_t* svc_client = NULL; + axutil_param_t *svc_client_param = NULL; + axutil_param_t *topic_param = NULL; + axis2_char_t *topic_url = NULL; + + subs_mgr_url = axutil_param_get_value(param, env); + topic_param = axis2_svc_get_param(pubs_svc, env, "TopicURL"); + topic_url = axutil_param_get_value(topic_param, env); + svc_client_param = axis2_svc_get_param(pubs_svc, env, "svc_client"); + if(svc_client_param) + svc_client = axutil_param_get_value(svc_client_param, env); + if(!svc_client) + { + svc_client = + (axis2_svc_client_t *) savan_util_get_svc_client(env); + svc_client_param = axutil_param_create(env, "svc_client", + svc_client); + axis2_svc_add_param(pubs_svc, env, svc_client_param); + } + subs_store = + savan_util_get_subscriber_list_from_remote_subs_mgr(env, + topic_url, subs_mgr_url, svc_client); + } + } } - - store = (axutil_hash_t*)axutil_param_get_value(param, env); - if (!store) + else + { + param = axis2_svc_get_param(pubs_svc, env, SAVAN_SUBSCRIBER_LIST); + if (param) + { + subs_store = (axutil_hash_t*)axutil_param_get_value(param, env); + } + } + if (!subs_store) { - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan][out handler] " - "Subscribe store is null"); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[SAVAN] Subscriber store is null"); return AXIS2_SUCCESS; /* returning FAILURE will break handler chain */ } - for (hi = axutil_hash_first(store, env); hi; hi = + + for (hi = axutil_hash_first(subs_store, env); hi; hi = axutil_hash_next(env, hi)) { void *val = NULL; Modified: webservices/savan/trunk/c/src/util/Makefile.am URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/util/Makefile.am?rev=574548&r1=574547&r2=574548&view=diff ============================================================================== --- webservices/savan/trunk/c/src/util/Makefile.am (original) +++ webservices/savan/trunk/c/src/util/Makefile.am Tue Sep 11 03:54:44 2007 @@ -1,7 +1,7 @@ datadir=$(prefix)/modules/savan noinst_LTLIBRARIES = libsavan_util.la -libsavan_util_la_SOURCES = savan_util.c +libsavan_util_la_SOURCES = savan_util.c sqlite3.c db_mgr.c data_DATA=template.xsl INCLUDES = -I$(top_builddir)/include \ Added: webservices/savan/trunk/c/src/util/db_mgr.c URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/util/db_mgr.c?rev=574548&view=auto ============================================================================== --- webservices/savan/trunk/c/src/util/db_mgr.c (added) +++ webservices/savan/trunk/c/src/util/db_mgr.c Tue Sep 11 03:54:44 2007 @@ -0,0 +1,486 @@ +/* + * Copyright 2004,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "savan_db_mgr.h" +#include <axutil_log.h> +#include <axutil_hash.h> +#include <axutil_thread.h> +#include <axutil_property.h> +#include <axis2_conf_ctx.h> +#include <axutil_types.h> +#include <platforms/axutil_platform_auto_sense.h> +#include <savan_constants.h> + +/** + * Savan subscription manager maintain two database tables in mysql. They are namely + * subscriber and topic. + * subscriber table has following schema + * id varchar(100) primary key, + end_to varchar(200), + notify_to varchar(200), + delivery_mode varchar(100), + expires varchar(100), + filter varchar(200), + topic_name varchar(100), + renewed boolean + * + * topic table has following schema + * name varchar(100) primary key, + url vahrchar(200) + * + */ + +AXIS2_EXTERN savan_db_mgr_t * AXIS2_CALL +savan_db_mgr_create( + const axutil_env_t *env, + axis2_conf_ctx_t *conf_ctx) +{ + savan_db_mgr_t *db_mgr = NULL; + + AXIS2_ENV_CHECK(env, NULL); + db_mgr = AXIS2_MALLOC(env->allocator, sizeof(savan_db_mgr_t)); + + db_mgr->mutex = axutil_thread_mutex_create(env->allocator, + AXIS2_THREAD_MUTEX_DEFAULT); + return db_mgr; +} + +void AXIS2_CALL +savan_db_mgr_free( + savan_db_mgr_t *db_mgr, + const axutil_env_t *env) +{ + AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, + "[SAVAN] Start:savan_db_mgr_free"); + + if(db_mgr->mutex) + { + axutil_thread_mutex_destroy(db_mgr->mutex); + db_mgr->mutex = NULL; + } + if(db_mgr) + { + AXIS2_FREE(env->allocator, db_mgr); + } + + AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, + "[SAVAN] Exit:savan_db_mgr_free"); +} + +int AXIS2_CALL +savan_db_mgr_find_callback( + void *not_used, + int argc, + char **argv, + char **col_name) +{ + savan_subscriber_t *subscriber = NULL; + int i = 0; + savan_db_mgr_args_t *args = (savan_db_mgr_args_t *) not_used; + const axutil_env_t *env = args->env; + axutil_array_list_t *subscriber_list = (axutil_array_list_t *) args->data; + if(argc < 1) + { + args->data = NULL; + return 0; + } + if(!subscriber_list) + { + subscriber_list = axutil_array_list_create(env, 0); + args->data = subscriber_list; + } + if(argc > 0) + { + subscriber = savan_subscriber_create(env); + } + for(i = 0; i < argc; i++) + { + if(0 == axutil_strcmp(col_name[i], "id")) + { + savan_subscriber_set_id(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "end_to")) + { + axis2_endpoint_ref_t *endto_epr = NULL; + endto_epr = axis2_endpoint_ref_create(env, argv[i]); + savan_subscriber_set_end_to(subscriber, env, endto_epr); + } + if(0 == axutil_strcmp(col_name[i], "notify_to")) + { + axis2_endpoint_ref_t *notify_epr = NULL; + notify_epr = axis2_endpoint_ref_create(env, argv[i]); + savan_subscriber_set_notify_to(subscriber, env, notify_epr); + } + if(0 == axutil_strcmp(col_name[i], "delivery_mode")) + { + savan_subscriber_set_delivery_mode(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "expires")) + { + savan_subscriber_set_expires(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "filter")) + { + savan_subscriber_set_filter(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "topic")) + { + savan_subscriber_set_topic(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "renewed")) + { + savan_subscriber_set_renew_status(subscriber, env, + AXIS2_ATOI(argv[i])); + } + } + if(subscriber) + axutil_array_list_add(subscriber_list, env, subscriber); + return 0; +} + +int AXIS2_CALL +savan_db_mgr_retrieve_callback( + void *not_used, + int argc, + char **argv, + char **col_name) +{ + int i = 0; + savan_db_mgr_args_t *args = (savan_db_mgr_args_t *) not_used; + const axutil_env_t *env = args->env; + savan_subscriber_t *subscriber = (savan_subscriber_t *) args->data; + if(argc < 1) + { + args->data = NULL; + return 0; + } + if(!subscriber && argc > 0) + { + subscriber = savan_subscriber_create(env); + args->data = subscriber; + } + for(i = 0; i < argc; i++) + { + if(0 == axutil_strcmp(col_name[i], "id")) + { + savan_subscriber_set_id(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "end_to")) + { + axis2_endpoint_ref_t *endto_epr = NULL; + endto_epr = axis2_endpoint_ref_create(env, argv[i]); + savan_subscriber_set_end_to(subscriber, env, endto_epr); + } + if(0 == axutil_strcmp(col_name[i], "notify_to")) + { + axis2_endpoint_ref_t *notify_epr = NULL; + notify_epr = axis2_endpoint_ref_create(env, argv[i]); + savan_subscriber_set_notify_to(subscriber, env, notify_epr); + } + if(0 == axutil_strcmp(col_name[i], "delivery_mode")) + { + savan_subscriber_set_delivery_mode(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "expires")) + { + savan_subscriber_set_expires(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "filter")) + { + savan_subscriber_set_filter(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "topic")) + { + savan_subscriber_set_topic(subscriber, env, argv[i]); + } + if(0 == axutil_strcmp(col_name[i], "renewed")) + { + savan_subscriber_set_renew_status(subscriber, env, + AXIS2_ATOI(argv[i])); + } + } + return 0; +} + +axis2_bool_t AXIS2_CALL +savan_db_mgr_insert( + savan_db_mgr_t *db_mgr, + const axutil_env_t *env, + savan_subscriber_t *subscriber, + axis2_char_t *sql_stmt_insert) +{ + axis2_char_t *error_msg = NULL; + int rc = -1; + sqlite3 *dbconn = NULL; + AXIS2_ENV_CHECK(env, AXIS2_FALSE); + + axutil_thread_mutex_lock(db_mgr->mutex); + dbconn = (sqlite3 *) savan_db_mgr_get_dbconn( + db_mgr, env); + if(!dbconn) + return AXIS2_FALSE; + rc = sqlite3_exec(dbconn, sql_stmt_insert, 0, 0, &error_msg); + if(rc == SQLITE_BUSY) + rc = savan_db_mgr_busy_handler(dbconn, sql_stmt_insert, + 0, 0, &error_msg, rc); + if( rc != SQLITE_OK ) + { + axutil_thread_mutex_unlock(db_mgr->mutex); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "sql stmt: %s. sql error: %s", + sql_stmt_insert, error_msg); + printf("sql_stmt_insert:%s\n", sql_stmt_insert); + printf("insert error_msg:%s\n", error_msg); + sqlite3_free(error_msg); + return AXIS2_FALSE; + } + axutil_thread_mutex_unlock(db_mgr->mutex); + return AXIS2_TRUE; +} + +axis2_bool_t AXIS2_CALL +savan_db_mgr_remove( + savan_db_mgr_t *db_mgr, + const axutil_env_t *env, + axis2_char_t *sql_stmt_remove) +{ + axis2_char_t *error_msg = NULL; + sqlite3 *dbconn = NULL; + int rc = -1; + AXIS2_ENV_CHECK(env, AXIS2_FALSE); + axutil_thread_mutex_lock(db_mgr->mutex); + dbconn = (sqlite3 *) savan_db_mgr_get_dbconn( + db_mgr, env); + if(!dbconn) + return AXIS2_FALSE; + rc = sqlite3_exec(dbconn, sql_stmt_remove, 0, 0, &error_msg); + if(rc == SQLITE_BUSY) + rc = savan_db_mgr_busy_handler(dbconn, sql_stmt_remove, + 0, 0, &error_msg, rc); + if(rc != SQLITE_OK ) + { + axutil_thread_mutex_unlock(db_mgr->mutex); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "sql stmt: %s. sql error: %s", + sql_stmt_remove, error_msg); + printf("sql_stmt_remove:%s\n", sql_stmt_remove); + printf("remove error_msg:%s\n", error_msg); + sqlite3_free(error_msg); + return AXIS2_FALSE; + } + axutil_thread_mutex_unlock(db_mgr->mutex); + return AXIS2_TRUE; +} + +savan_subscriber_t *AXIS2_CALL +savan_db_mgr_retrieve( + savan_db_mgr_t *db_mgr, + const axutil_env_t *env, + int (*retrieve_func)(void *, int, char **, char **), + axis2_char_t *sql_stmt_retrieve) +{ + savan_db_mgr_args_t *args = NULL; + axis2_char_t *error_msg = NULL; + savan_subscriber_t *subscriber = NULL; + sqlite3 *dbconn = NULL; + int rc = -1; + AXIS2_ENV_CHECK(env, AXIS2_FALSE); + axutil_thread_mutex_lock(db_mgr->mutex); + dbconn = (sqlite3 *) savan_db_mgr_get_dbconn( + db_mgr, env); + if(!dbconn) + return NULL; + args = AXIS2_MALLOC(env->allocator, sizeof(savan_db_mgr_args_t)); + args->env = (axutil_env_t*)env; + args->data = NULL; + rc = sqlite3_exec(dbconn, sql_stmt_retrieve, retrieve_func, args, + &error_msg); + if(rc == SQLITE_BUSY) + rc = savan_db_mgr_busy_handler(dbconn, sql_stmt_retrieve, + retrieve_func, args, &error_msg, rc); + if(rc != SQLITE_OK ) + { + axutil_thread_mutex_unlock(db_mgr->mutex); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "sql stmt: %s. sql error: %s", + sql_stmt_retrieve, error_msg); + printf("sql_stmt_retrieve:%s\n", sql_stmt_retrieve); + printf("retrieve error_msg:%s\n", error_msg); + sqlite3_free(error_msg); + return AXIS2_FALSE; + } + if(args->data) + subscriber = (savan_subscriber_t *) args->data; + if(args) + AXIS2_FREE(env->allocator, args); + axutil_thread_mutex_unlock(db_mgr->mutex); + return subscriber; +} + + +axis2_bool_t AXIS2_CALL +savan_db_mgr_update( + savan_db_mgr_t *db_mgr, + const axutil_env_t *env, + savan_subscriber_t *subscriber, + axis2_char_t *sql_stmt_update) +{ + sqlite3 *dbconn = NULL; + axis2_char_t *error_msg = NULL; + int rc = -1; + AXIS2_ENV_CHECK(env, AXIS2_FALSE); + axutil_thread_mutex_lock(db_mgr->mutex); + dbconn = (sqlite3 *) savan_db_mgr_get_dbconn( + db_mgr, env); + if(!dbconn) + return AXIS2_FALSE; + rc = sqlite3_exec(dbconn, sql_stmt_update, 0, 0, &error_msg); + if(rc == SQLITE_BUSY) + rc = savan_db_mgr_busy_handler(dbconn, sql_stmt_update, + 0, 0, &error_msg, rc); + if(rc != SQLITE_OK ) + { + axutil_thread_mutex_unlock(db_mgr->mutex); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "sql error %s", + error_msg); + printf("sql_stmt_update:%s\n", sql_stmt_update); + printf("update error_msg:%s\n", error_msg); + sqlite3_free(error_msg); + return AXIS2_FALSE; + } + axutil_thread_mutex_unlock(db_mgr->mutex); + return AXIS2_TRUE; +} + +axutil_array_list_t *AXIS2_CALL +savan_db_mgr_retrieve_all( + savan_db_mgr_t *db_mgr, + const axutil_env_t *env, + savan_subscriber_t *subscriber, + int (*find_func)(void *, int, char **, char **), + axis2_char_t *sql_stmt_find) +{ + savan_db_mgr_args_t *args = NULL; + axutil_array_list_t *subscriber_list = NULL; + int rc = -1; + sqlite3 *dbconn = NULL; + axis2_char_t *error_msg = NULL; + AXIS2_ENV_CHECK(env, AXIS2_FALSE); + subscriber_list = axutil_array_list_create(env, 0); + if(!subscriber_list) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + axutil_thread_mutex_lock(db_mgr->mutex); + args = AXIS2_MALLOC(env->allocator, sizeof(savan_db_mgr_args_t)); + args->env = (axutil_env_t*)env; + args->data = NULL; + dbconn = (sqlite3 *) savan_db_mgr_get_dbconn( + db_mgr, env); + if(!dbconn) + { + axutil_thread_mutex_unlock(db_mgr->mutex); + return NULL; + } + rc = sqlite3_exec(dbconn, sql_stmt_find, find_func, args, + &error_msg); + if(rc == SQLITE_BUSY) + rc = savan_db_mgr_busy_handler(dbconn, sql_stmt_find, + find_func, args, &error_msg, rc); + if(args->data) + subscriber_list = (axutil_array_list_t *) args->data; + if(rc != SQLITE_OK ) + { + axutil_thread_mutex_unlock(db_mgr->mutex); + if(subscriber_list) + axutil_array_list_free(subscriber_list, env); + if(args) + AXIS2_FREE(env->allocator, args); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "sql error %s", + error_msg); + printf("sql_stmt_find:%s\n", sql_stmt_find); + printf("retrieve error_msg:%s\n", error_msg); + sqlite3_free(error_msg); + return NULL; + } + if(args) + AXIS2_FREE(env->allocator, args); + axutil_thread_mutex_unlock(db_mgr->mutex); + /* Now we have a point-in-time view of the subscriber_list, lock them all.*/ + axutil_thread_mutex_unlock(db_mgr->mutex); + return subscriber_list; +} + +int +savan_db_mgr_busy_handler( + sqlite3* dbconn, + char *sql_stmt, + int (*callback_func)(void *, int, char **, char **), + void *args, + char **error_msg, + int rc) +{ + int counter = 0; + printf("in busy handler1\n"); + while(rc == SQLITE_BUSY && counter < 512) + { + printf("in busy handler\n"); + if(*error_msg) + sqlite3_free(*error_msg); + counter++; + AXIS2_USLEEP(100000); + rc = sqlite3_exec(dbconn, sql_stmt, callback_func, args, error_msg); + } + printf("in busy handler2\n"); + return rc; +} + +void * AXIS2_CALL +savan_db_mgr_get_dbconn( + savan_db_mgr_t *db_mgr, + const axutil_env_t *env) +{ + axis2_conf_ctx_t *conf_ctx = db_mgr->conf_ctx; + axis2_conf_t *conf = NULL; + axis2_char_t *path = NULL; + int rc = -1; + + conf = axis2_conf_ctx_get_conf(conf_ctx, env); + { + axis2_module_desc_t *module_desc = NULL; + axutil_qname_t *qname = NULL; + qname = axutil_qname_create(env, "savan", NULL, NULL); + module_desc = axis2_conf_get_module(conf, env, qname); + if(module_desc) + { + axutil_param_t *db_param = NULL; + db_param = axis2_module_desc_get_param(module_desc, env, SAVAN_DB); + if(db_param) + { + path = (axis2_char_t *) axutil_param_get_value(db_param, env); + } + } + axutil_qname_free(qname, env); + } + rc = sqlite3_open(path, &(db_mgr->dbconn)); + if(rc != SQLITE_OK) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Can't open database: %s" + " sqlite error: %s\n", path, sqlite3_errmsg(db_mgr->dbconn)); + sqlite3_close(db_mgr->dbconn); + return NULL; + } + return db_mgr->dbconn; +} +
