00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "onphp.h"
00013 #include "onphp_core.h"
00014 #include "onphp_util.h"
00015
00016 #include "ext/standard/php_string.h"
00017 #include "zend_globals.h"
00018 #include "zend_exceptions.h"
00019 #include "zend_interfaces.h"
00020
00021 #include "core/DB/Dialect.h"
00022 #include "core/OSQL/DBValue.h"
00023 #include "core/OSQL/DialectString.h"
00024 #include "core/OSQL/Query.h"
00025 #include "core/Exceptions.h"
00026
00027 ONPHP_METHOD(Dialect, quoteValue)
00028 {
00029 zval *value;
00030
00031 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
00032 WRONG_PARAM_COUNT;
00033 }
00034
00035
00036 if (Z_TYPE_P(value) == IS_LONG) {
00037 RETURN_LONG(Z_LVAL_P(value));
00038 } else {
00039 smart_str string = {0};
00040 char *slashed;
00041 int length = 0;
00042
00043 if (Z_TYPE_P(value) == IS_STRING) {
00044 slashed = estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value));
00045 } else {
00046 zval *copy;
00047
00048 MAKE_STD_ZVAL(copy);
00049 ZVAL_ZVAL(copy, value, 1, 0);
00050
00051 convert_to_string(copy);
00052
00053 slashed = estrndup(Z_STRVAL_P(copy), Z_STRLEN_P(copy));
00054 }
00055
00056 length = strlen(slashed);
00057
00058 slashed =
00059 php_addslashes(
00060 slashed,
00061 length,
00062 &length,
00063 0 TSRMLS_CC
00064 );
00065
00066 smart_str_appends(&string, "'");
00067 smart_str_appends(&string, slashed);
00068 smart_str_appends(&string, "'");
00069 smart_str_0(&string);
00070
00071 efree(slashed);
00072
00073 RETURN_STRINGL(string.c, string.len, 0);
00074 }
00075 }
00076
00077 ONPHP_METHOD(Dialect, quoteField)
00078 {
00079 zval *field;
00080 smart_str string = {0};
00081
00082 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &field) == FAILURE) {
00083 WRONG_PARAM_COUNT;
00084 }
00085
00086 smart_str_appends(&string, "\"");
00087 onphp_append_zval_to_smart_string(&string, field);
00088 smart_str_appends(&string, "\"");
00089 smart_str_0(&string);
00090
00091 RETURN_STRINGL(string.c, string.len, 0);
00092 }
00093
00094 ONPHP_METHOD(Dialect, quoteTable)
00095 {
00096 zval *table;
00097 smart_str string = {0};
00098
00099 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &table) == FAILURE) {
00100 WRONG_PARAM_COUNT;
00101 }
00102
00103 smart_str_appends(&string, "\"");
00104 onphp_append_zval_to_smart_string(&string, table);
00105 smart_str_appends(&string, "\"");
00106 smart_str_0(&string);
00107
00108 RETURN_STRINGL(string.c, string.len, 0);
00109 }
00110
00111 ONPHP_METHOD(Dialect, toCasted)
00112 {
00113 zval *field, *type;
00114 smart_str string = {0};
00115
00116 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &field, &type) == FAILURE) {
00117 WRONG_PARAM_COUNT;
00118 }
00119
00120 smart_str_appends(&string, "CAST (");
00121 onphp_append_zval_to_smart_string(&string, field);
00122 smart_str_appends(&string, " AS ");
00123 onphp_append_zval_to_smart_string(&string, type);
00124 smart_str_appends(&string, ")");
00125 smart_str_0(&string);
00126
00127 RETURN_STRINGL(string.c, string.len, 0);
00128 }
00129
00130 ONPHP_METHOD(Dialect, timeZone)
00131 {
00132 unsigned char argc = ZEND_NUM_ARGS();
00133
00134 if (argc) {
00135 zend_bool exist = 0;
00136
00137 zend_parse_parameters(argc TSRMLS_CC, "b", &exist);
00138
00139 if (exist) {
00140 RETURN_STRING(" WITH TIME ZONE", 1);
00141 }
00142 }
00143
00144 RETURN_STRING(" WITHOUT TIME ZONE", 1);
00145 }
00146
00147 ONPHP_METHOD(Dialect, dropTableMode)
00148 {
00149 unsigned char argc = ZEND_NUM_ARGS();
00150
00151 if (argc) {
00152 zend_bool cascade = 0;
00153
00154 zend_parse_parameters(argc TSRMLS_CC, "b", &cascade);
00155
00156 if (cascade) {
00157 RETURN_STRING(" CASCADE", 1);
00158 }
00159 }
00160
00161 RETURN_STRING(" RESTRICT", 1);
00162 }
00163
00164 ONPHP_METHOD(Dialect, fieldToString)
00165 {
00166 zval *field, *out;
00167
00168 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &field) == FAILURE) {
00169 WRONG_PARAM_COUNT;
00170 }
00171
00172 if (
00173 Z_TYPE_P(field) == IS_OBJECT
00174 && instanceof_function(Z_OBJCE_P(field), onphp_ce_DialectString TSRMLS_CC)
00175 ) {
00176 zend_call_method_with_1_params(
00177 &field,
00178 Z_OBJCE_P(field),
00179 NULL,
00180 "todialectstring",
00181 &out,
00182 getThis()
00183 );
00184 } else {
00185 zend_call_method_with_1_params(
00186 &getThis(),
00187 Z_OBJCE_P(getThis()),
00188 NULL,
00189 "quotefield",
00190 &out,
00191 field
00192 );
00193 }
00194
00195 if (EG(exception)) {
00196 return;
00197 }
00198
00199 RETURN_ZVAL(out, 1, 1);
00200 }
00201
00202 ONPHP_METHOD(Dialect, valueToString)
00203 {
00204 zval *value, *out;
00205
00206 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
00207 WRONG_PARAM_COUNT;
00208 }
00209
00210 if (
00211 Z_TYPE_P(value) == IS_OBJECT
00212 && instanceof_function(Z_OBJCE_P(value), onphp_ce_DBValue TSRMLS_CC)
00213 ) {
00214 zend_call_method_with_1_params(
00215 &value,
00216 Z_OBJCE_P(value),
00217 NULL,
00218 "todialectstring",
00219 &out,
00220 getThis()
00221 );
00222 } else {
00223 zend_call_method_with_1_params(
00224 &getThis(),
00225 Z_OBJCE_P(getThis()),
00226 NULL,
00227 "quotevalue",
00228 &out,
00229 value
00230 );
00231 }
00232
00233 if (EG(exception)) {
00234 return;
00235 }
00236
00237 RETURN_ZVAL(out, 1, 1);
00238 }
00239
00240 smart_str onphp_dialect_to_needed_string(
00241 zval *this, zval *expression, char *method TSRMLS_DC
00242 )
00243 {
00244 smart_str string = {0};
00245 zval *out;
00246
00247 if (
00248 Z_TYPE_P(expression) == IS_OBJECT
00249 &&
00250 instanceof_function(
00251 Z_OBJCE_P(expression),
00252 onphp_ce_DialectString TSRMLS_CC
00253 )
00254 ) {
00255 zend_call_method_with_1_params(
00256 &expression,
00257 Z_OBJCE_P(expression),
00258 NULL,
00259 "todialectstring",
00260 &out,
00261 this
00262 );
00263
00264 if (EG(exception)) {
00265 return string;
00266 }
00267
00268 if (instanceof_function(Z_OBJCE_P(expression), onphp_ce_Query TSRMLS_CC)) {
00269 smart_str_appends(&string, "(");
00270 onphp_append_zval_to_smart_string(&string, out);
00271 smart_str_appends(&string, ")");
00272 } else {
00273 onphp_append_zval_to_smart_string(&string, out);
00274 }
00275 } else {
00276
00277
00278 zend_call_method(
00279 &this,
00280 Z_OBJCE_P(this),
00281 NULL,
00282 method,
00283 strlen(method),
00284 &out,
00285 1,
00286 expression,
00287 NULL TSRMLS_CC
00288 );
00289
00290 if (EG(exception)) {
00291 return string;
00292 }
00293
00294 onphp_append_zval_to_smart_string(&string, out);
00295 }
00296
00297 smart_str_0(&string);
00298 zval_dtor(out);
00299
00300 return string;
00301 }
00302
00303 ONPHP_METHOD(Dialect, toFieldString)
00304 {
00305 zval *expression;
00306
00307 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &expression) == FAILURE) {
00308 WRONG_PARAM_COUNT;
00309 }
00310
00311 if (Z_TYPE_P(expression) == IS_NULL) {
00312 RETURN_NULL();
00313 }
00314
00315 RETURN_STRING(
00316 onphp_dialect_to_needed_string(
00317 getThis(),
00318 expression,
00319 "quotefield" TSRMLS_CC
00320 ).c,
00321 0
00322 );
00323 }
00324
00325 ONPHP_METHOD(Dialect, toValueString)
00326 {
00327 zval *expression;
00328
00329 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &expression) == FAILURE) {
00330 WRONG_PARAM_COUNT;
00331 }
00332
00333 if (Z_TYPE_P(expression) == IS_NULL) {
00334 RETURN_NULL();
00335 }
00336
00337 RETURN_STRING(
00338 onphp_dialect_to_needed_string(
00339 getThis(),
00340 expression,
00341 "quotevalue" TSRMLS_CC
00342 ).c,
00343 0
00344 );
00345 }
00346
00347 ONPHP_METHOD(Dialect, fullTextSearch)
00348 {
00349 zend_throw_exception_ex(
00350 onphp_ce_UnimplementedFeatureException,
00351 0 TSRMLS_CC,
00352 "Implement me first"
00353 );
00354 }
00355
00356 ONPHP_METHOD(Dialect, fullTextRank)
00357 {
00358 zend_throw_exception_ex(
00359 onphp_ce_UnimplementedFeatureException,
00360 0 TSRMLS_CC,
00361 "Implement me first"
00362 );
00363 }
00364
00365 static ONPHP_ARGINFO_ONE;
00366 static ONPHP_ARGINFO_TWO;
00367 static ONPHP_ARGINFO_THREE;
00368 static ONPHP_ARGINFO_DBCOLUMN;
00369
00370 zend_function_entry onphp_funcs_Dialect[] = {
00371 ONPHP_ABSTRACT_ME(Dialect, preAutoincrement, arginfo_dbcolumn, ZEND_ACC_PUBLIC)
00372 ONPHP_ABSTRACT_ME(Dialect, postAutoincrement, arginfo_dbcolumn, ZEND_ACC_PUBLIC)
00373 ONPHP_ABSTRACT_ME(Dialect, hasTruncate, NULL, ZEND_ACC_PUBLIC)
00374 ONPHP_ABSTRACT_ME(Dialect, hasMultipleTruncate, NULL, ZEND_ACC_PUBLIC)
00375 ONPHP_ME(Dialect, quoteValue, arginfo_one, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
00376 ONPHP_ME(Dialect, quoteField, arginfo_one, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
00377 ONPHP_ME(Dialect, quoteTable, arginfo_one, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
00378 ONPHP_ME(Dialect, toCasted, arginfo_two, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
00379 ONPHP_ME(Dialect, timeZone, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
00380 ONPHP_ME(Dialect, dropTableMode, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
00381 ONPHP_ME(Dialect, toFieldString, arginfo_one, ZEND_ACC_PUBLIC)
00382 ONPHP_ME(Dialect, toValueString, arginfo_one, ZEND_ACC_PUBLIC)
00383 ONPHP_ME(Dialect, fieldToString, arginfo_one, ZEND_ACC_PUBLIC)
00384 ONPHP_ME(Dialect, valueToString, arginfo_one, ZEND_ACC_PUBLIC)
00385 ONPHP_ME(Dialect, fullTextSearch, arginfo_three, ZEND_ACC_PUBLIC)
00386 ONPHP_ME(Dialect, fullTextRank, arginfo_three, ZEND_ACC_PUBLIC)
00387 {NULL, NULL, NULL}
00388 };