1 /**
2 * Copyright 2016-2017 Couchbase, Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "couchbase.h"
18
19 zend_class_entry *n1ix_spec_ce;
20
21 /* {{{ proto void N1qlIndex::__construct() Should not be called directly */
PHP_METHOD(N1qlIndex,__construct)22 PHP_METHOD(N1qlIndex, __construct)
23 {
24 throw_pcbc_exception("Accessing private constructor.", LCB_EINVAL);
25 }
26 /* }}} */
27
28 ZEND_BEGIN_ARG_INFO_EX(ai_N1qlIndex_none, 0, 0, 0)
29 ZEND_END_ARG_INFO()
30
31 zend_function_entry n1ix_spec_methods[] = {
32 PHP_ME(N1qlIndex, __construct, ai_N1qlIndex_none, ZEND_ACC_PRIVATE | ZEND_ACC_FINAL | ZEND_ACC_CTOR) PHP_FE_END};
33
34 #define PROPERTIES(X) \
35 X("name", name) \
36 X("isPrimary", is_primary) \
37 X("type", type) \
38 X("state", state) \
39 X("keyspace", keyspace) \
40 X("namespace", namespace) \
41 X("fields", fields) \
42 X("condition", condition)
43
PHP_MINIT_FUNCTION(N1qlIndex)44 PHP_MINIT_FUNCTION(N1qlIndex)
45 {
46 zend_class_entry ce;
47
48 INIT_NS_CLASS_ENTRY(ce, "Couchbase", "N1qlIndex", n1ix_spec_methods);
49 n1ix_spec_ce = zend_register_internal_class(&ce TSRMLS_CC);
50
51 #define X(name, var) zend_declare_property_null(n1ix_spec_ce, name, strlen(name), ZEND_ACC_PUBLIC TSRMLS_CC);
52 PROPERTIES(X)
53 #undef X
54
55 zend_declare_class_constant_long(n1ix_spec_ce, ZEND_STRL("VIEW"), LCB_N1XSPEC_T_VIEW TSRMLS_CC);
56 zend_declare_class_constant_long(n1ix_spec_ce, ZEND_STRL("GSI"), LCB_N1XSPEC_T_GSI TSRMLS_CC);
57 zend_declare_class_constant_long(n1ix_spec_ce, ZEND_STRL("UNSPECIFIED"), LCB_N1XSPEC_T_DEFAULT TSRMLS_CC);
58
59 return SUCCESS;
60 }
61
pcbc_n1ix_init(zval * return_value,zval * json TSRMLS_DC)62 int pcbc_n1ix_init(zval *return_value, zval *json TSRMLS_DC)
63 {
64 zval *val;
65
66 object_init_ex(return_value, n1ix_spec_ce);
67
68 val = php_array_fetch(json, "name");
69 if (val) {
70 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("name"), val TSRMLS_CC);
71 }
72
73 val = php_array_fetch(json, "is_primary");
74 if (val) {
75 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("isPrimary"), val TSRMLS_CC);
76 }
77
78 {
79 PCBC_ZVAL type;
80 char *str;
81 int str_len = 0;
82 zend_bool owned = 0;
83
84 PCBC_ZVAL_ALLOC(type);
85 str = php_array_fetch_string(json, "using", &str_len, &owned);
86 if (str) {
87 if (strcmp(str, "view") == 0) {
88 ZVAL_LONG(PCBC_P(type), LCB_N1XSPEC_T_VIEW);
89 } else if (strcmp(str, "gsi") == 0) {
90 ZVAL_LONG(PCBC_P(type), LCB_N1XSPEC_T_GSI);
91 } else {
92 ZVAL_LONG(PCBC_P(type), LCB_N1XSPEC_T_DEFAULT);
93 }
94 if (owned) {
95 efree(str);
96 }
97 } else {
98 ZVAL_LONG(PCBC_P(type), LCB_N1XSPEC_T_DEFAULT);
99 }
100 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("type"), PCBC_P(type) TSRMLS_CC);
101 zval_ptr_dtor(&type);
102 }
103
104 val = php_array_fetch(json, "state");
105 if (val) {
106 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("state"), val TSRMLS_CC);
107 }
108 val = php_array_fetch(json, "keyspace_id");
109 if (val) {
110 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("keyspace"), val TSRMLS_CC);
111 }
112 val = php_array_fetch(json, "namespace_id");
113 if (val) {
114 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("namespace"), val TSRMLS_CC);
115 }
116 val = php_array_fetch(json, "index_key");
117 if (val) {
118 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("fields"), val TSRMLS_CC);
119 }
120 val = php_array_fetch(json, "condition");
121 if (val) {
122 zend_update_property(n1ix_spec_ce, return_value, ZEND_STRL("condition"), val TSRMLS_CC);
123 }
124
125 return SUCCESS;
126 }
127