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 #define RXV_SPIN_STDC_HEADERS 1
00071 #define RXV_SPIN_HAVE_UNISTD_H 1
00072 #define RXV_SPIN_HAVE_SYS_TYPES_H 1
00073 #define RXV_SPIN_HAVE_APR_STRINGS_H 1
00074 #define RXV_SPIN_HAVE_APR_POOLS_H 1
00075 #define RXV_SPIN_HAVE_APR_HASH_H 1
00076 #define RXV_SPIN_HAVE_APR_TIME_H 1
00077 #define RXV_SPIN_HAVE_APR_DSO_H 1
00078 #define RXV_SPIN_HAVE_APR_BUCKETS_H 1
00079 #define RXV_SPIN_HAVE_APR_DBD_H 1
00080 #define RXV_SPIN_HAVE_APREQ_PARAM_H 1
00081 #define RXV_SPIN_HAVE_APREQ_COOKIE_H 1
00082 #define RXV_SPIN_HAVE_APREQ_MODULE_H 1
00083 #define RXV_SPIN_HAVE_HTTPD_H 1
00084 #define RXV_SPIN_HAVE_HTTP_REQUEST_H 1
00085 #define RXV_SPIN_HAVE_AP_REGEX_H 1
00086
00087 #include <stdio.h>
00088 #if RXV_SPIN_STDC_HEADERS
00089 #include <stdlib.h>
00090 #include <stddef.h>
00091 #include <stdarg.h>
00092 #include <string.h>
00093 #endif
00094 #if RXV_SPIN_HAVE_UNISTD_H
00095 #include <unistd.h>
00096 #endif
00097 #if RXV_SPIN_HAVE_SYS_TYPES_H
00098 #include <sys/types.h>
00099 #endif
00100
00101 #if RXV_SPIN_HAVE_APR_STRINGS_H
00102 #include <apr_strings.h>
00103 #endif
00104 #if RXV_SPIN_HAVE_APR_POOLS_H
00105 #include <apr_pools.h>
00106 #endif
00107 #if RXV_SPIN_HAVE_APR_HASH_H
00108 #include <apr_hash.h>
00109 #endif
00110 #if RXV_SPIN_HAVE_APR_TIME_H
00111 #include <apr_time.h>
00112 #endif
00113 #if RXV_SPIN_HAVE_APR_DSO_H
00114 #include <apr_dso.h>
00115 #endif
00116 #if RXV_SPIN_HAVE_APR_BUCKETS_H
00117 #include <apr_buckets.h>
00118 #endif
00119 #if RXV_SPIN_HAVE_APR_DBD_H
00120 #include <apr_dbd.h>
00121 #endif
00122
00123 #if RXV_SPIN_HAVE_APREQ_PARAM_H
00124 #include <apreq_param.h>
00125 #endif
00126 #if RXV_SPIN_HAVE_APREQ_COOKIE_H
00127 #include <apreq_cookie.h>
00128 #endif
00129 #if RXV_SPIN_HAVE_APREQ_MODULE_H
00130 #include <apreq_module.h>
00131 #endif
00132
00133
00134 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00135 #undef PACKAGE_BUGREPORT
00136 #undef PACKAGE_NAME
00137 #undef PACKAGE_STRING
00138 #undef PACKAGE_TARNAME
00139 #undef PACKAGE_VERSION
00140 #endif
00141
00142 #if RXV_SPIN_HAVE_HTTPD_H
00143 #include <httpd.h>
00144 #endif
00145
00146
00147 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00148 #undef PACKAGE_BUGREPORT
00149 #undef PACKAGE_NAME
00150 #undef PACKAGE_STRING
00151 #undef PACKAGE_TARNAME
00152 #undef PACKAGE_VERSION
00153 #define PACKAGE_BUGREPORT RXV_SPIN_PACKAGE_BUGREPORT
00154 #define PACKAGE_NAME RXV_SPIN_PACKAGE_NAME
00155 #define PACKAGE_STRING RXV_SPIN_PACKAGE_STRING
00156 #define PACKAGE_TARNAME RXV_SPIN_PACKAGE_TARNAME
00157 #define PACKAGE_VERSION RXV_SPIN_PACKAGE_VERSION
00158 #endif
00159
00160 #if RXV_SPIN_HAVE_HTTP_REQUEST_H
00161 #include <http_request.h>
00162 #endif
00163 #if RXV_SPIN_HAVE_AP_REGEX_H
00164 #include <ap_regex.h>
00165 #endif
00166
00174 typedef enum{
00175 RXV_SPIN_TRIM_LEFT=1,
00176 RXV_SPIN_TRIM_RIGHT
00177 } rxv_spin_trim_e;
00178
00179 typedef struct rxv_spin_data rxv_spin_data_t;
00180 typedef struct rxv_spin_curs rxv_spin_curs_t;
00191 typedef struct rxv_spin_ctx rxv_spin_ctx_t;
00200
00201
00217 rxv_spin_data_t *rxv_spin_datum(apr_pool_t *pool,const char *str,
00218 rxv_spin_data_t *data);
00219
00241 rxv_spin_data_t *rxv_spin_mdatum(apr_pool_t *pool,const char *str,
00242 apr_size_t size,rxv_spin_data_t *data);
00243
00254 char *rxv_spin_string(rxv_spin_data_t *single);
00255
00275 apr_hash_t *rxv_spin_guts(rxv_spin_data_t *rows);
00276
00288 apr_size_t rxv_spin_size(rxv_spin_data_t *data);
00289
00290 #define rxv_spin_multi(d) (!rxv_spin_string(d) && rxv_spin_size(d)>0)
00291
00292 #define rxv_spin_single(d) (!rxv_spin_multi(d))
00293
00314 rxv_spin_data_t *rxv_spin_column(apr_pool_t *pool,const char *name,
00315 rxv_spin_data_t *data,...)
00316 #if defined(__GNUC__) && __GNUC__ >= 4
00317 __attribute__((sentinel))
00318 #endif
00319 ;
00320
00344 rxv_spin_data_t *rxv_spin_parse(apr_pool_t *pool,const char *name,
00345 char *str,const char *sep,
00346 rxv_spin_data_t *data);
00347
00364 rxv_spin_data_t *rxv_spin_array(apr_pool_t *pool,const char *name,
00365 apr_array_header_t *arr,rxv_spin_data_t *data);
00366
00383 rxv_spin_data_t *rxv_spin_brigade(apr_pool_t *pool,const char *name,
00384 apr_bucket_brigade *bb,
00385 rxv_spin_data_t *data);
00386
00402 rxv_spin_data_t *rxv_spin_null(apr_pool_t *pool,const char *name,
00403 apr_size_t size,rxv_spin_data_t *data);
00404
00425 rxv_spin_data_t *rxv_spin_rows(apr_pool_t *pool,rxv_spin_data_t *data,...)
00426 #if defined(__GNUC__) && __GNUC__ >= 4
00427 __attribute__((sentinel))
00428 #endif
00429 ;
00430
00447 apr_size_t rxv_spin_first(apr_pool_t *pool,rxv_spin_data_t *rows,...)
00448 #if defined(__GNUC__) && __GNUC__ >= 4
00449 __attribute__((sentinel))
00450 #endif
00451 ;
00452
00468 apr_size_t rxv_spin_next(rxv_spin_curs_t *curs);
00469
00480 rxv_spin_data_t *rxv_spin_this(rxv_spin_curs_t *curs);
00481
00494 rxv_spin_data_t *rxv_spin_entry(rxv_spin_data_t *rows,const char *name,
00495 apr_size_t index);
00496
00515 rxv_spin_data_t *rxv_spin_resize(rxv_spin_data_t *data,apr_size_t size);
00516
00536 rxv_spin_data_t *rxv_spin_copy(apr_pool_t *pool,rxv_spin_data_t *src,
00537 rxv_spin_data_t *data);
00538
00550 char *rxv_spin_slower(const char *str);
00551
00563 char *rxv_spin_supper(const char *str);
00564
00578 char *rxv_spin_strim(const char *str,rxv_spin_trim_e what);
00579 #define rxv_spin_strim2(s) \
00580 rxv_spin_strim((s),(RXV_SPIN_TRIM_LEFT|RXV_SPIN_TRIM_RIGHT))
00581
00582 #define rxv_spin_striml(s) \
00583 rxv_spin_strim((s),(RXV_SPIN_TRIM_LEFT))
00584
00585 #define rxv_spin_strimr(s) \
00586 rxv_spin_strim((s),(RXV_SPIN_TRIM_RIGHT))
00587
00589 #define rxv_spin_lower(s) \
00590 ((s)?(rxv_spin_single(s) \
00591 ?rxv_spin_datum(NULL,rxv_spin_slower(rxv_spin_string(s)),(s)) \
00592 :NULL) \
00593 :NULL)
00594
00595 #define rxv_spin_upper(s) \
00596 ((s)?(rxv_spin_single(s) \
00597 ?rxv_spin_datum(NULL,rxv_spin_supper(rxv_spin_string(s)),(s)) \
00598 :NULL) \
00599 :NULL)
00600
00601 #define rxv_spin_trim(s,w) \
00602 ((s)?(rxv_spin_single(s) \
00603 ?rxv_spin_datum(NULL,rxv_spin_strim(rxv_spin_string(s),(w)),(s)) \
00604 :NULL) \
00605 :NULL)
00606
00607 #define rxv_spin_trim2(s) \
00608 rxv_spin_trim((s),(RXV_SPIN_TRIM_LEFT|RXV_SPIN_TRIM_RIGHT))
00609
00610 #define rxv_spin_triml(s) \
00611 rxv_spin_trim((s),(RXV_SPIN_TRIM_LEFT))
00612
00613 #define rxv_spin_trimr(s) \
00614 rxv_spin_trim((s),(RXV_SPIN_TRIM_RIGHT))
00615
00624
00625
00636 apr_pool_t *rxv_spin_pool(rxv_spin_ctx_t *ctx);
00637
00648 apr_pool_t *rxv_spin_ppool(rxv_spin_ctx_t *ctx);
00649
00660 rxv_spin_data_t *rxv_spin_data(rxv_spin_ctx_t *ctx);
00661
00672 request_rec *rxv_spin_r(rxv_spin_ctx_t *ctx);
00673
00684 apreq_handle_t *rxv_spin_req(rxv_spin_ctx_t *ctx);
00685
00696 void *rxv_spin_xget(rxv_spin_ctx_t *ctx);
00697
00709 void *rxv_spin_xset(rxv_spin_ctx_t *ctx,void *extra);
00710
00722 rxv_spin_data_t *rxv_spin_get(rxv_spin_ctx_t *ctx,const char *key);
00723 #define rxv_spin_sget(ctx,key) \
00724 rxv_spin_string(rxv_spin_get((ctx),(key)))
00725
00755 rxv_spin_data_t *rxv_spin_set(rxv_spin_ctx_t *ctx,
00756 const char *key,rxv_spin_data_t *value);
00757 #define rxv_spin_sset(ctx,key,val) \
00758 rxv_spin_set((ctx),(key),rxv_spin_datum(rxv_spin_pool(ctx),(val),NULL))
00759
00760 #define rxv_spin_del(ctx,key) rxv_spin_set((ctx),(key),NULL)
00761
00765
00766
00785 rxv_spin_data_t *rxv_spin_app_get(rxv_spin_ctx_t *ctx,const char *key);
00786 #define rxv_spin_app_sget(ctx,key) \
00787 rxv_spin_string(rxv_spin_app_get((ctx),(key)))
00788
00808 rxv_spin_data_t *rxv_spin_app_set(rxv_spin_ctx_t *ctx,
00809 const char *key,rxv_spin_data_t *val);
00810 #define rxv_spin_app_sset(ctx,key,val) \
00811 rxv_spin_app_set((ctx),(key),rxv_spin_datum(rxv_spin_pool(ctx),(val),NULL))
00812
00826 apr_status_t rxv_spin_app_del(rxv_spin_ctx_t *ctx,const char *key);
00827
00839 rxv_spin_data_t *rxv_spin_ses_get(rxv_spin_ctx_t *ctx,const char *key);
00840 #define rxv_spin_ses_sget(ctx,key) \
00841 rxv_spin_string(rxv_spin_ses_get((ctx),(key)))
00842
00862 rxv_spin_data_t *rxv_spin_ses_set(rxv_spin_ctx_t *ctx,
00863 const char *key,rxv_spin_data_t *val);
00864 #define rxv_spin_ses_sset(ctx,key,val) \
00865 rxv_spin_ses_set((ctx),(key),rxv_spin_datum(rxv_spin_pool(ctx),(val),NULL))
00866
00880 apr_status_t rxv_spin_ses_del(rxv_spin_ctx_t *ctx,const char *key);
00881
00895 void rxv_spin_ses_kill(rxv_spin_ctx_t *ctx);
00896
00913 char *rxv_spin_ses_id(rxv_spin_ctx_t *ctx);
00914
00930 int rxv_spin_ses_valid(rxv_spin_ctx_t *ctx);
00931
00942 apr_time_t rxv_spin_ses_atime(rxv_spin_ctx_t *ctx);
00943
00946 typedef struct rxv_spin_db rxv_spin_db_t;
00947 typedef struct rxv_spin_db_txn rxv_spin_db_txn_t;
00966 apr_pool_t *rxv_spin_db_pool(rxv_spin_db_t *db);
00967
00978 char *rxv_spin_db_cinfo(rxv_spin_db_t *db);
00979
00990 const apr_dbd_driver_t *rxv_spin_db_driver(rxv_spin_db_t *db);
00991
01002 apr_dbd_t *rxv_spin_db_handle(rxv_spin_db_t *db);
01003
01016 apr_dbd_transaction_t *rxv_spin_db_txn(rxv_spin_db_txn_t *txn);
01017
01040 rxv_spin_db_t *rxv_spin_db_open(rxv_spin_ctx_t *ctx,const char *conninfo);
01041
01053 apr_status_t rxv_spin_db_close(rxv_spin_ctx_t *ctx,rxv_spin_db_t *db);
01054
01070 apr_status_t rxv_spin_db_status(rxv_spin_ctx_t *ctx,rxv_spin_db_t *db);
01071
01086 rxv_spin_data_t *rxv_spin_db_data(apr_pool_t *pool,rxv_spin_db_t *db,
01087 apr_dbd_results_t *dbdres);
01088
01103 rxv_spin_data_t *rxv_spin_db_select(apr_pool_t *pool,rxv_spin_db_t *db,
01104 const char *query);
01105
01118 int rxv_spin_db_query(apr_pool_t *pool,rxv_spin_db_t *db,const char *query);
01119
01146 rxv_spin_data_t *rxv_spin_db_pselect(apr_pool_t *pool,rxv_spin_db_t *db,
01147 const char *query,...)
01148 #if defined(__GNUC__) && __GNUC__ >= 4
01149 __attribute__((sentinel))
01150 #endif
01151 ;
01152
01179 int rxv_spin_db_pquery(apr_pool_t *pool,rxv_spin_db_t *db,
01180 const char *query,...)
01181 #if defined(__GNUC__) && __GNUC__ >= 4
01182 __attribute__((sentinel))
01183 #endif
01184 ;
01185
01201 rxv_spin_db_txn_t *rxv_spin_db_start(apr_pool_t *pool,rxv_spin_db_t *db);
01202
01213 apr_status_t rxv_spin_db_end(rxv_spin_db_txn_t *txn);
01214
01235 void *rxv_spin_conn_get(rxv_spin_ctx_t *ctx,const char *conninfo);
01236
01271 void *rxv_spin_conn_set(rxv_spin_ctx_t *ctx,
01272 const char *conninfo,void *conn,
01273 apr_status_t (*cleanup)(void *data));
01274
01284 typedef void (*rxv_spin_init_t)(rxv_spin_ctx_t *ctx);
01286 typedef int (*rxv_spin_prepare_t)(rxv_spin_ctx_t *ctx);
01288 typedef int (*rxv_spin_service_t)(rxv_spin_ctx_t *ctx);
01293
01294
01316 apr_status_t rxv_spin_dso_load(rxv_spin_ctx_t *ctx,const char *path,
01317 apr_dso_handle_t **handle);
01318
01339 char *rxv_spin_hash(apr_pool_t *pool,const char *uniq);
01340
01353 char *rxv_spin_hmac(apr_pool_t *pool,const char *uniq,const char *salt);
01354
01357 #endif