This I suppose should go into a utils module.

Many had concerns using APR as part and parcel of axis2c. Hence this wrapper would be useful so that if someone do not want APR, (s)he can implement this API and use any other implementation of choice.

Thanks,
Samisa...
nandika jayawardana wrote:

Hi all,

since apr is supposed to be kept out of the axis2 code , i wrote a wrapper to apr_hash
which has been used in the axis2 code
I have atttached the axis2_hash.h and axis2_hash.c files and a test.

Thanks

Nandika

------------------------------------------------------------------------

/*
* 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 Licaxiander the License.
*/


#include <apr_pools.h>
#include <apr_hash.h>
#include "axis2_hash.h"

static apr_pool_t *hashpool;

void axis2_hash_ops_set(axis2_hash_t *ht,void *key,size_t klen,const void *val)
{
        if( !ht || !key)
                return;
                (apr_hash_t*)(ht->hashtable);
        apr_hash_set((apr_hash_t*)(ht->hashtable),key,klen,val);
}

void *axis2_hash_ops_get(axis2_hash_t *ht,void *key,size_t klen)
{
        if(!ht || !key)
                return NULL;
        return apr_hash_get((apr_hash_t*)ht->hashtable,key,klen);
}


int axis2_hash_ops_first(axis2_hash_t *ht)
{
        ht->hashindex = apr_hash_first(hashpool,ht->hashtable);
        return (ht->hashindex) != NULL ? 1 : 0 ;
}

int axis2_hash_ops_has_next(axis2_hash_t *ht)
{
        if(!(ht->hashindex))
                return 0;
        ht->hashindex = apr_hash_next((apr_hash_index_t*)ht->hashindex);
        
        return (ht->hashindex)!= NULL ? 1 : 0;
}

void axis2_hash_ops_this(axis2_hash_t *ht,void **key,size_t klen,void **val)
{
        if(!ht)
                return;
        apr_hash_this((apr_hash_index_t *)(ht->hashindex),key,klen,val);     
}

axis2_hash_t *axis2_hash_create()
{
        axis2_hash_t *ht = (axis2_hash_t*)malloc(sizeof(axis2_hash_t));
        apr_status_t status;
        if(!ht)
                return NULL;

        if(!hashpool)
        {
                status = apr_pool_create (&hashpool, NULL);
       //if(!status)
        //  return NULL;
   }
ht->hashtable = apr_hash_make (hashpool);
        ht->hashindex = NULL;
        
        ht->ops = (axis2_hash_ops_t*)malloc(sizeof(axis2_hash_ops_t));
        ht->ops->set = axis2_hash_ops_set;
        ht->ops->get = axis2_hash_ops_get;
        ht->ops->first = axis2_hash_ops_first;
        ht->ops->has_next = axis2_hash_ops_has_next;
        ht->ops->this = axis2_hash_ops_this;
        return ht;      
}


------------------------------------------------------------------------

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

#ifndef AXIS2_HASH_H
#define AXIS2_HASH_H

#include <stdlib.h>

struct axis2_hash;
struct axis2_hash_ops;
struct axis2_hash_index;

        
typedef struct axis2_hash axis2_hash_t;
typedef struct axis2_hash_ops axis2_hash_ops_t;
typedef struct axis2_hash_index axis2_hash_index_t;

struct axis2_hash_ops
{
    void (*set)(axis2_hash_t *ht,void *key,size_t klen,const void *val);
         void *(*get)(axis2_hash_t *ht,void *key,size_t klen);
         int (*first)(axis2_hash_t *ht);
         int  (*has_next)(axis2_hash_t *ht);
         void (*this)(axis2_hash_t *ht,void **key,size_t klen,void **val);
};

struct axis2_hash
{
        struct axis2_hash_ops *ops;
        void *hashindex;
        void *hashtable;
};

axis2_hash_t *axis2_hash_create();


#define axis2_hash_set(hashtable,key,klen,value) 
((hashtable)->ops->set((hashtable),(key),(klen),(value)))
#define axis2_hash_get(hashtable,key,klen)       
((hashtable)->ops->get((hashtable),(key),(klen)))
#define axis2_hash_first(hashtable)     ((hashtable)->ops->first((hashtable)))
#define axis2_hash_has_next(hashtable)  ((hashtable)->ops->has_next(hashtable))
/**
This macro contains out parameters hashtable - pointer to axis2_hash_t
  key       - ** pointer to key
  klen      -
  val       - ** pointer to value
*/

#define axis2_hash_this(hashtable,key,klen,value)  
((hashtable)->ops->this((hashtable),(key),(klen),(value)))
#define AXIS2_HASH_KEY_STRING (-1)

#endif // AXIS2_HASH_H

------------------------------------------------------------------------

#include <stdio.h>
#include <apr.h>
#include "axis2_hash.h"
#include <apr_pools.h>
#include <apr_hash.h>

typedef struct a
{
   char *value;
}a;



int main()
{
axis2_hash_t *ht;
a *a1,*a2 ,*a3,*a4;

int i=0;
void *v =NULL;

char *key1 = "key1";
char *key2 = "key2";
char *key3 = "key3";
char *key4 = "key4";

a1 = (a*)malloc(sizeof(a));
a2 = (a*)malloc(sizeof(a));
a3 = (a*)malloc(sizeof(a));
a4 = (a*)malloc(sizeof(a));


a1->value = strdup("key1");
a2->value = strdup("key2");
a3->value = strdup("key3");
a4->value = strdup("key4");

if(apr_initialize()!= APR_SUCCESS)
{
   return;
}
ht = axis2_hash_create();

axis2_hash_set(ht,key1,AXIS2_HASH_KEY_STRING,a1);
axis2_hash_set(ht,key2,AXIS2_HASH_KEY_STRING,a2);
axis2_hash_set(ht,key3,AXIS2_HASH_KEY_STRING,a3);
axis2_hash_set(ht,key4,AXIS2_HASH_KEY_STRING,a4);

for(i = axis2_hash_first(ht); i > 0 ; i = axis2_hash_has_next(ht))
{
axis2_hash_this(ht,NULL,NULL,&v); printf("\n %s \n",((a*)v)->value);
}

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key1,AXIS2_HASH_KEY_STRING))->value);

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key2,AXIS2_HASH_KEY_STRING))->value);

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key3,AXIS2_HASH_KEY_STRING))->value);

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key4,AXIS2_HASH_KEY_STRING))->value);
getchar();
}

Reply via email to