/[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 12 by dpavlin, Sat Feb 19 15:09:05 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    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 49  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 66  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 114  Datum pgswish(PG_FUNCTION_ARGS) { Line 134  Datum pgswish(PG_FUNCTION_ARGS) {
134                  funcctx->attinmeta = attinmeta;                  funcctx->attinmeta = attinmeta;
135    
136                  MemoryContextSwitchTo(oldcontext);                  MemoryContextSwitchTo(oldcontext);
137    
138                    elog(INFO, "SRF_IS_FIRSTCALL done");
139          }          }
140    
141          /* stuff done on every call of the function */          /* stuff done on every call of the function */
# Line 128  Datum pgswish(PG_FUNCTION_ARGS) { Line 150  Datum pgswish(PG_FUNCTION_ARGS) {
150                  char            **values;                  char            **values;
151                  HeapTuple       tuple;                  HeapTuple       tuple;
152                  Datum           result;                  Datum           result;
                 SW_RESULT       *sw_res;        /* one row from swish-e results */  
153    
154                  elog(INFO, "pgswish: in loop %d", call_cntr);                  elog(INFO, "pgswish: loop count %d", call_cntr);
155    
156                  if (! swish_results) {                  if (! swish_results) {
157                          elog(ERROR, "pgswish: no swish-e results");                          elog(ERROR, "pgswish: no swish-e results");
158                          SRF_RETURN_DONE(funcctx);                          SRF_RETURN_DONE(funcctx);
159                  }                  }
160                                    
161                  elog(INFO, "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.
166                   * This should be an array of C strings which will                   * This should be an array of C strings which will
167                   * be processed later by the type input functions.                   * be processed later by the type input functions.
168                   */                   */
                 values = (char **) palloc(4 * sizeof(char *));  
169    
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 164  Datum pgswish(PG_FUNCTION_ARGS) { Line 186  Datum pgswish(PG_FUNCTION_ARGS) {
186                          SwishResultPropertyULong ( sw_res, "swishfilenum" )                          SwishResultPropertyULong ( sw_res, "swishfilenum" )
187                  );                  );
188    
189                  elog(INFO, "swishdocpath: %s", prop2text( sw_res, "swishdocpath" ) );                  values = (char **) palloc(4 * sizeof(char *));
190    
191                  values[0] = prop2int( sw_res, "swishrank" );                  values[0] = prop2int( sw_res, "swishrank" );
192                  values[1] = prop2text( sw_res, "swishdocpath" );                  values[1] = prop2text( sw_res, "swishdocpath" );
193                  values[2] = prop2text( sw_res, "swishtitle" );                  values[2] = prop2text( sw_res, "swishtitle" );
194                  values[3] = prop2int( sw_res, "swishdocsize" );                  values[3] = prop2int( sw_res, "swishdocsize" );
195                    
196    /*
197                    values[0] = (char *) palloc(16 * sizeof(char));
198                    snprintf(values[0], 16, "%d", 1);
199                    values[1] = (char *) palloc(16 * sizeof(char));
200                    snprintf(values[1], 16, "%d", 2);
201                    values[2] = (char *) palloc(16 * sizeof(char));
202                    snprintf(values[2], 16, "%d", 3);
203                    values[3] = (char *) palloc(16 * sizeof(char));
204                    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 177  Datum pgswish(PG_FUNCTION_ARGS) { Line 211  Datum pgswish(PG_FUNCTION_ARGS) {
211                  result = TupleGetDatum(slot, tuple);                  result = TupleGetDatum(slot, tuple);
212    
213                  /* clean up ? */                  /* clean up ? */
214                    pfree(values[0]);
215                  elog(INFO, "row: %s|%s|%s|%s",values[0],values[1],values[2],values[3]);                  pfree(values[1]);
216                    pfree(values[2]);
217                    pfree(values[3]);
218                    pfree(values);
219                    
220                    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 {
224                    elog(INFO, "loop over");
225    
226                  /* free swish object and close */                  /* free swish object and close */
227                  Free_Search_Object( search );                  Free_Search_Object( search );
228                  SwishClose( swish_handle );                  SwishClose( swish_handle );
# Line 191  Datum pgswish(PG_FUNCTION_ARGS) { Line 232  Datum pgswish(PG_FUNCTION_ARGS) {
232          }          }
233  }  }
234    
 /*  
  * elog errors  
  *  
  */  
235    
236    /* make text var from 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(INFO, "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(INFO, "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(INFO, "val=%s", val);          elog(DEBUG2, "val=%s", val);
261    
262          return val;          return val;
263  }  }
264    
265    /* make integer variable from property */
266  char *prop2int(SW_RESULT sw_res, char *propname) {  char *prop2int(SW_RESULT sw_res, char *propname) {
267          char *val;          char *val;
268          unsigned long prop;          unsigned long prop;
269          int len;          int len;
270    
271          elog(INFO, "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(INFO, "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(INFO, "val=%s", val);          elog(DEBUG2, "val=%s", val);
287    
288          return val;          return val;
289  }  }
290    
291    
292  static void error_or_abort( SW_HANDLE swish_handle ) {  /*
293     * check if swish has returned error, and elog it.
294     */
295    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 261  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          /* do when there is no more left */          return 1;
311  }  }
312    

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

  ViewVC Help
Powered by ViewVC 1.1.26