1 /* $Source$ */
2 /* $Id$ */
3 
4 /*
5    +----------------------------------------------------------------------+
6    | PHP Version 5                                                        |
7    +----------------------------------------------------------------------+
8    | Copyright (c) 1997-2004 The PHP Group                                |
9    +----------------------------------------------------------------------+
10    | This source file is subject to version 3.0 of the PHP license,       |
11    | that is bundled with this package in the file LICENSE, and is        |
12    | available through the world-wide-web at the following url:           |
13    | http://www.php.net/license/3_0.txt.                                  |
14    | If you did not receive a copy of the PHP license and are unable to   |
15    | obtain it through the world-wide-web, please send a note to          |
16    | license@php.net so we can mail you a copy immediately.               |
17    +----------------------------------------------------------------------+
18    | Authors:                                                             |
19    |  Initial version     by  Alex Barkov <bar@izhcom.ru>                 |
20    |                      and Ramil Kalimullin <ram@izhcom.ru>            |
21    |  Further development by  Sergey Kartashoff <gluke@mail.ru>           |
22    +----------------------------------------------------------------------+
23 */
24 
25 #ifdef HAVE_CONFIG_H
26 #include "config.h"
27 #endif
28 
29 #include "php.h"
30 #include "php_mnogo.h"
31 #include "ext/standard/php_standard.h"
32 #include "ext/standard/info.h"
33 #include "php_globals.h"
34 
35 #ifdef HAVE_MNOGOSEARCH
36 
37 #define UDMSTRSIZ               1024*5
38 
39 #define UDM_FIELD_URLID		1
40 #define UDM_FIELD_URL		2
41 #define UDM_FIELD_CONTENT	3
42 #define UDM_FIELD_TITLE		4
43 #define UDM_FIELD_KEYWORDS	5
44 #define UDM_FIELD_DESC		6
45 #define UDM_FIELD_TEXT		7
46 #define UDM_FIELD_SIZE		8
47 #define UDM_FIELD_RATING	9
48 #define UDM_FIELD_MODIFIED	10
49 #define UDM_FIELD_ORDER		11
50 #define UDM_FIELD_CRC		12
51 #define UDM_FIELD_LANG		14
52 #define UDM_FIELD_CHARSET	15
53 #define UDM_FIELD_SITEID	16
54 #define UDM_FIELD_POP_RANK	17
55 #define UDM_FIELD_ORIGINID	18
56 
57 /* udm_set_agent_param constants */
58 #define UDM_PARAM_PAGE_SIZE		1
59 #define UDM_PARAM_PAGE_NUM		2
60 #define UDM_PARAM_SEARCH_MODE		3
61 #define UDM_PARAM_CACHE_MODE		4
62 #define UDM_PARAM_TRACK_MODE		5
63 #define UDM_PARAM_CHARSET		6
64 #define UDM_PARAM_STOPTABLE		7
65 #define UDM_PARAM_STOPFILE		8
66 #define UDM_PARAM_WEIGHT_FACTOR		9
67 #define UDM_PARAM_WORD_MATCH		10
68 #define UDM_PARAM_PHRASE_MODE		11
69 #define UDM_PARAM_MIN_WORD_LEN		12
70 #define UDM_PARAM_MAX_WORD_LEN		13
71 #define UDM_PARAM_ISPELL_PREFIXES	14
72 #define UDM_PARAM_VARDIR		16
73 #define UDM_PARAM_LOCAL_CHARSET		17
74 #define UDM_PARAM_BROWSER_CHARSET	18
75 #define UDM_PARAM_HLBEG			19
76 #define UDM_PARAM_HLEND			20
77 #define UDM_PARAM_SYNONYM		21
78 #define UDM_PARAM_SEARCHD		22	/* unused */
79 #define UDM_PARAM_QSTRING		23
80 #define UDM_PARAM_REMOTE_ADDR		24
81 #define UDM_PARAM_QUERY			25
82 #define UDM_PARAM_STORED		26
83 #define UDM_PARAM_GROUPBYSITE		27
84 #define UDM_PARAM_SITEID		28
85 #define UDM_PARAM_DETECT_CLONES		29
86 #define UDM_PARAM_SORT_ORDER		30
87 #define UDM_PARAM_RESULTS_LIMIT		31
88 #define UDM_PARAM_EXCERPT_SIZE		32
89 #define UDM_PARAM_EXCERPT_PADDING	33
90 
91 /* udm_add_search_limit constants */
92 #define UDM_LIMIT_URL		1
93 #define UDM_LIMIT_TAG		2
94 #define UDM_LIMIT_LANG		3
95 #define UDM_LIMIT_CAT		4
96 #define UDM_LIMIT_DATE		5
97 #define UDM_LIMIT_TYPE		6
98 
99 /* word match type */
100 #define UDM_MATCH_WORD		0
101 #define UDM_MATCH_BEGIN		1
102 #define UDM_MATCH_SUBSTR	2
103 #define UDM_MATCH_END		3
104 
105 /* track modes */
106 #define UDM_TRACK_ENABLED	1
107 #define UDM_TRACK_DISABLED	0
108 
109 /* cache modes */
110 #define UDM_CACHE_ENABLED	1
111 #define UDM_CACHE_DISABLED	0
112 
113 /* phrase modes */
114 #define UDM_PHRASE_ENABLED	1
115 #define UDM_PHRASE_DISABLED	0
116 
117 /* prefix modes */
118 #define UDM_PREFIXES_ENABLED	1
119 #define UDM_PREFIXES_DISABLED	0
120 
121 /* General modes */
122 #define UDM_ENABLED	 	1
123 #define UDM_DISABLED 		0
124 
125 /* udm_get_res_param constants */
126 #define UDM_PARAM_NUM_ROWS	256
127 #define UDM_PARAM_FOUND		257
128 #define UDM_PARAM_WORDINFO	258
129 #define UDM_PARAM_SEARCHTIME	259
130 #define UDM_PARAM_FIRST_DOC	260
131 #define UDM_PARAM_LAST_DOC	261
132 #define UDM_PARAM_WORDINFO_ALL	262
133 
134 /* udm_load_ispell_data constants */
135 #define UDM_ISPELL_TYPE_AFFIX	1
136 #define UDM_ISPELL_TYPE_SPELL	2
137 #define UDM_ISPELL_TYPE_DB	3
138 #define UDM_ISPELL_TYPE_SERVER	4
139 
140 /* True globals, no need for thread safety */
141 static int le_link,le_res;
142 
143 #include <udm_config.h>
144 #include <udmsearch.h>
145 
146 /* {{{ mnogosearch_functions[]
147  */
148 zend_function_entry mnogosearch_functions[]=
149 {
150   PHP_FE(udm_api_version,         NULL)
151   PHP_FE(udm_check_charset,       NULL)
152   PHP_FE(udm_crc32,               NULL)
153   PHP_FE(udm_parse_query_string,  NULL)
154   PHP_FE(udm_set_agent_param_ex,  NULL)
155   PHP_FE(udm_get_agent_param_ex,  NULL)
156   PHP_FE(udm_get_res_field_ex,    NULL)
157   PHP_FE(udm_hash32,              NULL)
158   PHP_FE(udm_alloc_agent_array,   NULL)
159   PHP_FE(udm_store_doc_cgi,       NULL)
160   PHP_FE(udm_alloc_agent,         NULL)
161   PHP_FE(udm_set_agent_param,     NULL)
162   PHP_FE(udm_load_ispell_data,    NULL)
163   PHP_FE(udm_free_ispell_data,    NULL)
164   PHP_FE(udm_add_search_limit,    NULL)
165   PHP_FE(udm_clear_search_limits, NULL)
166   PHP_FE(udm_errno,               NULL)
167   PHP_FE(udm_error,               NULL)
168   PHP_FE(udm_find,                NULL)
169   PHP_FE(udm_get_res_param,       NULL)
170   PHP_FE(udm_get_res_field,       NULL)
171   PHP_FE(udm_free_res,            NULL)
172   PHP_FE(udm_free_agent,          NULL)
173   PHP_FE(udm_get_doc_count,       NULL)
174   {NULL, NULL, NULL}
175 };
176 /* }}} */
177 
178 zend_module_entry mnogosearch_module_entry=
179 {
180   STANDARD_MODULE_HEADER,
181   "mnogosearch",
182   mnogosearch_functions,
183   PHP_MINIT(mnogosearch),
184   PHP_MSHUTDOWN(mnogosearch),
185   PHP_RINIT(mnogosearch),
186   NULL,
187   PHP_MINFO(mnogosearch),
188   NO_VERSION_YET,
189   STANDARD_MODULE_PROPERTIES
190 };
191 
192 
193 #ifdef COMPILE_DL_MNOGOSEARCH
ZEND_GET_MODULE(mnogosearch)194 ZEND_GET_MODULE(mnogosearch)
195 #endif
196 
197 static void _free_udm_agent(zend_rsrc_list_entry *rsrc TSRMLS_DC)
198 {
199   UDM_AGENT * Agent = (UDM_AGENT *)rsrc->ptr;
200   UdmEnvFree(Agent->Conf);
201   UdmAgentFree(Agent);
202 }
203 
_free_udm_res(zend_rsrc_list_entry * rsrc TSRMLS_DC)204 static void _free_udm_res(zend_rsrc_list_entry *rsrc TSRMLS_DC)
205 {
206   UDM_RESULT * Res = (UDM_RESULT *)rsrc->ptr;
207   UdmResultFree(Res);
208 }
209 
210 /* {{{ PHP_MINIT_FUNCTION
211  */
PHP_MINIT_FUNCTION(mnogosearch)212 DLEXPORT PHP_MINIT_FUNCTION(mnogosearch)
213 {
214   UdmInit();
215   le_link= zend_register_list_destructors_ex(_free_udm_agent,NULL,"mnogosearch agent",module_number);
216   le_res= zend_register_list_destructors_ex(_free_udm_res,NULL,"mnogosearch result",module_number);
217 
218   REGISTER_LONG_CONSTANT("UDM_FIELD_URLID",        UDM_FIELD_URLID,    CONST_CS | CONST_PERSISTENT);
219   REGISTER_LONG_CONSTANT("UDM_FIELD_URL",          UDM_FIELD_URL,      CONST_CS | CONST_PERSISTENT);
220   REGISTER_LONG_CONSTANT("UDM_FIELD_CONTENT",      UDM_FIELD_CONTENT,  CONST_CS | CONST_PERSISTENT);
221   REGISTER_LONG_CONSTANT("UDM_FIELD_TITLE",        UDM_FIELD_TITLE,    CONST_CS | CONST_PERSISTENT);
222   REGISTER_LONG_CONSTANT("UDM_FIELD_KEYWORDS",     UDM_FIELD_KEYWORDS, CONST_CS | CONST_PERSISTENT);
223   REGISTER_LONG_CONSTANT("UDM_FIELD_DESC",         UDM_FIELD_DESC,     CONST_CS | CONST_PERSISTENT);
224   REGISTER_LONG_CONSTANT("UDM_FIELD_DESCRIPTION",  UDM_FIELD_DESC,     CONST_CS | CONST_PERSISTENT);
225   REGISTER_LONG_CONSTANT("UDM_FIELD_TEXT",         UDM_FIELD_TEXT,     CONST_CS | CONST_PERSISTENT);
226   REGISTER_LONG_CONSTANT("UDM_FIELD_SIZE",         UDM_FIELD_SIZE,     CONST_CS | CONST_PERSISTENT);
227   REGISTER_LONG_CONSTANT("UDM_FIELD_RATING",       UDM_FIELD_RATING,   CONST_CS | CONST_PERSISTENT);
228   REGISTER_LONG_CONSTANT("UDM_FIELD_SCORE",        UDM_FIELD_RATING,   CONST_CS | CONST_PERSISTENT);
229   REGISTER_LONG_CONSTANT("UDM_FIELD_MODIFIED",     UDM_FIELD_MODIFIED, CONST_CS | CONST_PERSISTENT);
230   REGISTER_LONG_CONSTANT("UDM_FIELD_ORDER",        UDM_FIELD_ORDER,    CONST_CS | CONST_PERSISTENT);
231   REGISTER_LONG_CONSTANT("UDM_FIELD_CRC",          UDM_FIELD_CRC,      CONST_CS | CONST_PERSISTENT);
232   REGISTER_LONG_CONSTANT("UDM_FIELD_LANG",         UDM_FIELD_LANG,     CONST_CS | CONST_PERSISTENT);
233   REGISTER_LONG_CONSTANT("UDM_FIELD_CHARSET",      UDM_FIELD_CHARSET,  CONST_CS | CONST_PERSISTENT);
234   REGISTER_LONG_CONSTANT("UDM_FIELD_SITEID",       UDM_FIELD_SITEID,   CONST_CS | CONST_PERSISTENT);
235   REGISTER_LONG_CONSTANT("UDM_FIELD_POP_RANK",     UDM_FIELD_POP_RANK, CONST_CS | CONST_PERSISTENT);
236   REGISTER_LONG_CONSTANT("UDM_FIELD_ORIGINID",     UDM_FIELD_ORIGINID, CONST_CS | CONST_PERSISTENT);
237 
238   /* udm_set_agent_param constants */
239   REGISTER_LONG_CONSTANT("UDM_PARAM_PAGE_SIZE",       UDM_PARAM_PAGE_SIZE,       CONST_CS | CONST_PERSISTENT);
240   REGISTER_LONG_CONSTANT("UDM_PARAM_PAGE_NUM",        UDM_PARAM_PAGE_NUM,        CONST_CS | CONST_PERSISTENT);
241 
242   REGISTER_LONG_CONSTANT("UDM_PARAM_SEARCH_MODE",     UDM_PARAM_SEARCH_MODE,     CONST_CS | CONST_PERSISTENT);
243   REGISTER_LONG_CONSTANT("UDM_PARAM_CACHE_MODE",      UDM_PARAM_CACHE_MODE,      CONST_CS | CONST_PERSISTENT);
244   REGISTER_LONG_CONSTANT("UDM_PARAM_TRACK_MODE",      UDM_PARAM_TRACK_MODE,      CONST_CS | CONST_PERSISTENT);
245   REGISTER_LONG_CONSTANT("UDM_PARAM_PHRASE_MODE",     UDM_PARAM_PHRASE_MODE,     CONST_CS | CONST_PERSISTENT);
246 
247   REGISTER_LONG_CONSTANT("UDM_PARAM_CHARSET",         UDM_PARAM_CHARSET,         CONST_CS | CONST_PERSISTENT);
248   REGISTER_LONG_CONSTANT("UDM_PARAM_LOCAL_CHARSET",   UDM_PARAM_LOCAL_CHARSET,   CONST_CS | CONST_PERSISTENT);
249   REGISTER_LONG_CONSTANT("UDM_PARAM_BROWSER_CHARSET", UDM_PARAM_BROWSER_CHARSET, CONST_CS | CONST_PERSISTENT);
250 
251   REGISTER_LONG_CONSTANT("UDM_PARAM_STOPTABLE",       UDM_PARAM_STOPTABLE,       CONST_CS | CONST_PERSISTENT);
252   REGISTER_LONG_CONSTANT("UDM_PARAM_STOP_TABLE",      UDM_PARAM_STOPTABLE,       CONST_CS | CONST_PERSISTENT);
253   REGISTER_LONG_CONSTANT("UDM_PARAM_STOPFILE",        UDM_PARAM_STOPFILE,        CONST_CS | CONST_PERSISTENT);
254   REGISTER_LONG_CONSTANT("UDM_PARAM_STOP_FILE",       UDM_PARAM_STOPFILE,        CONST_CS | CONST_PERSISTENT);
255 
256   REGISTER_LONG_CONSTANT("UDM_PARAM_WEIGHT_FACTOR",   UDM_PARAM_WEIGHT_FACTOR,   CONST_CS | CONST_PERSISTENT);
257   REGISTER_LONG_CONSTANT("UDM_PARAM_WORD_MATCH",      UDM_PARAM_WORD_MATCH,      CONST_CS | CONST_PERSISTENT);
258 
259   REGISTER_LONG_CONSTANT("UDM_PARAM_MAX_WORD_LEN",    UDM_PARAM_MAX_WORD_LEN,    CONST_CS | CONST_PERSISTENT);
260   REGISTER_LONG_CONSTANT("UDM_PARAM_MAX_WORDLEN",     UDM_PARAM_MAX_WORD_LEN,    CONST_CS | CONST_PERSISTENT);
261   REGISTER_LONG_CONSTANT("UDM_PARAM_MIN_WORD_LEN",    UDM_PARAM_MIN_WORD_LEN,    CONST_CS | CONST_PERSISTENT);
262   REGISTER_LONG_CONSTANT("UDM_PARAM_MIN_WORDLEN",     UDM_PARAM_MIN_WORD_LEN,    CONST_CS | CONST_PERSISTENT);
263 
264   REGISTER_LONG_CONSTANT("UDM_PARAM_ISPELL_PREFIXES", UDM_PARAM_ISPELL_PREFIXES,CONST_CS | CONST_PERSISTENT);
265   REGISTER_LONG_CONSTANT("UDM_PARAM_ISPELL_PREFIX",   UDM_PARAM_ISPELL_PREFIXES,CONST_CS | CONST_PERSISTENT);
266   REGISTER_LONG_CONSTANT("UDM_PARAM_PREFIXES",        UDM_PARAM_ISPELL_PREFIXES,CONST_CS | CONST_PERSISTENT);
267   REGISTER_LONG_CONSTANT("UDM_PARAM_PREFIX",          UDM_PARAM_ISPELL_PREFIXES,CONST_CS | CONST_PERSISTENT);
268 
269   REGISTER_LONG_CONSTANT("UDM_PARAM_VARDIR",  UDM_PARAM_VARDIR,CONST_CS | CONST_PERSISTENT);
270   REGISTER_LONG_CONSTANT("UDM_PARAM_DATADIR",  UDM_PARAM_VARDIR,CONST_CS | CONST_PERSISTENT);
271 
272   REGISTER_LONG_CONSTANT("UDM_PARAM_HLBEG",  UDM_PARAM_HLBEG,CONST_CS | CONST_PERSISTENT);
273   REGISTER_LONG_CONSTANT("UDM_PARAM_HLEND",  UDM_PARAM_HLEND,CONST_CS | CONST_PERSISTENT);
274 
275   REGISTER_LONG_CONSTANT("UDM_PARAM_SYNONYM",  UDM_PARAM_SYNONYM,CONST_CS | CONST_PERSISTENT);
276   REGISTER_LONG_CONSTANT("UDM_PARAM_STORED",  UDM_PARAM_STORED,CONST_CS | CONST_PERSISTENT);
277   REGISTER_LONG_CONSTANT("UDM_PARAM_GROUPBYSITE",  UDM_PARAM_GROUPBYSITE,CONST_CS | CONST_PERSISTENT);
278 
279   REGISTER_LONG_CONSTANT("UDM_PARAM_QSTRING",  UDM_PARAM_QSTRING,CONST_CS | CONST_PERSISTENT);
280   REGISTER_LONG_CONSTANT("UDM_PARAM_REMOTE_ADDR",  UDM_PARAM_REMOTE_ADDR,CONST_CS | CONST_PERSISTENT);
281   REGISTER_LONG_CONSTANT("UDM_PARAM_QUERY",  UDM_PARAM_QUERY,CONST_CS | CONST_PERSISTENT);
282   REGISTER_LONG_CONSTANT("UDM_PARAM_SITEID",  UDM_PARAM_SITEID,CONST_CS | CONST_PERSISTENT);
283   REGISTER_LONG_CONSTANT("UDM_PARAM_DETECT_CLONES",UDM_PARAM_DETECT_CLONES,CONST_CS | CONST_PERSISTENT);
284   REGISTER_LONG_CONSTANT("UDM_PARAM_SORT_ORDER",UDM_PARAM_SORT_ORDER,CONST_CS | CONST_PERSISTENT);
285   REGISTER_LONG_CONSTANT("UDM_PARAM_RESULTS_LIMIT",UDM_PARAM_RESULTS_LIMIT,CONST_CS | CONST_PERSISTENT);
286 
287   REGISTER_LONG_CONSTANT("UDM_PARAM_EXCERPT_SIZE",UDM_PARAM_EXCERPT_SIZE,CONST_CS | CONST_PERSISTENT);
288   REGISTER_LONG_CONSTANT("UDM_PARAM_EXCERPT_PADDING",UDM_PARAM_EXCERPT_PADDING,CONST_CS | CONST_PERSISTENT);
289 
290   /* udm_add_search_limit constants */
291   REGISTER_LONG_CONSTANT("UDM_LIMIT_CAT",    UDM_LIMIT_CAT,CONST_CS | CONST_PERSISTENT);
292   REGISTER_LONG_CONSTANT("UDM_LIMIT_URL",    UDM_LIMIT_URL,CONST_CS | CONST_PERSISTENT);
293   REGISTER_LONG_CONSTANT("UDM_LIMIT_TAG",    UDM_LIMIT_TAG,CONST_CS | CONST_PERSISTENT);
294   REGISTER_LONG_CONSTANT("UDM_LIMIT_LANG",  UDM_LIMIT_LANG,CONST_CS | CONST_PERSISTENT);
295   REGISTER_LONG_CONSTANT("UDM_LIMIT_DATE",  UDM_LIMIT_DATE,CONST_CS | CONST_PERSISTENT);
296   REGISTER_LONG_CONSTANT("UDM_LIMIT_TYPE",  UDM_LIMIT_TYPE,CONST_CS | CONST_PERSISTENT);
297 
298   /* udm_get_res_param constants */
299   REGISTER_LONG_CONSTANT("UDM_PARAM_FOUND",  UDM_PARAM_FOUND,CONST_CS | CONST_PERSISTENT);
300   REGISTER_LONG_CONSTANT("UDM_PARAM_NUM_ROWS",  UDM_PARAM_NUM_ROWS,CONST_CS | CONST_PERSISTENT);
301   REGISTER_LONG_CONSTANT("UDM_PARAM_WORDINFO",  UDM_PARAM_WORDINFO,CONST_CS | CONST_PERSISTENT);
302   REGISTER_LONG_CONSTANT("UDM_PARAM_WORDINFO_ALL",UDM_PARAM_WORDINFO_ALL,CONST_CS | CONST_PERSISTENT);
303   REGISTER_LONG_CONSTANT("UDM_PARAM_WORD_INFO",  UDM_PARAM_WORDINFO,CONST_CS | CONST_PERSISTENT);
304   REGISTER_LONG_CONSTANT("UDM_PARAM_SEARCHTIME",  UDM_PARAM_SEARCHTIME,CONST_CS | CONST_PERSISTENT);
305   REGISTER_LONG_CONSTANT("UDM_PARAM_SEARCH_TIME",  UDM_PARAM_SEARCHTIME,CONST_CS | CONST_PERSISTENT);
306   REGISTER_LONG_CONSTANT("UDM_PARAM_FIRST_DOC",  UDM_PARAM_FIRST_DOC,CONST_CS | CONST_PERSISTENT);
307   REGISTER_LONG_CONSTANT("UDM_PARAM_LAST_DOC",  UDM_PARAM_LAST_DOC,CONST_CS | CONST_PERSISTENT);
308 
309   /* search modes */
310   REGISTER_LONG_CONSTANT("UDM_MODE_ALL",    UDM_MODE_ALL,CONST_CS | CONST_PERSISTENT);
311   REGISTER_LONG_CONSTANT("UDM_MODE_ANY",    UDM_MODE_ANY,CONST_CS | CONST_PERSISTENT);
312   REGISTER_LONG_CONSTANT("UDM_MODE_BOOL",    UDM_MODE_BOOL,CONST_CS | CONST_PERSISTENT);
313   REGISTER_LONG_CONSTANT("UDM_MODE_PHRASE",  UDM_MODE_PHRASE,CONST_CS | CONST_PERSISTENT);
314 
315   /* search cache params */
316   REGISTER_LONG_CONSTANT("UDM_CACHE_ENABLED",  UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
317   REGISTER_LONG_CONSTANT("UDM_CACHE_DISABLED",  UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
318 
319   /* track mode params */
320   REGISTER_LONG_CONSTANT("UDM_TRACK_ENABLED",  UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
321   REGISTER_LONG_CONSTANT("UDM_TRACK_DISABLED",  UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
322 
323   /* phrase mode params */
324   REGISTER_LONG_CONSTANT("UDM_PHRASE_ENABLED",  UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
325   REGISTER_LONG_CONSTANT("UDM_PHRASE_DISABLED",  UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
326 
327   /* general params */
328   REGISTER_LONG_CONSTANT("UDM_ENABLED",    UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
329   REGISTER_LONG_CONSTANT("UDM_DISABLED",    UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
330 
331   /* prefixes mode params */
332   REGISTER_LONG_CONSTANT("UDM_PREFIXES_ENABLED",  UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
333   REGISTER_LONG_CONSTANT("UDM_PREFIX_ENABLED",  UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
334   REGISTER_LONG_CONSTANT("UDM_ISPELL_PREFIXES_ENABLED",UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
335   REGISTER_LONG_CONSTANT("UDM_ISPELL_PREFIX_ENABLED",UDM_ENABLED,CONST_CS | CONST_PERSISTENT);
336 
337   REGISTER_LONG_CONSTANT("UDM_PREFIXES_DISABLED",  UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
338   REGISTER_LONG_CONSTANT("UDM_PREFIX_DISABLED",  UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
339   REGISTER_LONG_CONSTANT("UDM_ISPELL_PREFIXES_DISABLED",UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
340   REGISTER_LONG_CONSTANT("UDM_ISPELL_PREFIX_DISABLED",UDM_DISABLED,CONST_CS | CONST_PERSISTENT);
341 
342   /* ispell type params */
343   REGISTER_LONG_CONSTANT("UDM_ISPELL_TYPE_AFFIX",  UDM_ISPELL_TYPE_AFFIX,CONST_CS | CONST_PERSISTENT);
344   REGISTER_LONG_CONSTANT("UDM_ISPELL_TYPE_SPELL",  UDM_ISPELL_TYPE_SPELL,CONST_CS | CONST_PERSISTENT);
345   REGISTER_LONG_CONSTANT("UDM_ISPELL_TYPE_DB",  UDM_ISPELL_TYPE_DB,CONST_CS | CONST_PERSISTENT);
346   REGISTER_LONG_CONSTANT("UDM_ISPELL_TYPE_SERVER",UDM_ISPELL_TYPE_SERVER,CONST_CS | CONST_PERSISTENT);
347 
348   /* word match mode params */
349   REGISTER_LONG_CONSTANT("UDM_MATCH_WORD",  UDM_MATCH_WORD,CONST_CS | CONST_PERSISTENT);
350   REGISTER_LONG_CONSTANT("UDM_MATCH_BEGIN",  UDM_MATCH_BEGIN,CONST_CS | CONST_PERSISTENT);
351   REGISTER_LONG_CONSTANT("UDM_MATCH_SUBSTR",  UDM_MATCH_SUBSTR,CONST_CS | CONST_PERSISTENT);
352   REGISTER_LONG_CONSTANT("UDM_MATCH_END",    UDM_MATCH_END,CONST_CS | CONST_PERSISTENT);
353 
354   return SUCCESS;
355 }
356 /* }}} */
357 
PHP_MSHUTDOWN_FUNCTION(mnogosearch)358 DLEXPORT PHP_MSHUTDOWN_FUNCTION(mnogosearch)
359 {
360   return SUCCESS;
361 }
362 
363 
PHP_RINIT_FUNCTION(mnogosearch)364 DLEXPORT PHP_RINIT_FUNCTION(mnogosearch)
365 {
366   return SUCCESS;
367 }
368 
369 
PHP_MINFO_FUNCTION(mnogosearch)370 DLEXPORT PHP_MINFO_FUNCTION(mnogosearch)
371 {
372   char buf[32];
373 
374   php_info_print_table_start();
375   php_info_print_table_row(2, "mnoGoSearch Support", "enabled" );
376 
377   sprintf(buf,"%d", UDM_VERSION_ID);
378   php_info_print_table_row(2, "mnoGoSearch library version", buf );
379   php_info_print_table_end();
380 }
381 
382 
MyRemoveHiLightDup(const char * s)383 static char* MyRemoveHiLightDup(const char *s)
384 {
385   size_t len= strlen(s)+1;
386   char   *d, *res = (char*)emalloc(len);
387 
388   for(d=res; s[0]; s++)
389   {
390     switch(s[0])
391     {
392       case '\2':
393       case '\3':
394         break;
395       case '&':
396         if (s[1] == '#')
397         {
398           char *e;
399           int code= 0;
400 
401           for (e= (char *)s+2; (*e >= '0') && (*e <= '9'); code= code*10 + e[0]-'0', e++);
402           if (*e == ';')
403           {
404             *d++= (code < 128) ? code : '?';
405             s= e;
406             break;
407           }
408         }
409         /* pass through */
410 
411       default:
412         *d++=*s;
413     }
414   }
415   *d='\0';
416   return res;
417 }
418 
419 /* {{{ proto int udm_alloc_agent(string dbaddr [, string dbmode])
420    Allocate mnoGoSearch session */
PHP_FUNCTION(udm_alloc_agent)421 DLEXPORT PHP_FUNCTION(udm_alloc_agent)
422 {
423   switch(ZEND_NUM_ARGS())
424   {
425 
426     case 1:
427       {
428         zval **yydbaddr;
429         char *dbaddr;
430         UDM_ENV   * Env;
431         UDM_AGENT * Agent;
432 
433         if(zend_get_parameters_ex(1,&yydbaddr) == FAILURE)
434           RETURN_FALSE;
435 
436         convert_to_string_ex(yydbaddr);
437         dbaddr= Z_STRVAL_PP(yydbaddr);
438 
439         Env= (UDM_ENV *) malloc(sizeof(UDM_ENV));
440         Agent= (UDM_AGENT *) malloc(sizeof(UDM_AGENT));
441         UdmEnvInit(Env);
442         UdmAgentInit(Agent, Env, 0);
443         UdmVarListReplaceStr(&Env->Vars,"SyslogFacility","local7");
444         UdmEnvSetLogLevel(Env,0);
445         UdmOpenLog("mnoGoSearch-php",Env,0);
446         UdmEnvDBListAdd(Env, dbaddr);
447         ZEND_REGISTER_RESOURCE(return_value,Agent,le_link);
448       }
449       break;
450 
451     case 2:
452       {
453         zval **yydbaddr;
454         zval **yydbmode;
455         char *dbaddr;
456         char *dbmode;
457         UDM_ENV   * Env;
458         UDM_AGENT * Agent;
459 
460         if (zend_get_parameters_ex(2,&yydbaddr,&yydbmode) == FAILURE)
461           RETURN_FALSE;
462 
463         convert_to_string_ex(yydbaddr);
464         convert_to_string_ex(yydbmode);
465         dbaddr= Z_STRVAL_PP(yydbaddr);
466         dbmode= Z_STRVAL_PP(yydbmode);
467 
468         Env= (UDM_ENV *) malloc(sizeof(UDM_ENV));
469         Agent= (UDM_AGENT *) malloc(sizeof(UDM_AGENT));
470         UdmEnvInit(Env);
471         UdmAgentInit(Agent, Env, 0);
472         UdmVarListReplaceStr(&Env->Vars,"SyslogFacility","local7");
473         UdmEnvSetLogLevel(Env,0);
474         UdmOpenLog("mnoGoSearch-php",Env,0);
475         UdmEnvDBListAdd(Env,dbaddr);
476         ZEND_REGISTER_RESOURCE(return_value,Agent,le_link);
477       }
478       break;
479 
480     default:
481       WRONG_PARAM_COUNT;
482       break;
483   }
484 }
485 /* }}} */
486 
487 /* {{{ proto int udm_set_agent_param(int agent, int var, string val)
488    Set mnoGoSearch agent session parameters */
PHP_FUNCTION(udm_set_agent_param)489 DLEXPORT PHP_FUNCTION(udm_set_agent_param)
490 {
491   zval **yyagent, **yyvar, **yyval;
492   char *val;
493   int var;
494   UDM_AGENT * Agent;
495 
496   switch(ZEND_NUM_ARGS())
497   {
498 
499     case 3:
500       if(zend_get_parameters_ex(3,&yyagent,&yyvar,&yyval) == FAILURE)
501         RETURN_FALSE;
502 
503       convert_to_long_ex(yyvar);
504       convert_to_string_ex(yyval);
505       ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-agent", le_link);
506       var= Z_LVAL_PP(yyvar);
507       val= Z_STRVAL_PP(yyval);
508 
509       break;
510 
511     default:
512       WRONG_PARAM_COUNT;
513       break;
514   }
515 
516   switch(var)
517   {
518     case UDM_PARAM_PAGE_SIZE:
519       UdmVarListReplaceStr(&Agent->Conf->Vars,"ps",val);
520       break;
521 
522     case UDM_PARAM_PAGE_NUM:
523       UdmVarListReplaceStr(&Agent->Conf->Vars,"np",val);
524       break;
525 
526     case UDM_PARAM_SEARCH_MODE:
527       switch (atoi(val))
528       {
529         case UDM_MODE_ALL:
530           UdmVarListReplaceStr(&Agent->Conf->Vars,"m","all");
531           break;
532 
533         case UDM_MODE_ANY:
534           UdmVarListReplaceStr(&Agent->Conf->Vars,"m","any");
535           break;
536 
537         case UDM_MODE_BOOL:
538           UdmVarListReplaceStr(&Agent->Conf->Vars,"m","bool");
539           break;
540 
541         case UDM_MODE_PHRASE:
542           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown search mode");
543           RETURN_FALSE;
544           break;
545 
546         default:
547           UdmVarListReplaceStr(&Agent->Conf->Vars,"m","all");
548           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown search mode");
549           RETURN_FALSE;
550           break;
551       }
552       break;
553 
554     case UDM_PARAM_WORD_MATCH:
555       switch (atoi(val))
556       {
557         case UDM_MATCH_WORD:
558           UdmVarListReplaceStr(&Agent->Conf->Vars,"wm","wrd");
559           break;
560 
561         case UDM_MATCH_BEGIN:
562           UdmVarListReplaceStr(&Agent->Conf->Vars,"wm","beg");
563           break;
564 
565         case UDM_MATCH_END:
566           UdmVarListReplaceStr(&Agent->Conf->Vars,"wm","end");
567           break;
568 
569         case UDM_MATCH_SUBSTR:
570           UdmVarListReplaceStr(&Agent->Conf->Vars,"wm","sub");
571           break;
572 
573         default:
574           UdmVarListReplaceStr(&Agent->Conf->Vars,"wm","wrd");
575           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown word match mode");
576           RETURN_FALSE;
577           break;
578       }
579       break;
580     case UDM_PARAM_CACHE_MODE:
581       switch (atoi(val))
582       {
583         case UDM_ENABLED:
584           UdmVarListReplaceStr(&Agent->Conf->Vars,"Cache","yes");
585           break;
586 
587         case UDM_DISABLED:
588           UdmVarListReplaceStr(&Agent->Conf->Vars,"Cache","no");
589           break;
590 
591         default:
592           UdmVarListReplaceStr(&Agent->Conf->Vars,"Cache","no");
593           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown cache mode");
594           RETURN_FALSE;
595           break;
596       }
597       break;
598 
599     case UDM_PARAM_TRACK_MODE:
600       switch (atoi(val))
601       {
602         case UDM_ENABLED:
603           UdmVarListReplaceStr(&Agent->Conf->Vars,"TrackQuery","yes");
604           break;
605 
606         case UDM_DISABLED:
607           UdmVarListReplaceStr(&Agent->Conf->Vars,"TrackQuery","no");
608           break;
609 
610         default:
611           UdmVarListReplaceStr(&Agent->Conf->Vars,"TrackQuery","no");
612           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown track mode");
613           RETURN_FALSE;
614           break;
615       }
616       break;
617 
618     case UDM_PARAM_PHRASE_MODE:
619       break;
620 
621     case UDM_PARAM_ISPELL_PREFIXES:
622       switch (atoi(val))
623       {
624         case UDM_ENABLED:
625           UdmVarListReplaceStr(&Agent->Conf->Vars,"IspellUsePrefixes","1");
626           break;
627 
628         case UDM_DISABLED:
629           UdmVarListReplaceStr(&Agent->Conf->Vars,"IspellUsePrefixes","0");
630           break;
631 
632         default:
633           UdmVarListReplaceStr(&Agent->Conf->Vars,"IspellUsePrefixes","0");
634           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown ispell prefixes mode");
635           RETURN_FALSE;
636           break;
637       }
638       break;
639 
640     case UDM_PARAM_CHARSET:
641     case UDM_PARAM_LOCAL_CHARSET:
642       UdmVarListReplaceStr(&Agent->Conf->Vars,"LocalCharset",val);
643       {
644         const char * charset= UdmVarListFindStr(&Agent->Conf->Vars,"LocalCharset","iso-8859-1");
645         Agent->Conf->lcs= UdmGetCharSet(charset);
646       }
647       break;
648 
649     case UDM_PARAM_BROWSER_CHARSET:
650       UdmVarListReplaceStr(&Agent->Conf->Vars,"BrowserCharset",val);
651       {
652         const char * charset= UdmVarListFindStr(&Agent->Conf->Vars,"BrowserCharset","iso-8859-1");
653         Agent->Conf->bcs= UdmGetCharSet(charset);
654       }
655       break;
656 
657     case UDM_PARAM_HLBEG:
658       UdmVarListReplaceStr(&Agent->Conf->Vars,"HlBeg",val);
659       break;
660 
661     case UDM_PARAM_HLEND:
662       UdmVarListReplaceStr(&Agent->Conf->Vars,"HlEnd",val);
663       break;
664 
665     case UDM_PARAM_SYNONYM:
666       if (UdmSynonymListLoad(Agent->Conf,val))
667       {
668         php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s",Agent->Conf->errstr);
669         RETURN_FALSE;
670       }
671       else
672       {
673 #if UDM_VERSION_ID >= 30307
674         UdmSynonymListListSortItems(&Agent->Conf->Synonym);
675 #else
676         UdmSynonymListSort(&(Agent->Conf->Synonyms));
677 #endif
678       }
679       break;
680 
681     case UDM_PARAM_QSTRING:
682       UdmVarListReplaceStr(&Agent->Conf->Vars,"QUERY_STRING",val);
683       break;
684 
685     case UDM_PARAM_REMOTE_ADDR:
686       UdmVarListReplaceStr(&Agent->Conf->Vars,"IP",val);
687       break;
688 
689     case UDM_PARAM_STOPTABLE:
690       break;
691 
692     case UDM_PARAM_STOPFILE:
693       if (UdmStopListLoad(Agent->Conf,val))
694       {
695         php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", Agent->Conf->errstr);
696         RETURN_FALSE;
697       }
698       break;
699 
700     case UDM_PARAM_WEIGHT_FACTOR:
701       UdmVarListReplaceStr(&Agent->Conf->Vars,"wf",val);
702       break;
703 
704     case UDM_PARAM_MIN_WORD_LEN:
705       Agent->Conf->WordParam.min_word_len=atoi(val);
706       break;
707 
708     case UDM_PARAM_MAX_WORD_LEN:
709       Agent->Conf->WordParam.max_word_len=atoi(val);
710       break;
711 
712     case UDM_PARAM_VARDIR:
713       UdmVarListReplaceStr(&Agent->Conf->Vars,"Vardir",val);
714       break;
715 
716     case UDM_PARAM_QUERY:
717       UdmVarListReplaceStr(&Agent->Conf->Vars,"q",val);
718       break;
719 
720     case UDM_PARAM_STORED:
721       UdmVarListReplaceStr(&Agent->Conf->Vars,"StoredAddr",val);
722       break;
723 
724     case UDM_PARAM_GROUPBYSITE:
725       switch (atoi(val))
726       {
727         case UDM_ENABLED:
728           UdmVarListReplaceStr(&Agent->Conf->Vars,"GroupBySite","yes");
729           break;
730 
731         case UDM_DISABLED:
732           UdmVarListReplaceStr(&Agent->Conf->Vars,"GroupBySite","no");
733           break;
734 
735         default:
736           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown groupbysite mode");
737           RETURN_FALSE;
738           break;
739       }
740       break;
741 
742     case UDM_PARAM_SITEID:
743       UdmVarListReplaceStr(&Agent->Conf->Vars,"site",val);
744       break;
745 
746     case UDM_PARAM_DETECT_CLONES:
747       switch (atoi(val))
748       {
749         case UDM_ENABLED:
750           UdmVarListReplaceStr(&Agent->Conf->Vars,"DetectClones","yes");
751           break;
752 
753         case UDM_DISABLED:
754           UdmVarListReplaceStr(&Agent->Conf->Vars,"DetectClones","no");
755           break;
756 
757         default:
758           php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown clones mode");
759           RETURN_FALSE;
760           break;
761       }
762       break;
763 
764     case UDM_PARAM_SORT_ORDER:
765       UdmVarListReplaceStr(&Agent->Conf->Vars,"s",val);
766       break;
767 
768     case UDM_PARAM_RESULTS_LIMIT:
769       UdmVarListReplaceStr(&Agent->Conf->Vars,"ResultsLimit",val);
770       break;
771 
772     case UDM_PARAM_EXCERPT_SIZE:
773       UdmVarListReplaceStr(&Agent->Conf->Vars,"ExcerptSize",val);
774       break;
775     case UDM_PARAM_EXCERPT_PADDING:
776       UdmVarListReplaceStr(&Agent->Conf->Vars,"ExcerptPadding",val);
777       break;
778     default:
779       php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown agent session parameter");
780       RETURN_FALSE;
781       break;
782   }
783   RETURN_TRUE;
784 }
785 /* }}} */
786 
787 /* {{{ proto int udm_load_ispell_data(int agent, int var, string val1, [string charset], string val2, int flag)
788    Load ispell data */
PHP_FUNCTION(udm_load_ispell_data)789 DLEXPORT PHP_FUNCTION(udm_load_ispell_data)
790 {
791   zval **yyagent, **yyvar, **yyval1, **yyval2, **yyflag, **yycharset ;
792   char *val1, *val2, *charset;
793   int var, flag;
794   UDM_AGENT * Agent;
795 
796   switch(ZEND_NUM_ARGS())
797   {
798     case 5:
799       if (zend_get_parameters_ex(5,&yyagent,&yyvar,&yyval1,&yyval2,&yyflag) == FAILURE)
800         RETURN_FALSE;
801 
802       convert_to_long_ex(yyvar);
803       convert_to_long_ex(yyflag);
804       convert_to_string_ex(yyval1);
805       convert_to_string_ex(yyval2);
806       ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-agent", le_link);
807       var  = Z_LVAL_PP(yyvar);
808       flag = Z_LVAL_PP(yyflag);
809       val1 = Z_STRVAL_PP(yyval1);
810       val2 = Z_STRVAL_PP(yyval2);
811       charset = "us-ascii";
812       break;
813 
814     case 6:
815       if (zend_get_parameters_ex(6,&yyagent,&yyvar,&yyval1,&yycharset,&yyval2,&yyflag) == FAILURE)
816         RETURN_FALSE;
817 
818       convert_to_long_ex(yyvar);
819       convert_to_long_ex(yyflag);
820       convert_to_string_ex(yyval1);
821       convert_to_string_ex(yyval2);
822       convert_to_string_ex(yycharset);
823       ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-agent", le_link);
824       var  = Z_LVAL_PP(yyvar);
825       flag = Z_LVAL_PP(yyflag);
826       val1 = Z_STRVAL_PP(yyval1);
827       val2 = Z_STRVAL_PP(yyval2);
828       charset = Z_STRVAL_PP(yycharset);
829       break;
830 
831     default:
832       WRONG_PARAM_COUNT;
833       break;
834   }
835 
836 
837   switch(var)
838   {
839 
840     case UDM_ISPELL_TYPE_AFFIX:
841       if (UdmAffixListListAdd(&Agent->Conf->Affixes,val1,charset,val2))
842       {
843         php_error_docref(NULL TSRMLS_CC, E_WARNING,"Cannot load affix file %s",val2);
844         RETURN_FALSE;
845       }
846       break;
847 
848     case UDM_ISPELL_TYPE_SPELL:
849       if (UdmSpellListListAdd(&Agent->Conf->Spells,val1,charset,val2))
850       {
851         php_error_docref(NULL TSRMLS_CC, E_WARNING,"Cannot load spell file %s",val2);
852         RETURN_FALSE;
853       }
854       break;
855 
856     default:
857       php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown ispell type parameter");
858       RETURN_FALSE;
859       break;
860   }
861 
862   if (flag)
863   {
864     if(Agent->Conf->Spells.nitems && Agent->Conf->Affixes.nitems)
865     {
866       char *err= Agent->Conf->errstr;
867       int flags= strcasecmp(UdmVarListFindStr(&Agent->Conf->Vars,
868                 "IspellUsePrefixes","no"),"no");
869       flags= flags ? 0 : UDM_SPELL_NOPREFIX;
870       if (UdmSpellListListLoad(&Agent->Conf->Spells, err, 128) ||
871           UdmAffixListListLoad(&Agent->Conf->Affixes, flags, err, 128))
872       {
873         php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error loading ispell data '%s'", err);
874         RETURN_FALSE;
875       }
876     }
877   }
878 
879   RETURN_TRUE;
880 }
881 /* }}} */
882 
883 /* {{{ proto int udm_free_ispell_data(int agent)
884    Free memory allocated for ispell data */
PHP_FUNCTION(udm_free_ispell_data)885 DLEXPORT PHP_FUNCTION(udm_free_ispell_data)
886 {
887   zval ** yyagent;
888   UDM_AGENT * Agent;
889   switch(ZEND_NUM_ARGS())
890   {
891     case 1:
892       if (zend_get_parameters_ex(1, &yyagent) == FAILURE)
893         RETURN_FALSE;
894       break;
895     default:
896       WRONG_PARAM_COUNT;
897       break;
898   }
899   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-Agent", le_link);
900 
901   UdmSpellListListFree(&Agent->Conf->Spells);
902   UdmAffixListListFree(&Agent->Conf->Affixes);
903 
904   RETURN_TRUE;
905 }
906 /* }}} */
907 
908 /* {{{ proto int udm_add_search_limit(int agent, int var, string val)
909    Add mnoGoSearch search restrictions */
PHP_FUNCTION(udm_add_search_limit)910 DLEXPORT PHP_FUNCTION(udm_add_search_limit)
911 {
912   zval **yyagent, **yyvar, **yyval;
913   char *val;
914   int var;
915   UDM_AGENT * Agent;
916 
917   switch(ZEND_NUM_ARGS()){
918 
919     case 3:
920       if(zend_get_parameters_ex(3,&yyagent,&yyvar,&yyval)==FAILURE){
921         RETURN_FALSE;
922       }
923       convert_to_long_ex(yyvar);
924       convert_to_string_ex(yyval);
925       ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-agent", le_link);
926       var = Z_LVAL_PP(yyvar);
927       val = Z_STRVAL_PP(yyval);
928 
929       break;
930 
931     default:
932       WRONG_PARAM_COUNT;
933       break;
934   }
935 
936   switch(var){
937     case UDM_LIMIT_URL:
938       UdmVarListAddStr(&Agent->Conf->Vars,"ul",val);
939       break;
940 
941     case UDM_LIMIT_TAG:
942       UdmVarListAddStr(&Agent->Conf->Vars,"t",val);
943       break;
944 
945     case UDM_LIMIT_LANG:
946       UdmVarListAddStr(&Agent->Conf->Vars,"lang",val);
947       break;
948 
949     case UDM_LIMIT_CAT:
950       UdmVarListAddStr(&Agent->Conf->Vars,"cat",val);
951       break;
952 
953     case UDM_LIMIT_TYPE:
954       UdmVarListAddStr(&Agent->Conf->Vars,"type",val);
955       break;
956 
957     case UDM_LIMIT_DATE:
958                         {
959                           struct tm       *d_tm;
960                             time_t          d_t;
961                             char            *d_val2;
962                             char            d_db[20], d_de[20];
963                             d_t = atol (val+1);
964                             d_tm = localtime (&d_t);
965                             if (val[0] == '>') {
966                           UdmVarListReplaceStr(&Agent->Conf->Vars,"dt","er");
967                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dx","1");
968                                 sprintf (d_db, "%d", d_tm->tm_mday);
969                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dd",d_db);
970                                 sprintf (d_db, "%d", d_tm->tm_mon);
971                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dm",d_db);
972                                 sprintf (d_db, "%d", d_tm->tm_year+1900);
973                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dy",d_db);
974                                 RETURN_TRUE;
975                             } else if (val[0] == '<') {
976                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dt","er");
977                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dx","-1");
978                                 sprintf (d_db, "%d", d_tm->tm_mday);
979                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dd",d_db);
980                                 sprintf (d_db, "%d", d_tm->tm_mon);
981                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dm",d_db);
982                                 sprintf (d_db, "%d", d_tm->tm_year+1900);
983                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dy",d_db);
984                                 RETURN_TRUE;
985                             } else if ( (val[0]=='#') && (d_val2 = strchr(val,',')) ){
986                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"dt","range");
987                                 sprintf (d_db, "%d/%d/%d", d_tm->tm_mday, d_tm->tm_mon+1, d_tm->tm_year+1900);
988                                 d_t = atol (d_val2+1);
989                                 d_tm = localtime (&d_t);
990                                 sprintf (d_de, "%d/%d/%d", d_tm->tm_mday, d_tm->tm_mon+1, d_tm->tm_year+1900);
991                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"db",d_db);
992                                 UdmVarListReplaceStr(&Agent->Conf->Vars,"de",d_de);
993                                 RETURN_TRUE;
994                             } else {
995                                 php_error_docref(NULL TSRMLS_CC, E_WARNING,"Incorrect date limit format");
996                                 RETURN_FALSE;
997                             }
998                        }
999       break;
1000     default:
1001       php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown search limit parameter");
1002       RETURN_FALSE;
1003       break;
1004   }
1005   RETURN_TRUE;
1006 }
1007 /* }}} */
1008 
1009 /* {{{ proto int udm_clear_search_limits(int agent)
1010    Clear all mnoGoSearch search restrictions */
PHP_FUNCTION(udm_clear_search_limits)1011 DLEXPORT PHP_FUNCTION(udm_clear_search_limits)
1012 {
1013   zval ** yyagent;
1014   UDM_AGENT * Agent;
1015   int i;
1016 
1017   switch(ZEND_NUM_ARGS()){
1018     case 1: {
1019         if (zend_get_parameters_ex(1, &yyagent)==FAILURE) {
1020           RETURN_FALSE;
1021         }
1022       }
1023       break;
1024     default:
1025       WRONG_PARAM_COUNT;
1026       break;
1027   }
1028   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-Agent", le_link);
1029   for(i=0;i<Agent->Conf->Vars.nvars;i++){
1030     if ((!strcasecmp("ul", UdmVarName(Agent->Conf->Vars.Var[i])))||
1031         (!strcasecmp("cat", UdmVarName(Agent->Conf->Vars.Var[i])))||
1032         (!strcasecmp("t", UdmVarName(Agent->Conf->Vars.Var[i])))||
1033         (!strcasecmp("type", UdmVarName(Agent->Conf->Vars.Var[i])))||
1034         (!strcasecmp("lang", UdmVarName(Agent->Conf->Vars.Var[i]))))
1035     {
1036         UdmVarFree(Agent->Conf->Vars.Var[i]);
1037         Agent->Conf->Vars.nvars--;
1038     }
1039   }
1040   RETURN_TRUE;
1041 }
1042 /* }}} */
1043 
1044 
1045 /* {{{ proto int udm_check_charset(int agent, string charset)
1046    Check if the given charset is known to mnogosearch */
PHP_FUNCTION(udm_check_charset)1047 DLEXPORT PHP_FUNCTION(udm_check_charset)
1048 {
1049   zval ** yycharset, ** yyagent;
1050   UDM_AGENT * Agent;
1051   int id=-1;
1052 
1053   switch(ZEND_NUM_ARGS()){
1054     case 2: {
1055         if (zend_get_parameters_ex(2, &yyagent,&yycharset)==FAILURE) {
1056           RETURN_FALSE;
1057         }
1058       }
1059       break;
1060     default:
1061       WRONG_PARAM_COUNT;
1062       break;
1063   }
1064   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, id, "mnoGoSearch-Agent", le_link);
1065   convert_to_string_ex(yycharset);
1066 
1067 
1068   if (UdmGetCharSet(Z_STRVAL_PP(yycharset))) {
1069       RETURN_TRUE;
1070   } else {
1071       RETURN_FALSE;
1072   }
1073 }
1074 /* }}} */
1075 
1076 
1077 
1078 /* {{{ proto int udm_crc32(int agent, string str)
1079    Return CRC32 checksum of gived string */
PHP_FUNCTION(udm_crc32)1080 DLEXPORT PHP_FUNCTION(udm_crc32)
1081 {
1082   zval ** yystr, ** yyagent;
1083   char *str;
1084   int crc32;
1085   char buf[32];
1086   UDM_AGENT * Agent;
1087   int id=-1;
1088 
1089   switch(ZEND_NUM_ARGS()){
1090     case 2: {
1091         if (zend_get_parameters_ex(2, &yyagent,&yystr)==FAILURE) {
1092           RETURN_FALSE;
1093         }
1094       }
1095       break;
1096     default:
1097       WRONG_PARAM_COUNT;
1098       break;
1099   }
1100   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, id, "mnoGoSearch-Agent", le_link);
1101   convert_to_string_ex(yystr);
1102   str = Z_STRVAL_PP(yystr);
1103 
1104   crc32=UdmCRC32((str),strlen(str));
1105   snprintf(buf,sizeof(buf)-1,"%u",crc32);
1106 
1107   RETURN_STRING(buf,1);
1108 }
1109 /* }}} */
1110 
1111 
1112 
1113 /* {{{ proto int udm_parse_query_string(int agent, string str)
1114    Parses query string, initialises variables and search limits taken from it */
PHP_FUNCTION(udm_parse_query_string)1115 DLEXPORT PHP_FUNCTION(udm_parse_query_string)
1116 {
1117   zval ** yystr, ** yyagent;
1118   char *str;
1119   UDM_AGENT * Agent;
1120   int id=-1;
1121 
1122   switch(ZEND_NUM_ARGS()){
1123     case 2: {
1124         if (zend_get_parameters_ex(2, &yyagent,&yystr)==FAILURE) {
1125           RETURN_FALSE;
1126         }
1127       }
1128       break;
1129     default:
1130       WRONG_PARAM_COUNT;
1131       break;
1132   }
1133   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, id, "mnoGoSearch-Agent", le_link);
1134   convert_to_string_ex(yystr);
1135   str = Z_STRVAL_PP(yystr);
1136 
1137   UdmParseQueryString(Agent,&Agent->Conf->Vars,str);
1138   RETURN_TRUE;
1139 }
1140 /* }}} */
1141 
1142 /* {{{ proto int udm_set_agent_param_ex(int agent, string var, string val)
1143    Set mnoGoSearch agent session parameters extended */
PHP_FUNCTION(udm_set_agent_param_ex)1144 DLEXPORT PHP_FUNCTION(udm_set_agent_param_ex)
1145 {
1146   zval **yyagent, **yyvar, **yyval;
1147   char *val, *var;
1148   UDM_AGENT * Agent;
1149 
1150   switch(ZEND_NUM_ARGS()){
1151 
1152                 case 2:
1153       if(zend_get_parameters_ex(2,&yyagent,&yyvar)==FAILURE){
1154         RETURN_FALSE;
1155       }
1156       convert_to_string_ex(yyvar);
1157       ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-agent", le_link);
1158       var = Z_STRVAL_PP(yyvar);
1159       {
1160           UDM_CFG Cfg;
1161           UDM_SERVER Srv;
1162           UdmServerInit(&Srv);
1163           bzero((void*) &Cfg, sizeof(Cfg));
1164           Cfg.Indexer= Agent;
1165           Cfg.flags= UDM_FLAG_LOAD_LANGMAP + UDM_FLAG_SPELL;
1166           UdmEnvAddLine(&Cfg, var);
1167           UdmServerFree(&Srv);
1168           RETURN_TRUE;
1169           break;
1170       }
1171 
1172     case 3:
1173       if(zend_get_parameters_ex(3,&yyagent,&yyvar,&yyval)==FAILURE){
1174         RETURN_FALSE;
1175       }
1176       convert_to_string_ex(yyvar);
1177       convert_to_string_ex(yyval);
1178       ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-agent", le_link);
1179       var = Z_STRVAL_PP(yyvar);
1180       val = Z_STRVAL_PP(yyval);
1181 
1182       break;
1183 
1184     default:
1185       WRONG_PARAM_COUNT;
1186       break;
1187   }
1188 
1189   UdmVarListReplaceStr(&Agent->Conf->Vars,var,val);
1190 
1191   if (!strcasecmp(var,"LocalCharset")) {
1192     const char * charset=UdmVarListFindStr(&Agent->Conf->Vars,"LocalCharset","iso-8859-1");
1193     Agent->Conf->lcs=UdmGetCharSet(charset);
1194   } else if (!strcasecmp(var,"BrowserCharset")) {
1195     const char * charset=UdmVarListFindStr(&Agent->Conf->Vars,"BrowserCharset","iso-8859-1");
1196     Agent->Conf->bcs=UdmGetCharSet(charset);
1197   } else if (!strcasecmp(var,"Synonym")) {
1198     if (UdmSynonymListLoad(Agent->Conf,val)) {
1199       php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s",Agent->Conf->errstr);
1200       RETURN_FALSE;
1201     }
1202     else
1203     {
1204 #if UDM_VERSION_ID >= 30307
1205       UdmSynonymListListSortItems(&Agent->Conf->Synonym);
1206 #else
1207       UdmSynonymListSort(&(Agent->Conf->Synonyms));
1208 #endif
1209     }
1210   } else if (!strcasecmp(var,"Stopwordfile")) {
1211     if (UdmStopListLoad(Agent->Conf,val)) {
1212       php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", Agent->Conf->errstr);
1213       RETURN_FALSE;
1214     }
1215   } else if (!strcasecmp(var,"MinWordLen")) {
1216     Agent->Conf->WordParam.min_word_len=atoi(val);
1217   } else if (!strcasecmp(var,"MaxWordLen")) {
1218     Agent->Conf->WordParam.max_word_len=atoi(val);
1219   }
1220 
1221   RETURN_TRUE;
1222 }
1223 
1224 /* {{{ proto string udm_get_agent_param_ex(int agent, string field)
1225    Fetch mnoGoSearch environment parameters */
PHP_FUNCTION(udm_get_agent_param_ex)1226 DLEXPORT PHP_FUNCTION(udm_get_agent_param_ex)
1227 {
1228   zval **yyagent, **yyfield_name;
1229 
1230   UDM_AGENT * Agent;
1231   char *field;
1232 
1233   switch(ZEND_NUM_ARGS()){
1234     case 2: {
1235         if (zend_get_parameters_ex(2, &yyagent,&yyfield_name)==FAILURE){
1236           RETURN_FALSE;
1237         }
1238         convert_to_string_ex(yyfield_name);
1239         field = Z_STRVAL_PP(yyfield_name);
1240       }
1241       break;
1242     default:
1243       WRONG_PARAM_COUNT;
1244       break;
1245   }
1246 
1247   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-agent", le_link);
1248 
1249   RETURN_STRING((char *)UdmVarListFindStr(&Agent->Conf->Vars,field,""),1);
1250 }
1251 /* }}} */
1252 
1253 /* {{{ proto string udm_get_res_field_ex(int res, int row, string field)
1254    Fetch mnoGoSearch result field */
PHP_FUNCTION(udm_get_res_field_ex)1255 DLEXPORT PHP_FUNCTION(udm_get_res_field_ex)
1256 {
1257   zval **yyres, **yyrow_num, **yyfield_name;
1258 
1259   UDM_RESULT * Res;
1260   int row;
1261   char *field;
1262 
1263   switch(ZEND_NUM_ARGS()){
1264     case 3: {
1265         if (zend_get_parameters_ex(3, &yyres,&yyrow_num,&yyfield_name)==FAILURE){
1266           RETURN_FALSE;
1267         }
1268         convert_to_string_ex(yyrow_num);
1269         convert_to_string_ex(yyfield_name);
1270         field = Z_STRVAL_PP(yyfield_name);
1271         row = atoi(Z_STRVAL_PP(yyrow_num));
1272       }
1273       break;
1274     default:
1275       WRONG_PARAM_COUNT;
1276       break;
1277   }
1278 
1279   ZEND_FETCH_RESOURCE(Res, UDM_RESULT *, yyres, -1, "mnoGoSearch-Result", le_res);
1280   if (row < UdmResultNumRows(Res))
1281   {
1282     if (!strcasecmp(field,"URL")) {
1283         char  *al;
1284         al = (char *)MyRemoveHiLightDup((const char *)(UdmVarListFindStr(&(Res->Doc[row].Sections), field, "")));
1285         UdmVarListReplaceStr(&Res->Doc[row].Sections,field,al);
1286         efree(al);
1287     }
1288     RETURN_STRING((char *)UdmVarListFindStr(&Res->Doc[row].Sections,field,""),1);
1289   } else {
1290     php_error_docref(NULL TSRMLS_CC, E_WARNING,"row number too large");
1291     RETURN_FALSE;
1292   }
1293 }
1294 /* }}} */
1295 
1296 
1297 
1298 /* {{{ proto int udm_store_doc_cgi(int agent)
1299    Get CachedCopy of document and return TRUE if cached copy found */
PHP_FUNCTION(udm_store_doc_cgi)1300 DLEXPORT PHP_FUNCTION(udm_store_doc_cgi)
1301 {
1302   zval **yyagent;
1303   int id= -1;
1304   UDM_AGENT *Agent;
1305 
1306   switch(ZEND_NUM_ARGS())
1307   {
1308     case 1:
1309       if (zend_get_parameters_ex(1, &yyagent)==FAILURE)
1310         RETURN_FALSE;
1311       break;
1312     default:
1313       WRONG_PARAM_COUNT;
1314       break;
1315   }
1316 
1317   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, id, "mnoGoSearch-Agent", le_link);
1318 
1319   UdmCachedCopyGet(Agent);
1320 
1321   RETURN_TRUE;
1322 }
1323 /* }}} */
1324 
1325 
1326 /* {{{ proto int udm_alloc_agent_array(array dbaddr)
1327    Allocate mnoGoSearch session */
PHP_FUNCTION(udm_alloc_agent_array)1328 DLEXPORT PHP_FUNCTION(udm_alloc_agent_array)
1329 {
1330   switch(ZEND_NUM_ARGS()){
1331 
1332     case 1: {
1333         zval **yydbaddr;
1334         zval **tmp;
1335         char *dbaddr;
1336         UDM_ENV   * Env;
1337         UDM_AGENT * Agent;
1338         HashPosition   pos;
1339 
1340         if(zend_get_parameters_ex(1,&yydbaddr)==FAILURE){
1341           RETURN_FALSE;
1342         }
1343 
1344         if (Z_TYPE_PP(yydbaddr) != IS_ARRAY) {
1345               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument DBAddr must be an array.");
1346           RETURN_FALSE;
1347         }
1348         convert_to_array_ex(yydbaddr);
1349 
1350         Env= (UDM_ENV *) malloc(sizeof(UDM_ENV));
1351         UdmEnvInit(Env);
1352         UdmVarListReplaceStr(&Env->Vars,"SyslogFacility","local7");
1353         UdmEnvSetLogLevel(Env,0);
1354         UdmOpenLog("mnoGoSearch-php",Env,0);
1355 
1356         zend_hash_internal_pointer_reset_ex(HASH_OF(*yydbaddr), &pos);
1357 
1358         while (zend_hash_get_current_data_ex(HASH_OF(*yydbaddr), (void **)&tmp, &pos) == SUCCESS) {
1359             convert_to_string_ex(tmp);
1360             dbaddr = Z_STRVAL_PP(tmp);
1361             UdmEnvDBListAdd(Env, dbaddr);
1362 
1363             zend_hash_move_forward_ex(HASH_OF(*yydbaddr), &pos);
1364         }
1365 
1366         Agent= (UDM_AGENT *) malloc(sizeof(UDM_AGENT));
1367         UdmAgentInit(Agent, Env, 0);
1368         ZEND_REGISTER_RESOURCE(return_value,Agent,le_link);
1369       }
1370       break;
1371 
1372     default:
1373       WRONG_PARAM_COUNT;
1374       break;
1375   }
1376 }
1377 /* }}} */
1378 
1379 /* {{{ proto int udm_hash32(int agent, string str)
1380    Return Hash32 checksum of gived string */
PHP_FUNCTION(udm_hash32)1381 DLEXPORT PHP_FUNCTION(udm_hash32)
1382 {
1383   zval ** yystr, ** yyagent;
1384   char *str;
1385   udmhash32_t hash32;
1386   char buf[32];
1387   UDM_AGENT * Agent;
1388   int id=-1;
1389 
1390   switch(ZEND_NUM_ARGS()){
1391     case 2: {
1392         if (zend_get_parameters_ex(2, &yyagent,&yystr)==FAILURE) {
1393           RETURN_FALSE;
1394         }
1395       }
1396       break;
1397     default:
1398       WRONG_PARAM_COUNT;
1399       break;
1400   }
1401   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, id, "mnoGoSearch-Agent", le_link);
1402   convert_to_string_ex(yystr);
1403   str = Z_STRVAL_PP(yystr);
1404 
1405   hash32=UdmHash32((str),strlen(str));
1406   snprintf(buf,sizeof(buf)-1,"%i",hash32);
1407   RETURN_STRING(buf,1);
1408 }
1409 /* }}} */
1410 
1411 
1412 /* {{{ proto int udm_find(int agent, string query)
1413    Perform search */
PHP_FUNCTION(udm_find)1414 DLEXPORT PHP_FUNCTION(udm_find)
1415 {
1416   zval ** yyquery=NULL, ** yyagent;
1417   UDM_RESULT * Res= UdmMalloc(sizeof(UDM_RESULT));
1418   UDM_AGENT * Agent;
1419   int id=-1;
1420 
1421   switch(ZEND_NUM_ARGS()){
1422     case 1: {
1423         if (zend_get_parameters_ex(1, &yyagent)==FAILURE) {
1424           RETURN_FALSE;
1425         }
1426       }
1427       break;
1428     case 2: {
1429         if (zend_get_parameters_ex(2, &yyagent,&yyquery)==FAILURE) {
1430           RETURN_FALSE;
1431         }
1432         convert_to_string_ex(yyquery);
1433       }
1434       break;
1435     default:
1436       WRONG_PARAM_COUNT;
1437       break;
1438   }
1439   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, id, "mnoGoSearch-Agent", le_link);
1440 
1441   if ((yyquery) && (strlen(Z_STRVAL_PP(yyquery))))
1442       UdmVarListReplaceStr(&Agent->Conf->Vars, "q",
1443           Z_STRVAL_PP(yyquery));
1444   if (UDM_OK == UdmEnvPrepare(Agent->Conf) &&
1445       UDM_OK == UdmFind(Agent, Res))
1446   {
1447       ZEND_REGISTER_RESOURCE(return_value,Res,le_res);
1448   } else {
1449       RETURN_FALSE;
1450   }
1451 }
1452 /* }}} */
1453 
1454 /* {{{ proto string udm_get_res_field(int res, int row, int field)
1455    Fetch mnoGoSearch result field */
PHP_FUNCTION(udm_get_res_field)1456 DLEXPORT PHP_FUNCTION(udm_get_res_field)
1457 {
1458   zval **yyres, **yyrow_num, **yyfield_name;
1459 
1460   UDM_RESULT * Res;
1461   int row,field;
1462 
1463   switch(ZEND_NUM_ARGS()){
1464     case 3: {
1465         if (zend_get_parameters_ex(3, &yyres,&yyrow_num,&yyfield_name)==FAILURE){
1466           RETURN_FALSE;
1467         }
1468         convert_to_string_ex(yyrow_num);
1469         convert_to_string_ex(yyfield_name);
1470         field=atoi(Z_STRVAL_PP(yyfield_name));
1471         row=atoi(Z_STRVAL_PP(yyrow_num));
1472       }
1473       break;
1474     default:
1475       WRONG_PARAM_COUNT;
1476       break;
1477   }
1478   ZEND_FETCH_RESOURCE(Res, UDM_RESULT *, yyres, -1, "mnoGoSearch-Result", le_res);
1479   if (row < UdmResultNumRows(Res))
1480   {
1481     switch(field){
1482       case UDM_FIELD_URL:
1483           {
1484         char  *al;
1485         al = (char *)MyRemoveHiLightDup((const char *)(UdmVarListFindStr(&(Res->Doc[row].Sections), "URL", "")));
1486         UdmVarListReplaceStr(&Res->Doc[row].Sections,"URL",al);
1487         efree(al);
1488 
1489         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"URL",""),1);
1490           }
1491         break;
1492 
1493       case UDM_FIELD_CONTENT:
1494         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Content-Type",""),1);
1495         break;
1496 
1497       case UDM_FIELD_TITLE:
1498         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Title",""),1);
1499         break;
1500 
1501       case UDM_FIELD_KEYWORDS:
1502         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Meta.Keywords",""),1);
1503         break;
1504 
1505       case UDM_FIELD_DESC:
1506         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Meta.Description",""),1);
1507         break;
1508 
1509       case UDM_FIELD_TEXT:
1510         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Body",""),1);
1511         break;
1512 
1513       case UDM_FIELD_SIZE:
1514         RETURN_LONG(UdmVarListFindInt(&(Res->Doc[row].Sections),"Content-Length",0));
1515         break;
1516 
1517       case UDM_FIELD_URLID:
1518         RETURN_LONG(UdmVarListFindInt(&(Res->Doc[row].Sections),"ID",0));
1519         break;
1520 
1521       case UDM_FIELD_RATING:
1522         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Score",""),1);
1523         break;
1524 
1525       case UDM_FIELD_MODIFIED:
1526         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Last-Modified",""),1);
1527         break;
1528 
1529       case UDM_FIELD_ORDER:
1530         RETURN_LONG(UdmVarListFindInt(&(Res->Doc[row].Sections),"Order",0));
1531         break;
1532 
1533       case UDM_FIELD_CRC:
1534         RETURN_LONG(UdmVarListFindInt(&(Res->Doc[row].Sections),"crc32",0));
1535         break;
1536 
1537       case UDM_FIELD_LANG:
1538         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Content-Language",""),1);
1539         break;
1540 
1541       case UDM_FIELD_CHARSET:
1542         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Charset",""),1);
1543         break;
1544 
1545       case UDM_FIELD_SITEID:
1546         RETURN_LONG(UdmVarListFindInt(&(Res->Doc[row].Sections),"Site_id",0));
1547 
1548         break;
1549 
1550       case UDM_FIELD_POP_RANK:
1551         RETURN_STRING((char *)UdmVarListFindStr(&(Res->Doc[row].Sections),"Pop_Rank",""),1);
1552 
1553         break;
1554 
1555       case UDM_FIELD_ORIGINID:
1556         RETURN_LONG(UdmVarListFindInt(&(Res->Doc[row].Sections),"Origin-Id",0));
1557 
1558         break;
1559 
1560       default:
1561         php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown mnoGoSearch field name");
1562         RETURN_FALSE;
1563         break;
1564     }
1565   }else{
1566     php_error_docref(NULL TSRMLS_CC, E_WARNING,"row number too large");
1567     RETURN_FALSE;
1568   }
1569 }
1570 /* }}} */
1571 
1572 /* {{{ proto string udm_get_res_param(int res, int param)
1573    Get mnoGoSearch result parameters */
PHP_FUNCTION(udm_get_res_param)1574 DLEXPORT PHP_FUNCTION(udm_get_res_param)
1575 {
1576   zval ** yyres, ** yyparam;
1577   int param;
1578   UDM_RESULT * Res;
1579   switch(ZEND_NUM_ARGS()){
1580     case 2: {
1581         if (zend_get_parameters_ex(2, &yyres, &yyparam)==FAILURE) {
1582           RETURN_FALSE;
1583         }
1584         convert_to_long_ex(yyparam);
1585         param=(Z_LVAL_PP(yyparam));
1586       }
1587       break;
1588     default:
1589       WRONG_PARAM_COUNT;
1590       break;
1591   }
1592   ZEND_FETCH_RESOURCE(Res, UDM_RESULT *, yyres, -1, "mnoGoSearch-Result", le_res);
1593   switch(param){
1594     case UDM_PARAM_NUM_ROWS:
1595       RETURN_LONG(UdmResultNumRows(Res));
1596       break;
1597 
1598     case UDM_PARAM_FOUND:
1599       RETURN_LONG(UdmResultTotalFound(Res));
1600       break;
1601 
1602     case UDM_PARAM_WORDINFO:
1603       RETURN_STRING(UdmVarListFindStr(&Res->Vars, "WC", ""), 1);
1604       break;
1605 
1606     case UDM_PARAM_WORDINFO_ALL:
1607       RETURN_STRING(UdmVarListFindStr(&Res->Vars, "WE", ""), 1);
1608       break;
1609 
1610     case UDM_PARAM_SEARCHTIME:
1611       RETURN_STRING(UdmVarListFindStr(&Res->Vars, "SearchTime", ""), 1);
1612       break;
1613 
1614     case UDM_PARAM_FIRST_DOC:
1615       RETURN_LONG(UdmResultFirst(Res) + 1);
1616       break;
1617 
1618     case UDM_PARAM_LAST_DOC:
1619       RETURN_LONG(UdmResultLast(Res) + 1);
1620       break;
1621 
1622     default:
1623       php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unknown mnoGoSearch param name");
1624       RETURN_FALSE;
1625       break;
1626   }
1627 }
1628 /* }}} */
1629 
1630 /* {{{ proto int udm_free_res(int res)
1631    mnoGoSearch free result */
PHP_FUNCTION(udm_free_res)1632 DLEXPORT PHP_FUNCTION(udm_free_res)
1633 {
1634   zval ** yyres;
1635   UDM_RESULT * Res;
1636   switch(ZEND_NUM_ARGS()){
1637     case 1: {
1638         if (zend_get_parameters_ex(1, &yyres)==FAILURE) {
1639           RETURN_FALSE;
1640         }
1641       }
1642       break;
1643     default:
1644       WRONG_PARAM_COUNT;
1645       break;
1646   }
1647   ZEND_FETCH_RESOURCE(Res, UDM_RESULT *, yyres, -1, "mnoGoSearch-Result", le_res);
1648   zend_list_delete(Z_LVAL_PP(yyres));
1649 
1650   RETURN_TRUE;
1651 }
1652 /* }}} */
1653 
1654 /* {{{ proto int udm_free_agent(int agent)
1655    Free mnoGoSearch session */
PHP_FUNCTION(udm_free_agent)1656 DLEXPORT PHP_FUNCTION(udm_free_agent)
1657 {
1658   zval ** yyagent;
1659   UDM_RESULT * Agent;
1660   switch(ZEND_NUM_ARGS()){
1661     case 1: {
1662         if (zend_get_parameters_ex(1, &yyagent)==FAILURE) {
1663           RETURN_FALSE;
1664         }
1665       }
1666       break;
1667     default:
1668       WRONG_PARAM_COUNT;
1669       break;
1670   }
1671   ZEND_FETCH_RESOURCE(Agent, UDM_RESULT *, yyagent, -1, "mnoGoSearch-agent", le_link);
1672   zend_list_delete(Z_LVAL_PP(yyagent));
1673 
1674   RETURN_TRUE;
1675 }
1676 /* }}} */
1677 
1678 /* {{{ proto int udm_errno(int agent)
1679    Get mnoGoSearch error number */
PHP_FUNCTION(udm_errno)1680 DLEXPORT PHP_FUNCTION(udm_errno)
1681 {
1682   zval ** yyagent;
1683   UDM_AGENT * Agent;
1684   switch(ZEND_NUM_ARGS()){
1685     case 1: {
1686         if (zend_get_parameters_ex(1, &yyagent)==FAILURE) {
1687           RETURN_FALSE;
1688         }
1689       }
1690       break;
1691     default:
1692       WRONG_PARAM_COUNT;
1693       break;
1694   }
1695   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-Agent", le_link);
1696   if (UdmEnvErrMsg(Agent->Conf) && strlen(UdmEnvErrMsg(Agent->Conf))) {
1697       RETURN_LONG(1);
1698   } else {
1699       RETURN_LONG(0);
1700   }
1701 }
1702 /* }}} */
1703 
1704 /* {{{ proto string udm_error(int agent)
1705    Get mnoGoSearch error message */
PHP_FUNCTION(udm_error)1706 DLEXPORT PHP_FUNCTION(udm_error)
1707 {
1708   zval ** yyagent;
1709   UDM_AGENT * Agent;
1710 
1711   switch(ZEND_NUM_ARGS()){
1712     case 1: {
1713         if (zend_get_parameters_ex(1, &yyagent)==FAILURE) {
1714           RETURN_FALSE;
1715         }
1716       }
1717       break;
1718     default:
1719       WRONG_PARAM_COUNT;
1720       break;
1721   }
1722   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, -1, "mnoGoSearch-Agent", le_link);
1723   RETURN_STRING((UdmEnvErrMsg(Agent->Conf))?(UdmEnvErrMsg(Agent->Conf)):"",1);
1724 }
1725 /* }}} */
1726 
1727 /* {{{ proto int udm_api_version()
1728    Get mnoGoSearch API version */
PHP_FUNCTION(udm_api_version)1729 DLEXPORT PHP_FUNCTION(udm_api_version)
1730 {
1731   RETURN_LONG(UDM_VERSION_ID);
1732 }
1733 /* }}} */
1734 
1735 /* {{{ proto int udm_get_doc_count(int agent)
1736    Get total number of documents in database */
PHP_FUNCTION(udm_get_doc_count)1737 DLEXPORT PHP_FUNCTION(udm_get_doc_count)
1738 {
1739   zval ** yyagent;
1740   UDM_AGENT * Agent;
1741   int id=-1;
1742 
1743   switch(ZEND_NUM_ARGS())
1744   {
1745     case 1:
1746       if (zend_get_parameters_ex(1, &yyagent) == FAILURE)
1747         RETURN_FALSE;
1748       break;
1749     default:
1750       WRONG_PARAM_COUNT;
1751       break;
1752   }
1753   ZEND_FETCH_RESOURCE(Agent, UDM_AGENT *, yyagent, id, "mnoGoSearch-Agent", le_link);
1754   if (!Agent->doccount) UdmDBAction(Agent, UDM_DBCMD_DOCCOUNT);
1755   RETURN_LONG(Agent->doccount);
1756 }
1757 /* }}} */
1758 
1759 
1760 #endif /* HAVE_MNOGOSEARCH */
1761 
1762 /*
1763  * Local variables:
1764  * tab-width: 4
1765  * c-basic-offset: 4
1766  * End:
1767  * vim600: sw=4 ts=4 fdm=marker
1768  * vim<600: sw=4 ts=4
1769  */
1770