/[pgswish]/trunk/pgswish.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/pgswish.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 14 by dpavlin, Sat Feb 19 20:59:17 2005 UTC revision 20 by dpavlin, Sun May 29 20:30:18 2005 UTC
# Line 6  Line 6 
6   * TODO:   * TODO:
7   * - check null input using PG_ARGISNULL before using PG_GETARG_xxxx   * - check null input using PG_ARGISNULL before using PG_GETARG_xxxx
8   * - support composite type arguments   * - support composite type arguments
9     * - split error_or_abort
10     * - use getResultPropValue not SwishResultPropertyStr
11   *   *
12   * NOTES:   * NOTES:
13   * - clear structures with memset to support hash indexes (who whould like   * - clear structures with memset to support hash indexes (who whould like
# Line 25  Line 27 
27  #include "fmgr.h"  #include "fmgr.h"
28  #include "funcapi.h"  #include "funcapi.h"
29  #include "utils/builtins.h"  #include "utils/builtins.h"
30    #include "utils/array.h"
31    #include "miscadmin.h"
32  #include <swish-e.h>  #include <swish-e.h>
33    
34  #define _textin(str) DirectFunctionCall1(textin, CStringGetDatum(str))  #define _textin(str) DirectFunctionCall1(textin, CStringGetDatum(str))
# Line 32  Line 36 
36  #define GET_STR(textp) DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(textp)))  #define GET_STR(textp) DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(textp)))
37  #define GET_TEXT(cstrp) DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(cstrp)))  #define GET_TEXT(cstrp) DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(cstrp)))
38    
39    /* Globals */
40  SW_HANDLE   swish_handle = NULL;/* Database handle */  static SW_HANDLE   swish_handle = NULL; /* Database handle */
41  SW_SEARCH   search = NULL;      /* search handle -- holds search parameters */  static SW_SEARCH   search = NULL;       /* search handle -- search parameters */
42  SW_RESULTS  swish_results = NULL;       /* results handle -- holds list of results */  static SW_RESULTS  swish_results = NULL; /* results handle -- list of results */
43  SW_RESULT   *sw_res = NULL;     /* one row from swish-e results */  static SW_RESULT   *sw_res = NULL;      /* one row from swish-e results */
44    
45  /* define PostgreSQL v1 function */  /* define PostgreSQL v1 function */
46  PG_FUNCTION_INFO_V1(pgswish);  PG_FUNCTION_INFO_V1(pgswish);
# Line 50  Datum pgswish(PG_FUNCTION_ARGS) { Line 54  Datum pgswish(PG_FUNCTION_ARGS) {
54          AttInMetadata   *attinmeta;          AttInMetadata   *attinmeta;
55          char            *index_path;          char            *index_path;
56          char            *query;          char            *query;
57            FILE            *logfh;
58    
59          /* stuff done only on the first call of the function */          /* stuff done only on the first call of the function */
60          if (SRF_IS_FIRSTCALL()) {          if (SRF_IS_FIRSTCALL()) {
# Line 67  Datum pgswish(PG_FUNCTION_ARGS) { Line 72  Datum pgswish(PG_FUNCTION_ARGS) {
72                  oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);                  oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
73    
74                                    
75                  /* Send any errors or warnings to stderr (default is stdout) */                  /* Send any errors or warnings to log, as well as
76                  SwishErrorsToStderr();                   * STDOUT and STDERR (just to be sure) */
77                    if ( logfh = fopen("/tmp/pgswish.log", "a") ) {
78                            set_error_handle( logfh );
79                            elog(INFO, "loggin swish-e errors to /tmp/pgswish.log");
80                            /* redirect STDOUT and STDERR to log */
81                            dup2(1, logfh);
82                            dup2(2, logfh);
83                    } else {
84                            elog(INFO, "can't open /tmp/pgswish.log -- errors from swish-e won't be cought and may result in back-end crashes!");
85                    }
86    
87                  elog(INFO, "pgswish: SwishInit(%s)", index_path);                  elog(INFO, "pgswish: SwishInit(%s)", index_path);
88                    
89                  swish_handle = SwishInit( index_path );                  swish_handle = SwishInit( index_path );
90    
91                    if ( SwishError( swish_handle ) )
92                            elog(INFO, "pgswish: SwishInit(%s) failed: %s", index_path, SwishErrorString( swish_handle ));
93                    
94                    elog(INFO, "handle: %08x", swish_handle);
95    
96                  if (! swish_handle) {                  if (! swish_handle) {
97                          elog(ERROR, "pgswish: can't open %s", index_path);                          elog(ERROR, "pgswish: can't open %s", index_path);
98                          SRF_RETURN_DONE(funcctx);                          SRF_RETURN_DONE(funcctx);
99                  }                  }
100                                    
101                  error_or_abort( swish_handle );                  if (error_or_abort( swish_handle )) SRF_RETURN_DONE(funcctx);
102                  /* set ranking scheme. default is 0 */                  /* set ranking scheme. default is 0 */
103                  SwishRankScheme( swish_handle, 0 );                  SwishRankScheme( swish_handle, 0 );
104                  error_or_abort( swish_handle );                  if (error_or_abort( swish_handle )) SRF_RETURN_DONE(funcctx);
105    
106                  elog(INFO, "pgswish: SwishQuery(%s)", query);                  elog(INFO, "pgswish: SwishQuery(%s)", query);
107                  /* Here's a short-cut to searching that creates a search object and searches at the same time */                  /* Here's a short-cut to searching that creates a search object and searches at the same time */
108                  swish_results = SwishQuery( swish_handle, query);                  swish_results = SwishQuery( swish_handle, query);
109                  error_or_abort( swish_handle );                  if (error_or_abort( swish_handle )) SRF_RETURN_DONE(funcctx);
110    
111                  /* total number of tuples to be returned */                  /* total number of tuples to be returned */
112                  funcctx->max_calls = SwishHits( swish_results );                  funcctx->max_calls = SwishHits( swish_results );
# Line 140  Datum pgswish(PG_FUNCTION_ARGS) { Line 159  Datum pgswish(PG_FUNCTION_ARGS) {
159                  }                  }
160                                    
161                  elog(DEBUG1, "pgswish: check for swish-e error");                  elog(DEBUG1, "pgswish: check for swish-e error");
162                  error_or_abort( swish_handle );                  if (error_or_abort( swish_handle )) SRF_RETURN_DONE(funcctx);
163    
164                  /*                  /*
165                   * Prepare a values array for storage in our slot.                   * Prepare a values array for storage in our slot.
# Line 151  Datum pgswish(PG_FUNCTION_ARGS) { Line 170  Datum pgswish(PG_FUNCTION_ARGS) {
170                  sw_res = SwishNextResult( swish_results );                  sw_res = SwishNextResult( swish_results );
171                  if (! sw_res) {                  if (! sw_res) {
172                          elog(ERROR, "pgswish: swish-e sort result list: %d rows expected %d", call_cntr, max_calls - 1);                          elog(ERROR, "pgswish: swish-e sort result list: %d rows expected %d", call_cntr, max_calls - 1);
173                            Free_Results_Object( swish_results );
174                            Free_Search_Object( search );
175                          SRF_RETURN_DONE(funcctx);                          SRF_RETURN_DONE(funcctx);
176                  }                  }
177                                    
# Line 182  Datum pgswish(PG_FUNCTION_ARGS) { Line 203  Datum pgswish(PG_FUNCTION_ARGS) {
203                  values[3] = (char *) palloc(16 * sizeof(char));                  values[3] = (char *) palloc(16 * sizeof(char));
204                  snprintf(values[3], 16, "%d", 4);                  snprintf(values[3], 16, "%d", 4);
205  */  */
206                    
207                  /* build a tuple */                  /* build a tuple */
208                  tuple = BuildTupleFromCStrings(attinmeta, values);                  tuple = BuildTupleFromCStrings(attinmeta, values);
209    
# Line 196  Datum pgswish(PG_FUNCTION_ARGS) { Line 217  Datum pgswish(PG_FUNCTION_ARGS) {
217                  pfree(values[3]);                  pfree(values[3]);
218                  pfree(values);                  pfree(values);
219                                    
220                  elog(INFO, "row: %s|%s|%s|%s",values[0],values[1],values[2],values[3]);                  elog(DEBUG1, "row: %s|%s|%s|%s",values[0],values[1],values[2],values[3]);
221                    
222                  SRF_RETURN_NEXT(funcctx, result);                  SRF_RETURN_NEXT(funcctx, result);
223          } else {          } else {
# Line 211  Datum pgswish(PG_FUNCTION_ARGS) { Line 232  Datum pgswish(PG_FUNCTION_ARGS) {
232          }          }
233  }  }
234    
 Datum swtextprop(PG_FUNCTION_ARGS) {  
         char    *prop;  
         char    *val;  
   
         prop = _textout(PG_GETARG_TEXT_P(0));  
         elog(INFO, "pgswish: swextprop(%s)", prop);  
   
         val = prop2int( sw_res, prop );  
         error_or_abort( swish_handle );  
   
         elog(INFO, "pgswish: swextprop(%s) = '%s'", prop, val );  
235    
236          PG_FREE_IF_COPY(prop, 0);  /* make text var from property */
         PG_RETURN_TEXT_P( _textin(val) );  
 }  
   
 /* make text var prom property */  
237  char *prop2text(SW_RESULT sw_res, char *propname) {  char *prop2text(SW_RESULT sw_res, char *propname) {
238          char *val;          char *val;
239          char *prop;          char *prop;
240          int len;          int len;
241    
242          elog(DEBUG1, "prop2text(%s)", propname);          elog(DEBUG2, "prop2text(%s)", propname);
243    
244          prop = SwishResultPropertyStr( sw_res, propname );          prop = SwishResultPropertyStr( sw_res, propname );
245          error_or_abort( swish_handle );          if (error_or_abort( swish_handle )) return NULL;
246    
247          len = strlen(prop);          len = strlen(prop);
248          elog(INFO, "prop2text(%s) = '%s' %d bytes", propname, prop, len);          elog(DEBUG1, "prop2text(%s) = '%s' %d bytes", propname, prop, len);
249    
250          len++;          len++;
251          len *= sizeof(char);          len *= sizeof(char);
252    
253          elog(DEBUG1, "palloc(%d)", len);          elog(DEBUG2, "palloc(%d)", len);
254    
255          val = palloc(len);          val = palloc(len);
256    
257          memset(val, 0, len);          memset(val, 0, len);
258          strncpy(val, prop, len);          strncpy(val, prop, len);
259    
260          elog(DEBUG1, "val=%s", val);          elog(DEBUG2, "val=%s", val);
261    
262          return val;          return val;
263  }  }
# Line 262  char *prop2int(SW_RESULT sw_res, char *p Line 268  char *prop2int(SW_RESULT sw_res, char *p
268          unsigned long prop;          unsigned long prop;
269          int len;          int len;
270    
271          elog(DEBUG1, "prop2int(%s)", propname);          elog(DEBUG2, "prop2int(%s)", propname);
272    
273          prop = SwishResultPropertyULong( sw_res, propname );          prop = SwishResultPropertyULong( sw_res, propname );
274          error_or_abort( swish_handle );          if (error_or_abort( swish_handle )) return NULL;
275    
276          elog(INFO, "prop2int(%s) = %lu", propname, prop);          elog(DEBUG1, "prop2int(%s) = %lu", propname, prop);
277    
278          len = 128 * sizeof(char);          len = 128 * sizeof(char);
279          elog(DEBUG1, "palloc(%d)", len);          elog(DEBUG2, "palloc(%d)", len);
280    
281          val = palloc(len);          val = palloc(len);
282          memset(val, 0, len);          memset(val, 0, len);
283    
284          snprintf(val, len, "%lu", prop);          snprintf(val, len, "%lu", prop);
285    
286          elog(DEBUG1, "val=%s", val);          elog(DEBUG2, "val=%s", val);
287    
288          return val;          return val;
289  }  }
# Line 286  char *prop2int(SW_RESULT sw_res, char *p Line 292  char *prop2int(SW_RESULT sw_res, char *p
292  /*  /*
293   * check if swish has returned error, and elog it.   * check if swish has returned error, and elog it.
294   */   */
295  static void error_or_abort( SW_HANDLE swish_handle ) {  static int error_or_abort( SW_HANDLE swish_handle ) {
296          if ( !SwishError( swish_handle ) )          if ( !SwishError( swish_handle ) )
297                  return;                  return 0;
298    
299          /* print a message */          /* print a message */
300          elog(ERROR,          elog(ERROR,
# Line 297  static void error_or_abort( SW_HANDLE sw Line 303  static void error_or_abort( SW_HANDLE sw
303                          SwishErrorString( swish_handle ),                          SwishErrorString( swish_handle ),
304                          SwishLastErrorMsg( swish_handle )                          SwishLastErrorMsg( swish_handle )
305          );          );
306            if ( swish_results ) Free_Results_Object( swish_results );
307          if ( search ) Free_Search_Object( search );          if ( search ) Free_Search_Object( search );
308          SwishClose( swish_handle );          SwishClose( swish_handle );
309    
310            return 1;
311  }  }
312    

Legend:
Removed from v.14  
changed lines
  Added in v.20

  ViewVC Help
Powered by ViewVC 1.1.26