1 /*
2 +----------------------------------------------------------------------+
3 | Copyright (c) The PHP Group |
4 +----------------------------------------------------------------------+
5 | This source file is subject to version 3.01 of the PHP license, |
6 | that is bundled with this package in the file LICENSE, and is |
7 | available through the world-wide-web at the following url: |
8 | http://www.php.net/license/3_01.txt |
9 | If you did not receive a copy of the PHP license and are unable to |
10 | obtain it through the world-wide-web, please send a note to |
11 | license@php.net so we can mail you a copy immediately. |
12 +----------------------------------------------------------------------+
13 | Authors: |
14 | Israel Ekpo <iekpo@php.net> |
15 | Omar Shaban <omars@php.net> |
16 +----------------------------------------------------------------------+
17 */
18
19 #include "php_solr.h"
20
21 /* {{{ proto string SolrUtils::escapeQueryChars(string unescaped)
22 Escapes the lucene string */
PHP_METHOD(SolrUtils,escapeQueryChars)23 PHP_METHOD(SolrUtils, escapeQueryChars)
24 {
25 solr_char_t *unescaped = NULL;
26 solr_string_t sbuilder;
27 COMPAT_ARG_SIZE_T unescaped_length = 0;
28
29 if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &unescaped, &unescaped_length) == FAILURE) {
30
31 RETURN_FALSE;
32 }
33
34 if (!unescaped_length) {
35
36 RETURN_NULL();
37 }
38
39 memset(&sbuilder, 0, sizeof(solr_string_t));
40
41 solr_escape_query_chars(&sbuilder, unescaped, unescaped_length);
42
43 RETVAL_STRINGL(sbuilder.str, sbuilder.len);
44
45 solr_string_free(&sbuilder);
46 }
47 /* }}} */
48
49 /* {{{ proto string SolrUtils::queryPhrase(string unescaped)
50 Prepares a phrase from an unescaped lucene string. */
PHP_METHOD(SolrUtils,queryPhrase)51 PHP_METHOD(SolrUtils, queryPhrase)
52 {
53 solr_char_t *unescaped = NULL;
54 solr_string_t sbuilder;
55 COMPAT_ARG_SIZE_T unescaped_length = 0;
56
57 if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &unescaped, &unescaped_length) == FAILURE) {
58
59 RETURN_FALSE;
60 }
61
62 if (!unescaped_length) {
63
64 RETURN_NULL();
65 }
66
67 memset(&sbuilder, 0, sizeof(solr_string_t));
68
69 solr_string_appendc(&sbuilder, '"');
70 solr_escape_query_chars(&sbuilder, unescaped, unescaped_length);
71 solr_string_appendc(&sbuilder, '"');
72
73 RETVAL_STRINGL(sbuilder.str, sbuilder.len);
74
75 solr_string_free(&sbuilder);
76 }
77 /* }}} */
78
79 /* {{{ proto string SolrUtils::digestXMLResponse(string xml_response [, int parse_mode])
80 Digests the xml response into a php serialize string. */
PHP_METHOD(SolrUtils,digestXmlResponse)81 PHP_METHOD(SolrUtils, digestXmlResponse)
82 {
83 solr_char_t *xmlresponse = NULL;
84 COMPAT_ARG_SIZE_T xmlresponse_len = 0;
85 long int parse_mode = 0L;
86 solr_string_t sbuilder;
87 unsigned char *raw_resp = NULL, *str_end = NULL;
88 size_t raw_res_length = 0;
89 php_unserialize_data_t var_hash;
90 int successful = 1;
91
92 if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &xmlresponse, &xmlresponse_len, &parse_mode) == FAILURE) {
93 RETURN_FALSE;
94 }
95
96 if (!xmlresponse_len) {
97 php_error_docref(NULL, E_WARNING, "Raw response is empty");
98 RETURN_NULL();
99 }
100
101 parse_mode = ((parse_mode < 0L) ? 0L : ((parse_mode > 1L) ? 1L : parse_mode));
102
103 memset(&sbuilder, 0, sizeof(solr_string_t));
104
105 solr_encode_generic_xml_response(&sbuilder, xmlresponse, xmlresponse_len, parse_mode);
106
107 if (sbuilder.str == NULL || sbuilder.len == 0)
108 {
109 php_error_docref(NULL, E_WARNING, "Raw response was not valid");
110
111 RETURN_NULL();
112 }
113
114 memset(&var_hash, 0, sizeof(php_unserialize_data_t));
115
116 PHP_VAR_UNSERIALIZE_INIT(var_hash);
117
118 raw_resp = (unsigned char *) sbuilder.str;
119 raw_res_length = sbuilder.len;
120 str_end = (unsigned char *) (raw_resp + raw_res_length);
121
122 if (!php_var_unserialize(return_value, (const unsigned char **) &raw_resp, str_end, &var_hash))
123 {
124 solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1000_MSG);
125 php_error_docref(NULL, E_WARNING, "Error unserializing raw response.");
126 successful = 0;
127 }
128
129 PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
130 solr_string_free(&sbuilder);
131
132 if (successful)
133 {
134 /* Overriding the default object handlers */
135 Z_OBJ_HT_P(return_value) = &solr_object_handlers;
136 }
137 }
138 /* }}} */
139
140 /* {{{ proto string SolrUtils::digestJsonResponse(string jsonResponse)
141 Digests the json response into a php serialize string. */
PHP_METHOD(SolrUtils,digestJsonResponse)142 PHP_METHOD(SolrUtils, digestJsonResponse)
143 {
144 solr_char_t *jsonResponse = NULL;
145 COMPAT_ARG_SIZE_T jsonResponse_len = 0;
146 unsigned char *raw_resp = NULL, *str_end = NULL;
147
148 solr_string_t buffer;
149 php_unserialize_data_t var_hash;
150 COMPAT_ARG_SIZE_T raw_res_length;
151 int successful = 1;
152 int json_translation_result;
153 if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &jsonResponse, &jsonResponse_len) == FAILURE) {
154
155 RETURN_FALSE;
156 }
157
158
159 memset(&buffer, 0, sizeof(solr_string_t));
160
161 json_translation_result = solr_json_to_php_native(&buffer, jsonResponse, jsonResponse_len);
162
163 if (json_translation_result > 0)
164 {
165 solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, solr_get_json_error_msg(json_translation_result));
166
167 php_error_docref(NULL, E_WARNING, "Error in JSON->PHP conversion. JSON Error Code %d", json_translation_result);
168 }else{
169 solr_sarray_to_sobject(&buffer);
170 }
171
172
173 memset(&var_hash, 0, sizeof(php_unserialize_data_t));
174
175
176 PHP_VAR_UNSERIALIZE_INIT(var_hash);
177
178 raw_resp = (unsigned char *) buffer.str;
179 raw_res_length = buffer.len;
180 str_end = (unsigned char *) (raw_resp + raw_res_length);
181
182 if (!php_var_unserialize(return_value, (const unsigned char **)&raw_resp, str_end, &var_hash)) {
183 solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1000_MSG);
184
185 php_error_docref(NULL, E_WARNING, "Error unserializing raw response.");
186
187 successful = 0;
188 }
189 solr_string_free(&buffer);
190
191 PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
192
193 if (successful)
194 {
195 /* Overriding the default object handlers */
196 Z_OBJ_HT_P(return_value) = &solr_object_handlers;
197 }
198 }
199 /* }}} */
200
201 /* {{{ proto string SolrUtils::getSolrVersion(void)
202 Returns the current extension version */
PHP_METHOD(SolrUtils,getSolrVersion)203 PHP_METHOD(SolrUtils, getSolrVersion)
204 {
205 #ifdef SOLR_DEBUG
206 char * version;
207 asprintf(&version,"%s (DEBUG)", PHP_SOLR_DOTTED_VERSION);
208
209 ZVAL_STRING(return_value, version);
210 #else
211 RETURN_STRING(PHP_SOLR_DOTTED_VERSION);
212 #endif
213 }
214 /* }}} */
215
216 /* {{{ proto array SolrUtils::getSolrStats(void)
217 Returns the number of active documents, clients and SolrParam objects in the current thread. */
PHP_METHOD(SolrUtils,getSolrStats)218 PHP_METHOD(SolrUtils, getSolrStats)
219 {
220 int document_count = zend_hash_num_elements(SOLR_GLOBAL(documents));
221 int client_count = zend_hash_num_elements(SOLR_GLOBAL(clients));
222 int params_count = zend_hash_num_elements(SOLR_GLOBAL(params));
223
224 array_init(return_value);
225
226 add_assoc_long(return_value, "document_count", document_count);
227 add_assoc_long(return_value, "client_count", client_count);
228 add_assoc_long(return_value, "params_count", params_count);
229 }
230 /* }}} */
231
232 /* {{{ proto string solr_get_version(void)
233 Returns the current extension version */
PHP_FUNCTION(solr_get_version)234 PHP_FUNCTION(solr_get_version)
235 {
236 #ifdef SOLR_DEBUG
237 char * version;
238 asprintf(&version,"%s (DEBUG)", PHP_SOLR_DOTTED_VERSION);
239
240 ZVAL_STRING(return_value, version);
241 #else
242 RETURN_STRING(PHP_SOLR_DOTTED_VERSION);
243 #endif
244 }
245 /* }}} */
246
247 /*
248 * Local variables:
249 * tab-width: 4
250 * c-basic-offset: 4
251 * indent-tabs-mode: t
252 * End:
253 * vim600: fdm=marker
254 * vim: noet sw=4 ts=4
255 */
256