Dialect.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2006-2007 by Konstantin V. Arkhipov                     *
00003  *                                                                         *
00004  *   This program is free software; you can redistribute it and/or modify  *
00005  *   it under the terms of the GNU Lesser General Public License as        *
00006  *   published by the Free Software Foundation; either version 3 of the    *
00007  *   License, or (at your option) any later version.                       *
00008  *                                                                         *
00009  ***************************************************************************/
00010 /* $Id: Dialect.c 4687 2007-12-09 18:57:18Z voxus $ */
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     // don't know, how to replicate original voodoo
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         // unwrapped zend_call_method_with_1_params()
00277         // since sizeof(method) != strlen(method)
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 };

Generated on Sun Dec 9 21:56:23 2007 for onPHP by  doxygen 1.5.4