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