Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
groonga.c
Go to the documentation of this file.
1 
2 #include "php_groonga.h"
3 
4 #if HAVE_GROONGA
5 
6 int le_grn_ctx;
7 void grn_ctx_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
8 {
9  grn_ctx *ctx = (grn_ctx *)(rsrc->ptr);
10  grn_ctx_close(ctx);
11 }
12 
13 zend_function_entry groonga_functions[] = {
14  PHP_FE(grn_ctx_init , grn_ctx_init_arg_info)
15  PHP_FE(grn_ctx_close , grn_ctx_close_arg_info)
16  PHP_FE(grn_ctx_connect , grn_ctx_connect_arg_info)
17  PHP_FE(grn_ctx_send , grn_ctx_send_arg_info)
18  PHP_FE(grn_ctx_recv , grn_ctx_recv_arg_info)
19  { NULL, NULL, NULL }
20 };
21 
22 
23 zend_module_entry groonga_module_entry = {
24  STANDARD_MODULE_HEADER,
25  "groonga",
26  groonga_functions,
27  PHP_MINIT(groonga),
28  PHP_MSHUTDOWN(groonga),
29  PHP_RINIT(groonga),
30  PHP_RSHUTDOWN(groonga),
31  PHP_MINFO(groonga),
32  "0.1",
33  STANDARD_MODULE_PROPERTIES
34 };
35 
36 #ifdef COMPILE_DL_GROONGA
37 ZEND_GET_MODULE(groonga)
38 #endif
39 
40 
41 PHP_MINIT_FUNCTION(groonga)
42 {
43  REGISTER_LONG_CONSTANT("GRN_CTX_USE_QL", GRN_CTX_USE_QL, CONST_PERSISTENT | CONST_CS);
44  REGISTER_LONG_CONSTANT("GRN_CTX_BATCH_MODE", GRN_CTX_BATCH_MODE, CONST_PERSISTENT | CONST_CS);
45  REGISTER_LONG_CONSTANT("GRN_ENC_DEFAULT", GRN_ENC_DEFAULT, CONST_PERSISTENT | CONST_CS);
46  REGISTER_LONG_CONSTANT("GRN_ENC_NONE", GRN_ENC_NONE, CONST_PERSISTENT | CONST_CS);
47  REGISTER_LONG_CONSTANT("GRN_ENC_EUC_JP", GRN_ENC_EUC_JP, CONST_PERSISTENT | CONST_CS);
48  REGISTER_LONG_CONSTANT("GRN_ENC_UTF8", GRN_ENC_UTF8, CONST_PERSISTENT | CONST_CS);
49  REGISTER_LONG_CONSTANT("GRN_ENC_SJIS", GRN_ENC_SJIS, CONST_PERSISTENT | CONST_CS);
50  REGISTER_LONG_CONSTANT("GRN_ENC_LATIN1", GRN_ENC_LATIN1, CONST_PERSISTENT | CONST_CS);
51  REGISTER_LONG_CONSTANT("GRN_ENC_KOI8R", GRN_ENC_KOI8R, CONST_PERSISTENT | CONST_CS);
52  REGISTER_LONG_CONSTANT("GRN_CTX_MORE", GRN_CTX_MORE, CONST_PERSISTENT | CONST_CS);
53  REGISTER_LONG_CONSTANT("GRN_CTX_TAIL", GRN_CTX_TAIL, CONST_PERSISTENT | CONST_CS);
54  REGISTER_LONG_CONSTANT("GRN_CTX_HEAD", GRN_CTX_HEAD, CONST_PERSISTENT | CONST_CS);
55  REGISTER_LONG_CONSTANT("GRN_CTX_QUIET", GRN_CTX_QUIET, CONST_PERSISTENT | CONST_CS);
56  REGISTER_LONG_CONSTANT("GRN_CTX_QUIT", GRN_CTX_QUIT, CONST_PERSISTENT | CONST_CS);
57  REGISTER_LONG_CONSTANT("GRN_CTX_FIN", GRN_CTX_FIN, CONST_PERSISTENT | CONST_CS);
58  le_grn_ctx = zend_register_list_destructors_ex(
59  grn_ctx_dtor, NULL, "grn_ctx", module_number);
60 
61  grn_init();
62 
63  return SUCCESS;
64 }
65 
66 
67 PHP_MSHUTDOWN_FUNCTION(groonga)
68 {
69  grn_fin();
70  return SUCCESS;
71 }
72 
73 
74 PHP_RINIT_FUNCTION(groonga)
75 {
76  return SUCCESS;
77 }
78 
79 
80 PHP_RSHUTDOWN_FUNCTION(groonga)
81 {
82  return SUCCESS;
83 }
84 
85 
86 PHP_MINFO_FUNCTION(groonga)
87 {
88  php_info_print_box_start(0);
89  php_printf("<p>Groonga</p>\n");
90  php_printf("<p>Version 0.2 (ctx)</p>\n");
91  php_printf("<p><b>Authors:</b></p>\n");
92  php_printf("<p>yu &lt;yu@irx.jp&gt; (lead)</p>\n");
93  php_info_print_box_end();
94 }
95 
96 
97 PHP_FUNCTION(grn_ctx_init)
98 {
99  grn_ctx *ctx = (grn_ctx *) malloc(sizeof(grn_ctx));
100  long res_id = -1;
101  long flags = 0;
102  grn_rc rc;
103 
104 
105  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) {
106  return;
107  }
108 
109  if ((rc = grn_ctx_init(ctx, flags)) != GRN_SUCCESS) {
110  RETURN_FALSE;
111  }
112 
113  res_id = ZEND_REGISTER_RESOURCE(return_value, ctx, le_grn_ctx);
114  RETURN_RESOURCE(res_id);
115 }
116 
117 
118 PHP_FUNCTION(grn_ctx_close)
119 {
120  zval *res = NULL;
121  int res_id = -1;
122 
123  grn_ctx *ctx;
124  grn_rc rc;
125 
126 
127  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &res) == FAILURE) {
128  return;
129  }
130 
131  ZEND_FETCH_RESOURCE(ctx, grn_ctx *, &res, res_id, "grn_ctx", le_grn_ctx);
132 
133  if ((rc = grn_ctx_close(ctx)) != GRN_SUCCESS) {
134  RETURN_FALSE;
135  }
136 
137  RETURN_TRUE;
138 }
139 
140 
141 PHP_FUNCTION(grn_ctx_connect)
142 {
143  zval *res = NULL;
144  int res_id = -1;
145 
146  grn_rc rc;
147  grn_ctx *ctx;
148  char *host = "localhost";
149  int host_len = 0;
150  long port = 10041;
151  long flags = 0;
152 
153 
154  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|ll", &res, &host, &host_len, &port, &flags) == FAILURE) {
155  return;
156  }
157 
158  ZEND_FETCH_RESOURCE(ctx, grn_ctx *, &res, res_id, "grn_ctx", le_grn_ctx);
159 
160  if ((rc = grn_ctx_connect(ctx, host, port, flags)) != GRN_SUCCESS) {
161  RETURN_FALSE;
162  }
163 
164  RETURN_TRUE;
165 }
166 
167 
168 PHP_FUNCTION(grn_ctx_send)
169 {
170  zval *res = NULL;
171  int res_id = -1;
172 
173  grn_ctx *ctx;
174  char *query = NULL;
175  unsigned int query_len, qid;
176  long flags = 0;
177 
178 
179  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|l", &res, &query, &query_len, &flags) == FAILURE) {
180  return;
181  }
182 
183  ZEND_FETCH_RESOURCE(ctx, grn_ctx *, &res, res_id, "grn_ctx", le_grn_ctx);
184  qid = grn_ctx_send(ctx, query, query_len, flags);
185  if (ctx->rc != GRN_SUCCESS) {
186  RETURN_FALSE;
187  }
188 
189  RETURN_LONG(qid)
190 
191 }
192 
193 
194 PHP_FUNCTION(grn_ctx_recv)
195 {
196  zval *res,*ret = NULL;
197  int res_id = -1;
198  grn_ctx *ctx;
199 
200  char *str;
201  int flags;
202  unsigned int str_len, qid;
203 
204  MAKE_STD_ZVAL(ret);
205 
206  array_init(ret);
207  array_init(return_value);
208 
209  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &res) == FAILURE) {
210  return;
211  }
212 
213  ZEND_FETCH_RESOURCE(ctx, grn_ctx *, &res, res_id, "grn_ctx", le_grn_ctx);
214 
215  qid = grn_ctx_recv(ctx, &str, &str_len, &flags);
216 
217  if (ctx->rc != GRN_SUCCESS) {
218  RETURN_FALSE;
219  }
220 
221  add_next_index_long(ret, flags);
222  add_next_index_stringl(ret, str, str_len, 1);
223 
224  add_index_zval(return_value, qid, ret);
225 }
226 
227 #endif /* HAVE_GROONGA */