You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by da...@apache.org on 2006/12/08 11:49:05 UTC
svn commit: r483928 -
/webservices/sandesha/trunk/c/src/storage/inmemory/inmemory_bean_mgr.c
Author: damitha
Date: Fri Dec 8 02:49:04 2006
New Revision: 483928
URL: http://svn.apache.org/viewvc?view=rev&rev=483928
Log:
added missing file
Added:
webservices/sandesha/trunk/c/src/storage/inmemory/inmemory_bean_mgr.c
Added: webservices/sandesha/trunk/c/src/storage/inmemory/inmemory_bean_mgr.c
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/c/src/storage/inmemory/inmemory_bean_mgr.c?view=auto&rev=483928
==============================================================================
--- webservices/sandesha/trunk/c/src/storage/inmemory/inmemory_bean_mgr.c (added)
+++ webservices/sandesha/trunk/c/src/storage/inmemory/inmemory_bean_mgr.c Fri Dec 8 02:49:04 2006
@@ -0,0 +1,423 @@
+/*
+ * 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 <sandesha2_inmemory_bean_mgr.h>
+#include <sandesha2_constants.h>
+#include <sandesha2_inmemory_bean_mgr.h>
+#include <sandesha2_error.h>
+#include <sandesha2_storage_mgr.h>
+#include <axis2_log.h>
+#include <axis2_hash.h>
+#include <axis2_thread.h>
+#include <axis2_property.h>
+
+/**
+ * @brief Sandesha2 Inmemory Bean Manager Struct Impl
+ * Sandesha2 Inmemory Bean Manager
+ */
+typedef struct sandesha2_inmemory_bean_mgr_impl
+{
+ sandesha2_inmemory_bean_mgr_t bean_mgr;
+ axis2_hash_t *table;
+ sandesha2_storage_mgr_t *storage_mgr;
+ axis2_thread_mutex_t *mutex;
+
+}sandesha2_inmemory_bean_mgr_impl_t;
+
+#define SANDESHA2_INTF_TO_IMPL(bean_mgr) \
+ ((sandesha2_inmemory_bean_mgr_impl_t *) bean_mgr)
+
+axis2_status_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_free(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env)
+{
+ return bean_mgr->ops.free(bean_mgr, env);
+}
+
+axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_insert(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key,
+ sandesha2_rm_bean_t *bean)
+{
+ return bean_mgr->ops.insert(bean_mgr, env, key, bean);
+}
+
+axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_remove(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key)
+{
+ return bean_mgr->ops.remove(bean_mgr, env, key);
+}
+
+sandesha2_rm_bean_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_retrieve(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key)
+{
+ return bean_mgr->ops.retrieve(bean_mgr, env, key);
+}
+
+axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_update(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key,
+ sandesha2_rm_bean_t *bean)
+{
+ return bean_mgr->ops.update(bean_mgr, env, key, bean);
+}
+
+axis2_array_list_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_find(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ sandesha2_rm_bean_t *bean)
+{
+ return bean_mgr->ops.find(bean_mgr, env, bean);
+}
+
+sandesha2_rm_bean_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_find_unique(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ sandesha2_rm_bean_t *bean)
+{
+ return bean_mgr->ops.find_unique(bean_mgr, env, bean);
+}
+
+axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_match(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ sandesha2_rm_bean_t *bean,
+ sandesha2_rm_bean_t *candidate)
+{
+ return bean_mgr->ops.match(bean_mgr, env, bean, candidate);
+}
+
+static axis2_status_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_free_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env);
+
+static axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_insert_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key,
+ sandesha2_rm_bean_t *bean);
+
+static axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_remove_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key);
+
+static sandesha2_rm_bean_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_retrieve_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key);
+
+static axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_update_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key,
+ sandesha2_rm_bean_t *bean);
+
+static axis2_array_list_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_find_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ sandesha2_rm_bean_t *bean);
+
+static sandesha2_rm_bean_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_find_unique_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ sandesha2_rm_bean_t *bean);
+
+const static sandesha2_inmemory_bean_mgr_ops_t bean_mgr_ops =
+{
+ sandesha2_inmemory_bean_mgr_free_impl,
+ sandesha2_inmemory_bean_mgr_insert_impl,
+ sandesha2_inmemory_bean_mgr_remove_impl,
+ sandesha2_inmemory_bean_mgr_retrieve_impl,
+ sandesha2_inmemory_bean_mgr_update_impl,
+ sandesha2_inmemory_bean_mgr_find_impl,
+ sandesha2_inmemory_bean_mgr_find_unique_impl,
+ NULL
+};
+
+AXIS2_EXTERN sandesha2_inmemory_bean_mgr_t * AXIS2_CALL
+sandesha2_inmemory_bean_mgr_create(
+ const axis2_env_t *env,
+ sandesha2_storage_mgr_t *storage_mgr,
+ axis2_ctx_t *ctx,
+ axis2_char_t *key)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ axis2_property_t *property = NULL;
+
+ AXIS2_ENV_CHECK(env, NULL);
+ bean_mgr_impl = AXIS2_MALLOC(env->allocator,
+ sizeof(sandesha2_inmemory_bean_mgr_impl_t));
+
+ bean_mgr_impl->table = NULL;
+ bean_mgr_impl->storage_mgr = storage_mgr;
+ bean_mgr_impl->mutex = NULL;
+
+ bean_mgr_impl->mutex = axis2_thread_mutex_create(env->allocator,
+ AXIS2_THREAD_MUTEX_DEFAULT);
+ if(!bean_mgr_impl->mutex)
+ {
+ sandesha2_inmemory_bean_mgr_free(&(bean_mgr_impl->bean_mgr), env);
+ return NULL;
+ }
+ property = AXIS2_CTX_GET_PROPERTY(ctx, env, key, AXIS2_FALSE);
+ if(property)
+ bean_mgr_impl->table = (axis2_hash_t *) AXIS2_PROPERTY_GET_VALUE(
+ property, env);
+ if(!bean_mgr_impl->table)
+ {
+ axis2_property_t *property = NULL;
+ property = axis2_property_create(env);
+ bean_mgr_impl->table = axis2_hash_make(env);
+ if(!property || !bean_mgr_impl->table)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+ return NULL;
+ }
+ AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_APPLICATION);
+ AXIS2_PROPERTY_SET_VALUE(property, env, bean_mgr_impl->table);
+ AXIS2_PROPERTY_SET_FREE_FUNC(property, env, axis2_hash_free_void_arg);
+ AXIS2_CTX_SET_PROPERTY(ctx, env, key, property, AXIS2_FALSE);
+ }
+ bean_mgr_impl->bean_mgr.ops = bean_mgr_ops;
+ return &(bean_mgr_impl->bean_mgr);
+}
+
+static axis2_status_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_free_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ bean_mgr_impl = SANDESHA2_INTF_TO_IMPL(bean_mgr);
+
+ if(bean_mgr_impl->mutex)
+ {
+ axis2_thread_mutex_destroy(bean_mgr_impl->mutex);
+ bean_mgr_impl->mutex = NULL;
+ }
+ if(bean_mgr_impl->table)
+ {
+ axis2_hash_free(bean_mgr_impl->table, env);
+ bean_mgr_impl->table = NULL;
+ }
+ if(bean_mgr_impl)
+ {
+ AXIS2_FREE(env->allocator, bean_mgr_impl);
+ bean_mgr_impl = NULL;
+ }
+ return AXIS2_SUCCESS;
+}
+
+static axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_insert_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key,
+ sandesha2_rm_bean_t *bean)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ AXIS2_ENV_CHECK(env, AXIS2_FALSE);
+ AXIS2_PARAM_CHECK(env->error, bean, AXIS2_FALSE);
+ bean_mgr_impl = SANDESHA2_INTF_TO_IMPL(bean_mgr);
+ sandesha2_storage_mgr_enlist_bean(bean_mgr_impl->storage_mgr, env, bean);
+ axis2_thread_mutex_lock(bean_mgr_impl->mutex);
+ axis2_hash_set(bean_mgr_impl->table, key, AXIS2_HASH_KEY_STRING, bean);
+ axis2_thread_mutex_unlock(bean_mgr_impl->mutex);
+ return AXIS2_TRUE;
+}
+
+static axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_remove_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ sandesha2_rm_bean_t *bean = NULL;
+ AXIS2_ENV_CHECK(env, AXIS2_FALSE);
+ AXIS2_PARAM_CHECK(env->error, key, AXIS2_FALSE);
+ bean_mgr_impl = SANDESHA2_INTF_TO_IMPL(bean_mgr);
+ axis2_thread_mutex_lock(bean_mgr_impl->mutex);
+ bean = (sandesha2_rm_bean_t *) axis2_hash_get(bean_mgr_impl->table, key,
+ AXIS2_HASH_KEY_STRING);
+ axis2_thread_mutex_unlock(bean_mgr_impl->mutex);
+ if(bean)
+ sandesha2_storage_mgr_enlist_bean(bean_mgr_impl->storage_mgr, env, bean);
+ axis2_thread_mutex_lock(bean_mgr_impl->mutex);
+ axis2_hash_set(bean_mgr_impl->table, key, AXIS2_HASH_KEY_STRING, NULL);
+ axis2_thread_mutex_unlock(bean_mgr_impl->mutex);
+ return AXIS2_TRUE;
+}
+
+static sandesha2_rm_bean_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_retrieve_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ sandesha2_rm_bean_t *bean = NULL;
+ AXIS2_ENV_CHECK(env, AXIS2_FALSE);
+ AXIS2_PARAM_CHECK(env->error, key, AXIS2_FALSE);
+ bean_mgr_impl = SANDESHA2_INTF_TO_IMPL(bean_mgr);
+ axis2_thread_mutex_lock(bean_mgr_impl->mutex);
+ bean = (sandesha2_rm_bean_t *) axis2_hash_get(bean_mgr_impl->table,
+ key, AXIS2_HASH_KEY_STRING);
+ axis2_thread_mutex_unlock(bean_mgr_impl->mutex);
+ if(bean)
+ sandesha2_storage_mgr_enlist_bean(bean_mgr_impl->storage_mgr, env, bean);
+ axis2_thread_mutex_lock(bean_mgr_impl->mutex);
+ bean = (sandesha2_rm_bean_t *) axis2_hash_get(bean_mgr_impl->table,
+ key, AXIS2_HASH_KEY_STRING);
+ axis2_thread_mutex_unlock(bean_mgr_impl->mutex);
+ return bean;
+}
+
+static axis2_bool_t AXIS2_CALL
+sandesha2_inmemory_bean_mgr_update_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ axis2_char_t *key,
+ sandesha2_rm_bean_t *bean)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ sandesha2_rm_bean_t *old_bean = NULL;
+ AXIS2_ENV_CHECK(env, AXIS2_FALSE);
+ AXIS2_PARAM_CHECK(env->error, bean, AXIS2_FALSE);
+ bean_mgr_impl = SANDESHA2_INTF_TO_IMPL(bean_mgr);
+ if(bean)
+ sandesha2_storage_mgr_enlist_bean(bean_mgr_impl->storage_mgr, env, bean);
+ axis2_thread_mutex_lock(bean_mgr_impl->mutex);
+ old_bean = (sandesha2_rm_bean_t *) axis2_hash_get(bean_mgr_impl->table, key,
+ AXIS2_HASH_KEY_STRING);
+ axis2_hash_set(bean_mgr_impl->table, key, AXIS2_HASH_KEY_STRING, bean);
+ axis2_thread_mutex_unlock(bean_mgr_impl->mutex);
+ if(!old_bean)
+ return AXIS2_FALSE;
+ sandesha2_storage_mgr_enlist_bean(bean_mgr_impl->storage_mgr, env, old_bean);
+ return AXIS2_TRUE;
+}
+
+static axis2_array_list_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_find_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ sandesha2_rm_bean_t *bean)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ axis2_array_list_t *beans = NULL;
+ axis2_hash_index_t *index = NULL;
+ void *v = NULL;
+ int i = 0, size = 0;
+ axis2_bool_t remove = AXIS2_TRUE;
+ AXIS2_ENV_CHECK(env, AXIS2_FALSE);
+ bean_mgr_impl = SANDESHA2_INTF_TO_IMPL(bean_mgr);
+ beans = axis2_array_list_create(env, 0);
+ if(!beans)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+ return NULL;
+ }
+ axis2_thread_mutex_lock(bean_mgr_impl->mutex);
+ for (index = axis2_hash_first (bean_mgr_impl->table, env); index;
+ index = axis2_hash_next (env, index))
+ {
+ sandesha2_rm_bean_t *candidate = NULL;
+ axis2_hash_this (index, NULL, NULL, &v);
+ candidate = (sandesha2_rm_bean_t *) v;
+
+ if(bean && bean == candidate)
+ remove = AXIS2_FALSE;
+ if(bean && sandesha2_inmemory_bean_mgr_match(bean_mgr, env, bean,
+ candidate))
+ {
+ AXIS2_ARRAY_LIST_ADD(beans, env, candidate);
+ }
+ if(!bean)
+ AXIS2_ARRAY_LIST_ADD(beans, env, candidate);
+ }
+ axis2_thread_mutex_unlock(bean_mgr_impl->mutex);
+ /* Now we have a point-in-time view of the beans, lock them all.*/
+ size = AXIS2_ARRAY_LIST_SIZE(beans, env);
+ for(i = 0; i < size; i++)
+ {
+ sandesha2_rm_bean_t *temp = AXIS2_ARRAY_LIST_GET(beans, env, i);
+ sandesha2_storage_mgr_enlist_bean(bean_mgr_impl->storage_mgr, env, temp);
+
+ }
+ /* Finally remove any beans that are no longer in the table */
+ if(remove && size > 0)
+ {
+ int idx = AXIS2_ARRAY_LIST_INDEX_OF(beans, env, bean);
+ if(idx != -1)
+ AXIS2_ARRAY_LIST_REMOVE(beans, env, idx);
+ }
+ return beans;
+}
+
+static sandesha2_rm_bean_t *AXIS2_CALL
+sandesha2_inmemory_bean_mgr_find_unique_impl(
+ sandesha2_inmemory_bean_mgr_t *bean_mgr,
+ const axis2_env_t *env,
+ sandesha2_rm_bean_t *bean)
+{
+ sandesha2_inmemory_bean_mgr_impl_t *bean_mgr_impl = NULL;
+ axis2_array_list_t *beans = NULL;
+ int i = 0, size = 0;
+ sandesha2_rm_bean_t *ret = NULL;
+ AXIS2_ENV_CHECK(env, AXIS2_FALSE);
+ AXIS2_PARAM_CHECK(env->error, bean, AXIS2_FALSE);
+ bean_mgr_impl = SANDESHA2_INTF_TO_IMPL(bean_mgr);
+ beans = sandesha2_inmemory_bean_mgr_find(bean_mgr, env, bean);
+ if(beans)
+ size = AXIS2_ARRAY_LIST_SIZE(beans, env);
+ if( size > 1)
+ {
+ AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[sandesha2] Non-Unique result");
+ AXIS2_ERROR_SET(env->error, SANDESHA2_ERROR_NON_UNIQUE_RESULT, AXIS2_FAILURE);
+ return NULL;
+ }
+ for(i = 0; i < size; i++)
+ {
+ ret = AXIS2_ARRAY_LIST_GET(beans, env, i);
+ break;
+ }
+ return ret;
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org