--- trunk/pgswish.c 2005/02/19 11:39:11 10 +++ trunk/pgswish.c 2005/02/19 12:27:04 11 @@ -29,11 +29,13 @@ #define _textin(str) DirectFunctionCall1(textin, CStringGetDatum(str)) #define _textout(str) DatumGetPointer(DirectFunctionCall1(textout, PointerGetDatum(str))) +#define GET_STR(textp) DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(textp))) +#define GET_TEXT(cstrp) DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(cstrp))) 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 */ +SW_RESULTS swish_results = NULL; /* results handle -- holds list of results */ /* define PostgreSQL v1 function */ PG_FUNCTION_INFO_V1(pgswish); @@ -45,9 +47,6 @@ TupleDesc tupdesc; TupleTableSlot *slot; AttInMetadata *attinmeta; - 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; @@ -89,11 +88,11 @@ 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, query); + swish_results = SwishQuery( swish_handle, query); if ( SwishError( swish_handle ) ) error_or_abort( swish_handle ); /* total number of tuples to be returned */ - funcctx->max_calls = SwishHits( results ); + funcctx->max_calls = SwishHits( swish_results ); /* check if results exists */ if ( 0 == funcctx->max_calls ) @@ -132,19 +131,57 @@ char **values; HeapTuple tuple; Datum result; + char *prop; + SW_RESULT *sw_res; /* one row from swish-e results */ + + elog(INFO, "pgswish: in loop %d", call_cntr); + + if (! swish_results) { + elog(ERROR, "pgswish: no swish-e results"); + SRF_RETURN_DONE(funcctx); + } + + elog(INFO, "pgswish: check for swish-e error"); + if ( SwishError( swish_handle ) ) error_or_abort( swish_handle ); -if (0) { /* * Prepare a values array for storage in our slot. * This should be an array of C strings which will * be processed later by the type input functions. */ 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" ) ); + + sw_res = SwishNextResult( swish_results ); + if (! sw_res) { + elog(ERROR, "pgswish: swish-e sort result list: %d rows expected %d", call_cntr, max_calls - 1); + SRF_RETURN_DONE(funcctx); + } + + elog(INFO, "Path: %s\n Rank: %lu\n Size: %lu\n Title: %s\n Index: %s\n Modified: %s\n Record #: %lu\n File #: %lu\n\n", + SwishResultPropertyStr ( sw_res, "swishdocpath" ), + SwishResultPropertyULong ( sw_res, "swishrank" ), + SwishResultPropertyULong ( sw_res, "swishdocsize" ), + SwishResultPropertyStr ( sw_res, "swishtitle"), + SwishResultPropertyStr ( sw_res, "swishdbfile" ), + SwishResultPropertyStr ( sw_res, "swishlastmodified" ), + SwishResultPropertyULong ( sw_res, "swishreccount" ), /* can figure this out in loop, of course */ + SwishResultPropertyULong ( sw_res, "swishfilenum" ) + ); + + elog(INFO, "pgswish: get prop"); + prop = SwishResultPropertyStr ( sw_res, "swishdocpath" ); + elog(INFO, "pgswish: got error?"); + if ( SwishError( swish_handle ) ) error_or_abort( swish_handle ); + elog(INFO, "swishdocpath: %s", prop); + +// values[0] = GET_STR( SwishResultPropertyULong ( sw_res, "swishrank" ) ); + values[0] = NULL; +// values[1] = GET_TEXT( SwishResultPropertyStr ( sw_res, "swishdocpath" ) ); +if (0) { + values[1] = GET_TEXT( SwishResultPropertyStr ( sw_res, "swishdocpath" ) ); + values[2] = _textout( SwishResultPropertyStr ( sw_res, "swishtitle" ) ); + values[3] = _textout( SwishResultPropertyStr ( sw_res, "swishdocsize" ) ); + values[4] = _textout( SwishResultPropertyStr ( sw_res, "swishdbfile" ) ); /* build a tuple */ tuple = BuildTupleFromCStrings(attinmeta, values);