00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __RXV_SPIN_H__
00022 #define __RXV_SPIN_H__
00023
00070 #include <stdio.h>
00071 #include <stdlib.h>
00072 #include <stddef.h>
00073 #include <stdarg.h>
00074 #include <string.h>
00075 #include <unistd.h>
00076 #include <sys/types.h>
00077
00078 #include <apr.h>
00079 #include <apr_general.h>
00080 #include <apr_strings.h>
00081 #include <apr_lib.h>
00082 #include <apr_pools.h>
00083 #include <apr_buckets.h>
00084 #include <apr_hash.h>
00085 #include <apr_file_io.h>
00086 #include <apr_portable.h>
00087 #include <apr_time.h>
00088 #include <apr_ring.h>
00089 #include <apr_mmap.h>
00090 #include <apr_dbd.h>
00091 #include <apr_md5.h>
00092 #include <apr_base64.h>
00093 #include <apr_thread_proc.h>
00094 #include <apr_thread_mutex.h>
00095 #include <apreq_param.h>
00096 #include <apreq_cookie.h>
00097
00098
00099 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00100 #undef PACKAGE_BUGREPORT
00101 #undef PACKAGE_NAME
00102 #undef PACKAGE_STRING
00103 #undef PACKAGE_TARNAME
00104 #undef PACKAGE_VERSION
00105 #endif
00106
00107
00108 #include <apreq_module_apache2.h>
00109
00110
00111 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00112 #undef PACKAGE_BUGREPORT
00113 #undef PACKAGE_NAME
00114 #undef PACKAGE_STRING
00115 #undef PACKAGE_TARNAME
00116 #undef PACKAGE_VERSION
00117 #define PACKAGE_BUGREPORT RXV_SPIN_PACKAGE_BUGREPORT
00118 #define PACKAGE_NAME RXV_SPIN_PACKAGE_NAME
00119 #define PACKAGE_STRING RXV_SPIN_PACKAGE_STRING
00120 #define PACKAGE_TARNAME RXV_SPIN_PACKAGE_TARNAME
00121 #define PACKAGE_VERSION RXV_SPIN_PACKAGE_VERSION
00122 #endif
00123
00124 #include <http_request.h>
00125 #include <ap_regex.h>
00126 #include <ap_mpm.h>
00127
00128 #include <libxml/xmlreader.h>
00129 #include <libxml/xmlwriter.h>
00130
00138 typedef enum{
00139 RXV_SPIN_DATA_SGL=1,
00140 RXV_SPIN_DATA_RWS,
00141 RXV_SPIN_DATA_MTA
00142 } rxv_spin_data_e;
00143
00144 typedef enum{
00145 RXV_SPIN_TRIM_LEFT=1,
00146 RXV_SPIN_TRIM_RIGHT
00147 } rxv_spin_trim_e;
00148
00149 typedef struct rxv_spin_data rxv_spin_data_t;
00157 struct rxv_spin_data{
00158 rxv_spin_data_e type:2;
00159 apr_size_t size;
00160 union{
00161 char *data;
00162 apr_hash_t *cols;
00163 rxv_spin_data_t *meta;
00164 };
00165 };
00166
00176 typedef struct rxv_spin_ctx rxv_spin_ctx_t;
00185
00186
00200 rxv_spin_data_t *rxv_spin_single(apr_pool_t *pool,const char *str);
00201
00216 char *rxv_spin_single_get(rxv_spin_data_t *single);
00217
00232 rxv_spin_data_t *rxv_spin_single_set(rxv_spin_data_t *single,const char *str);
00233
00253 rxv_spin_data_t *rxv_spin_single_mem(apr_pool_t *pool,const char *str,
00254 apr_size_t size);
00255
00276 rxv_spin_data_t *rxv_spin_single_memset(rxv_spin_data_t *single,const char *str,
00277 apr_size_t size);
00278
00290 rxv_spin_data_t *rxv_spin_single_tolower(rxv_spin_data_t *single);
00291
00303 rxv_spin_data_t *rxv_spin_single_toupper(rxv_spin_data_t *single);
00304
00316 rxv_spin_data_t *rxv_spin_single_trim(rxv_spin_data_t *single,
00317 rxv_spin_trim_e what);
00318 #define rxv_spin_single_trimboth(s) \
00319 rxv_spin_single_trim((s),(RXV_SPIN_TRIM_LEFT|RXV_SPIN_TRIM_RIGHT))
00320
00321 #define rxv_spin_single_trimleft(s) \
00322 rxv_spin_single_trim((s),(RXV_SPIN_TRIM_LEFT))
00323
00324 #define rxv_spin_single_trimright(s) \
00325 rxv_spin_single_trim((s),(RXV_SPIN_TRIM_RIGHT))
00326
00346 rxv_spin_data_t *rxv_spin_meta(apr_pool_t *pool,...);
00347
00363 rxv_spin_data_t *rxv_spin_meta_vstr(apr_pool_t *pool,...);
00364
00387 rxv_spin_data_t *rxv_spin_meta_parse(apr_pool_t *pool,
00388 char *str,const char *sep);
00389
00405 rxv_spin_data_t *rxv_spin_meta_brigade(apr_pool_t *pool,apr_bucket_brigade *bb);
00406
00423 rxv_spin_data_t *rxv_spin_meta_empty(apr_pool_t *pool,apr_size_t size);
00424
00438 apr_hash_t *rxv_spin_meta_hash(apr_pool_t *pool,rxv_spin_data_t *data);
00439
00453 rxv_spin_data_t *rxv_spin_meta_mark(rxv_spin_data_t *data,apr_size_t element);
00454
00469 rxv_spin_data_t *rxv_spin_meta_markeach(rxv_spin_data_t *data,
00470 apr_size_t off,apr_size_t step);
00471
00488 rxv_spin_data_t *rxv_spin_meta_select(rxv_spin_data_t *data,
00489 rxv_spin_data_t *select,
00490 apr_hash_t *hash);
00491
00509 rxv_spin_data_t *rxv_spin_rows(apr_pool_t *pool,...);
00510
00525 apr_hash_t *rxv_spin_rows_hash(apr_pool_t *pool,rxv_spin_data_t *rows,
00526 const char *column);
00527
00541 rxv_spin_data_t *rxv_spin_rows_mark(rxv_spin_data_t *rows,const char *column,
00542 apr_size_t element);
00543
00558 rxv_spin_data_t *rxv_spin_rows_markeach(rxv_spin_data_t *rows,
00559 const char *column,
00560 apr_size_t off,apr_size_t step);
00561
00581 rxv_spin_data_t *rxv_spin_rows_select(rxv_spin_data_t *rows,
00582 rxv_spin_data_t *select,
00583 const char *column,const char *marker,
00584 apr_hash_t *hash);
00585
00602 rxv_spin_data_t *rxv_spin_column_get(apr_pool_t *pool,
00603 rxv_spin_data_t *rows,const char *key);
00604
00621 rxv_spin_data_t *rxv_spin_column_set(rxv_spin_data_t *rows,
00622 const char *key,rxv_spin_data_t *column);
00623 #define rxv_spin_column_del(rows,key) rxv_spin_column_set((rows),(key),NULL)
00624
00644 rxv_spin_data_t *rxv_spin_resize(apr_pool_t *pool,rxv_spin_data_t *data,
00645 apr_size_t size);
00646
00666 rxv_spin_data_t *rxv_spin_copy(apr_pool_t *pool,rxv_spin_data_t *data);
00667
00679 char *rxv_spin_str_tolower(const char *str);
00680
00692 char *rxv_spin_str_toupper(const char *str);
00693
00707 char *rxv_spin_str_trim(char *str,rxv_spin_trim_e what);
00708 #define rxv_spin_str_trimboth(s) \
00709 rxv_spin_str_trim((s),(RXV_SPIN_TRIM_LEFT|RXV_SPIN_TRIM_RIGHT))
00710
00711 #define rxv_spin_str_trimleft(s) \
00712 rxv_spin_str_trim((s),(RXV_SPIN_TRIM_LEFT))
00713
00714 #define rxv_spin_str_trimright(s) \
00715 rxv_spin_str_trim((s),(RXV_SPIN_TRIM_RIGHT))
00716
00725
00726
00737 apr_pool_t *rxv_spin_ctx_pool(rxv_spin_ctx_t *ctx);
00738
00749 apr_pool_t *rxv_spin_ctx_tpool(rxv_spin_ctx_t *ctx);
00750
00761 rxv_spin_data_t *rxv_spin_ctx_data(rxv_spin_ctx_t *ctx);
00762
00773 request_rec *rxv_spin_ctx_r(rxv_spin_ctx_t *ctx);
00774
00785 apreq_handle_t *rxv_spin_ctx_req(rxv_spin_ctx_t *ctx);
00786
00797 void *rxv_spin_ctx_xget(rxv_spin_ctx_t *ctx);
00798
00810 void *rxv_spin_ctx_xset(rxv_spin_ctx_t *ctx,void *extra);
00811
00823 rxv_spin_data_t *rxv_spin_ctx_get(rxv_spin_ctx_t *ctx,const char *key);
00824 #define rxv_spin_ctx_strget(ctx,key) \
00825 rxv_spin_single_get(rxv_spin_ctx_get((ctx),(key)))
00826
00856 rxv_spin_data_t *rxv_spin_ctx_set(rxv_spin_ctx_t *ctx,
00857 const char *key,rxv_spin_data_t *value);
00858 #define rxv_spin_ctx_strset(ctx,key,val) \
00859 rxv_spin_ctx_set((ctx),(key),rxv_spin_single(rxv_spin_ctx_pool(ctx),(val)))
00860
00861 #define rxv_spin_ctx_del(ctx,key) rxv_spin_ctx_set((ctx),(key),NULL)
00862
00866
00867
00886 rxv_spin_data_t *rxv_spin_app_get(rxv_spin_ctx_t *ctx,const char *key);
00887 #define rxv_spin_app_strget(ctx,key) \
00888 rxv_spin_single_get(rxv_spin_app_get((ctx),(key)))
00889
00909 rxv_spin_data_t *rxv_spin_app_set(rxv_spin_ctx_t *ctx,
00910 const char *key,rxv_spin_data_t *val);
00911 #define rxv_spin_app_strset(ctx,key,val) \
00912 rxv_spin_app_set((ctx),(key),rxv_spin_single(rxv_spin_ctx_pool(ctx),(val)))
00913
00927 apr_status_t rxv_spin_app_del(rxv_spin_ctx_t *ctx,const char *key);
00928
00940 rxv_spin_data_t *rxv_spin_ses_get(rxv_spin_ctx_t *ctx,const char *key);
00941 #define rxv_spin_ses_strget(ctx,key) \
00942 rxv_spin_single_get(rxv_spin_ses_get((ctx),(key)))
00943
00963 rxv_spin_data_t *rxv_spin_ses_set(rxv_spin_ctx_t *ctx,
00964 const char *key,rxv_spin_data_t *val);
00965 #define rxv_spin_ses_strset(ctx,key,val) \
00966 rxv_spin_ses_set((ctx),(key),rxv_spin_single(rxv_spin_ctx_pool(ctx),(val)))
00967
00981 apr_status_t rxv_spin_ses_del(rxv_spin_ctx_t *ctx,const char *key);
00982
00999 char *rxv_spin_ses_id(rxv_spin_ctx_t *ctx);
01000
01016 int rxv_spin_ses_valid(rxv_spin_ctx_t *ctx);
01017
01028 apr_time_t rxv_spin_ses_atime(rxv_spin_ctx_t *ctx);
01029
01032
01033
01034
01035 typedef struct rxv_spin_db rxv_spin_db_t;
01036 typedef struct rxv_spin_db_txn rxv_spin_db_txn_t;
01055 apr_pool_t *rxv_spin_db_pool(rxv_spin_db_t *db);
01056
01067 char *rxv_spin_db_cinfo(rxv_spin_db_t *db);
01068
01079 const apr_dbd_driver_t *rxv_spin_db_driver(rxv_spin_db_t *db);
01080
01091 apr_dbd_t *rxv_spin_db_handle(rxv_spin_db_t *db);
01092
01105 apr_dbd_transaction_t *rxv_spin_db_txn(rxv_spin_db_txn_t *txn);
01106
01131 rxv_spin_db_t *rxv_spin_db_connect(rxv_spin_ctx_t *ctx,const char *conninfo);
01132
01148 rxv_spin_data_t *rxv_spin_db_data(apr_pool_t *pool,rxv_spin_db_t *db,
01149 apr_dbd_results_t *dbdres);
01150
01165 rxv_spin_data_t *rxv_spin_db_select(apr_pool_t *pool,rxv_spin_db_t *db,
01166 const char *query);
01167
01180 int rxv_spin_db_query(apr_pool_t *pool,rxv_spin_db_t *db,const char *query);
01181
01207 rxv_spin_data_t *rxv_spin_db_pselect(apr_pool_t *pool,rxv_spin_db_t *db,
01208 const char *query,...);
01209
01235 int rxv_spin_db_pquery(apr_pool_t *pool,rxv_spin_db_t *db,
01236 const char *query,...);
01237
01253 rxv_spin_db_txn_t *rxv_spin_db_start(apr_pool_t *pool,rxv_spin_db_t *db);
01254
01265 apr_status_t rxv_spin_db_end(rxv_spin_db_txn_t *txn);
01266
01278 apr_status_t rxv_spin_db_status(apr_pool_t *pool,rxv_spin_db_t *db);
01279
01300 void *rxv_spin_conn_get(rxv_spin_ctx_t *ctx,const char *conninfo);
01301
01337 void *rxv_spin_conn_set(rxv_spin_ctx_t *ctx,
01338 const char *conninfo,void *conn,
01339 apr_status_t (*cleanup)(void *data));
01340
01350 typedef void (*rxv_spin_init_t)(rxv_spin_ctx_t *ctx);
01352 typedef int (*rxv_spin_prepare_t)(rxv_spin_ctx_t *ctx);
01354 typedef int (*rxv_spin_service_t)(rxv_spin_ctx_t *ctx);
01359
01360
01382 apr_status_t rxv_spin_dso_load(rxv_spin_ctx_t *ctx,const char *path,
01383 apr_dso_handle_t **handle);
01384
01405 char *rxv_spin_hash(apr_pool_t *pool,const char *uniq);
01406
01419 char *rxv_spin_hmac(apr_pool_t *pool,const char *uniq,const char *salt);
01420
01423 #endif