--- trunk/pgswish.c 2005/02/18 23:34:31 8 +++ trunk/pgswish.c 2005/02/19 00:59:08 9 @@ -11,15 +11,23 @@ * - clear structures with memset to support hash indexes (who whould like * to create hash index on table returned from function?) * - * Based on C example from PostgreSQL documentation and swish-e - * src/libtest.c, so licence is GPL + * Based on: + * - C example from PostgreSQL documentation (BSD licence) + * - swish-e example src/libtest.c (GPL) + * - _textin/_textout from pgcurl.c (LGPL) + * + * This code is licenced under GPL */ #include "postgres.h" #include "fmgr.h" #include "funcapi.h" +#include "utils/builtins.h" #include +#define _textin(str) DirectFunctionCall1(textin, CStringGetDatum(str)) +#define _textout(str) DatumGetPointer(DirectFunctionCall1(textout, PointerGetDatum(str))) + SW_HANDLE swish_handle = NULL;/* Database handle */ SW_SEARCH search = NULL; /* search handle -- holds search parameters */ @@ -38,29 +46,34 @@ SW_HANDLE swish_handle = NULL; /* Database handle */ SW_SEARCH search = NULL; /* search handle -- holds search parameters */ SW_RESULTS results = NULL; /* results handle -- holds list of results */ + char *index_path; + char *query; /* stuff done only on the first call of the function */ if (SRF_IS_FIRSTCALL()) { MemoryContext oldcontext; + /* take arguments from function */ + //index_path = _textout(PG_GETARG_TEXT_P(0)); + index_path = _textout(PG_GETARG_TEXT_P(0)); + query = _textout(PG_GETARG_TEXT_P(1)); + /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); /* switch to memory context appropriate for multiple function calls */ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + /* Send any errors or warnings to stderr (default is stdout) */ SwishErrorsToStderr(); - elog(INFO, "pgswish opening %s, query %s", - PG_GETARG_TEXT_P(0), - PG_GETARG_TEXT_P(1) - ); + elog(INFO, "pgswish: SwishInit(%s)", index_path); - swish_handle = SwishInit( (char *)PG_GETARG_TEXT_P(0) ); + swish_handle = SwishInit( index_path ); if (! swish_handle) { - elog(ERROR, "pgswish: can't open %s", PG_GETARG_TEXT_P(0)); + elog(ERROR, "pgswish: can't open %s", index_path); SRF_RETURN_DONE(funcctx); } @@ -72,9 +85,11 @@ if ( SwishError( swish_handle ) ) error_or_abort( swish_handle ); /* print an error or abort -- see below */ + elog(INFO, "pgswish: SwishQuery(%s)", query); /* Here's a short-cut to searching that creates a search object and searches at the same time */ - results = SwishQuery( swish_handle, (char *)PG_GETARG_TEXT_P(1) ); - +elog(INFO,"## FIXME: SwishQuery kills back-end?"); + results = SwishQuery( swish_handle, query); +elog(INFO,"## FIXME: no..."); if ( SwishError( swish_handle ) ) error_or_abort( swish_handle ); /* total number of tuples to be returned */ @@ -82,7 +97,9 @@ /* check if results exists */ if ( 0 == funcctx->max_calls ) - elog(INFO, "no results for: %s", PG_GETARG_TEXT_P(1) ); + elog(INFO, "no results for: %s", query ); + + elog(INFO, "pgswish: SwishHits = %d", funcctx->max_calls); /* Build a tuple description for a __pgswish tuple */ tupdesc = RelationNameGetTupleDesc("__pgswish"); @@ -122,12 +139,12 @@ * This should be an array of C strings which will * be processed later by the type input functions. */ - values = (void **) palloc(5 * sizeof(void *)); - values[0] = (long *) SwishResultPropertyULong ( result, "swishrank" ), - values[1] = (char *) SwishResultPropertyStr ( result, "swishdocpath" ), - values[2] = (char *) SwishResultPropertyStr ( result, "swishtitle" ), - values[3] = (long *) SwishResultPropertyStr ( result, "swishdocsize" ), - values[4] = (char *) SwishResultPropertyStr ( result, "swishdbfile" ), + values = (char **) palloc(5 * sizeof(char *)); + values[0] = _textout( SwishResultPropertyULong ( result, "swishrank" ) ); + values[1] = _textout( SwishResultPropertyStr ( result, "swishdocpath" ) ); + values[2] = _textout( SwishResultPropertyStr ( result, "swishtitle" ) ); + values[3] = _textout( SwishResultPropertyStr ( result, "swishdocsize" ) ); + values[4] = _textout( SwishResultPropertyStr ( result, "swishdbfile" ) ); /* build a tuple */ tuple = BuildTupleFromCStrings(attinmeta, values);