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