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