src/rxv_spin.h

Go to the documentation of this file.
00001 /*
00002  * rxv_spin.h
00003  *
00004  * Copyright (C) 2003 - 2007 Bojan Smojver, Rexursive
00005  *
00006  * This program is free software: you can redistribute it and/or modify it
00007  * under the terms of the GNU Lesser General Public License as published by
00008  * the Free Software Foundation, either version 2.1 of the License, or (at
00009  * your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful, but WITHOUT
00012  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00013  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
00014  * for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public License
00017  * along with this program. If not, see <http://www.gnu.org/licenses/>.
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 /* remove some macros, Apache defines them as well */
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 /* the following also includes httpd.h */
00108 #include <apreq_module_apache2.h>
00109 
00110 /* remove Apache macros, restore good definitions */
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 /* Data creation and manipulation functions */
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 /* Context functions and macros */
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 /* Application/session functions */
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 /* Database access structures and functions
01033    NOTE: Everything is designed to be PostgreSQL centric. Sorry :-( */
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 /* DSO loading functions */
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 /* __RXV_SPIN_H__ */

Generated on Tue Nov 20 13:19:53 2007 for mod_spin by  doxygen 1.5.2