-
Notifications
You must be signed in to change notification settings - Fork 18
Added Support for Fetch Modes #4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 5 commits
51defbe
1e8cfd0
e8fbbca
67b0555
b76bdaa
e62cee5
231c4d3
8c0a6da
a7a068f
776ea00
a1a3ec8
857b842
bb8756c
88e10f4
67a42c4
ccbdb1d
3d02105
1757fc6
ee63b94
3f65ca5
c3c0038
5ce4427
3d6ed97
ae7b02f
4e8d9cd
fb712aa
1ba2da3
b4909fe
183d124
a0a943c
f074eb3
87b5644
154223c
648687a
5734493
2d4ffe8
5344a04
6690bb2
489528e
93c34b9
27cc38b
2b18dbd
6181548
00a2e2f
063af05
9b56c99
f34c794
3747d79
f536760
9dfbf6c
ba179cd
8d3fa70
c6952cb
dfc62df
a846686
f42bce1
508509d
081ec7b
55d9e6f
407aaef
0b4bda1
d22ff42
c164322
1999823
4723f0a
e27137d
bf819d0
61df729
9dd37c2
4619fdb
4710168
1c06767
515f1bc
39ef767
f743da4
063fb64
15e5bf8
15088ca
0cc94e9
6cf8f41
93a3eec
af2c125
9bcebd3
12bf846
631d11c
be355ca
b942f91
ef4d02f
e7c00c5
7e4169e
38b8b1d
1e3dcca
c1313b0
125767e
62e2032
82275dd
c840375
9a58c4e
02cc5f6
3a3e33e
5672662
4b3f91a
5316075
9c927b3
61da8a8
7fefbde
4e7c6e4
1a8fa32
c91989f
aa3a673
c3b2417
616b692
7714bb8
3b5f658
0f8a904
0973c0d
404a8f1
cd150a3
4bfffef
a14c7c1
a9010a1
7f3211c
cfd483d
cb9b672
3aca205
9023dd1
be03c0e
135d694
29c02a4
8c51320
655454f
cb3a6ee
a0d8981
54c8f7f
3474115
c3a7337
fc0cd9d
4c678f6
b403777
0e396c2
7d0985d
5c05fb6
6a21be5
1daf586
f93ecdd
75d4a16
78715f6
c2d097b
0b37242
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -40,7 +40,7 @@ extern "C" { | |
| using namespace clickhouse; | ||
| using namespace std; | ||
|
|
||
| zend_class_entry *SeasClick_ce; | ||
| zend_class_entry *SeasClick_ce, *SeasClickException_ce; | ||
| map<int, Client*> clientMap; | ||
|
|
||
| #ifdef COMPILE_DL_SEASCLICK | ||
|
|
@@ -64,9 +64,10 @@ ZEND_BEGIN_ARG_INFO_EX(SeasCilck_construct, 0, 0, 1) | |
| ZEND_ARG_INFO(0, connectParames) | ||
| ZEND_END_ARG_INFO() | ||
|
|
||
| ZEND_BEGIN_ARG_INFO_EX(SeasCilck_select, 0, 0, 2) | ||
| ZEND_BEGIN_ARG_INFO_EX(SeasCilck_select, 0, 0, 3) | ||
| ZEND_ARG_INFO(0, sql) | ||
| ZEND_ARG_INFO(0, params) | ||
| ZEND_ARG_INFO(0, fetch_mode) | ||
| ZEND_END_ARG_INFO() | ||
|
|
||
| ZEND_BEGIN_ARG_INFO_EX(SeasCilck_insert, 0, 0, 3) | ||
|
|
@@ -98,49 +99,38 @@ const zend_function_entry SeasClick_methods[] = | |
| PHP_FE_END | ||
| }; | ||
|
|
||
| #define REGISTER_SC_CLASS_CONST_LONG(const_name, value) \ | ||
| zend_declare_class_constant_long(SeasClick_ce, const_name, sizeof(const_name)-1, (zend_long)value); | ||
|
|
||
| /* {{{ PHP_MINIT_FUNCTION | ||
| */ | ||
| PHP_MINIT_FUNCTION(SeasClick) | ||
| { | ||
| zend_class_entry SeasClick; | ||
| zend_class_entry SeasClick, SeasClickException; | ||
| INIT_CLASS_ENTRY(SeasClick, SEASCLICK_RES_NAME, SeasClick_methods); | ||
| INIT_CLASS_ENTRY(SeasClickException, "SeasClickException", NULL); | ||
|
|
||
| #if PHP_VERSION_ID >= 70000 | ||
| SeasClick_ce = zend_register_internal_class_ex(&SeasClick, NULL); | ||
| SeasClickException_ce = zend_register_internal_class_ex(&SeasClickException, zend_ce_exception); | ||
| #else | ||
| SeasClick_ce = zend_register_internal_class_ex(&SeasClick, NULL, NULL TSRMLS_CC); | ||
| SeasClickException_ce = zend_register_internal_class_ex(&SeasClickException, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC); | ||
| #endif | ||
|
|
||
| zend_declare_property_stringl(SeasClick_ce, "host", strlen("host"), "127.0.0.1", sizeof("127.0.0.1") - 1, ZEND_ACC_PROTECTED TSRMLS_CC); | ||
| zend_declare_property_long(SeasClick_ce, "port", strlen("port"), 9000, ZEND_ACC_PROTECTED TSRMLS_CC); | ||
| zend_declare_property_stringl(SeasClick_ce, "database", strlen("database"), "default", sizeof("default") - 1, ZEND_ACC_PROTECTED TSRMLS_CC); | ||
| zend_declare_property_null(SeasClick_ce, "user", strlen("user"), ZEND_ACC_PROTECTED TSRMLS_CC); | ||
| zend_declare_property_null(SeasClick_ce, "passwd", strlen("passwd"), ZEND_ACC_PROTECTED TSRMLS_CC); | ||
| zend_declare_property_bool(SeasClick_ce, "compression", strlen("compression"), false, ZEND_ACC_PROTECTED TSRMLS_CC); | ||
|
|
||
| SeasClick_ce->ce_flags = ZEND_ACC_IMPLICIT_PUBLIC; | ||
| return SUCCESS; | ||
| } | ||
| /* }}} */ | ||
|
|
||
| /* {{{ PHP_MSHUTDOWN_FUNCTION | ||
| */ | ||
| PHP_MSHUTDOWN_FUNCTION(SeasClick) | ||
| { | ||
| return SUCCESS; | ||
| } | ||
| /* }}} */ | ||
| REGISTER_SC_CLASS_CONST_LONG("FETCH_ONE", (zend_long)SC_FETCH_ONE); | ||
| REGISTER_SC_CLASS_CONST_LONG("FETCH_KEY_PAIR", (zend_long)SC_FETCH_KEY_PAIR); | ||
| REGISTER_SC_CLASS_CONST_LONG("DATE_AS_STRINGS", (zend_long)SC_FETCH_DATE_AS_STRINGS); | ||
| REGISTER_SC_CLASS_CONST_LONG("FETCH_COLUMN", (zend_long)SC_FETCH_COLUMN); | ||
|
|
||
| /* {{{ PHP_RINIT_FUNCTION | ||
| */ | ||
| PHP_RINIT_FUNCTION(SeasClick) | ||
| { | ||
| return SUCCESS; | ||
| } | ||
| /* }}} */ | ||
|
|
||
| /* {{{ PHP_RSHUTDOWN_FUNCTION | ||
| */ | ||
| PHP_RSHUTDOWN_FUNCTION(SeasClick) | ||
| { | ||
| SeasClick_ce->ce_flags = ZEND_ACC_IMPLICIT_PUBLIC; | ||
| return SUCCESS; | ||
| } | ||
| /* }}} */ | ||
|
|
@@ -152,7 +142,7 @@ PHP_MINFO_FUNCTION(SeasClick) | |
| php_info_print_table_start(); | ||
| php_info_print_table_header(2, "SeasClick support", "enabled"); | ||
| php_info_print_table_row(2, "Version", PHP_SEASCLICK_VERSION); | ||
| php_info_print_table_row(2, "Author", "SeasX Group[email: ahhhh.wang@gmail.com]"); | ||
| php_info_print_table_row(2, "Author", "SeasX Group[email: ahhhh.wang@gmail.com], Ilia Alshanetsky"); | ||
| php_info_print_table_end(); | ||
|
|
||
| DISPLAY_INI_ENTRIES(); | ||
|
|
@@ -167,9 +157,9 @@ zend_module_entry SeasClick_module_entry = | |
| SEASCLICK_RES_NAME, | ||
| SeasClick_functions, | ||
| PHP_MINIT(SeasClick), | ||
| PHP_MSHUTDOWN(SeasClick), | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why remove shutdown callback?
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It doesn't do anything, so recommended approach is to not invlude PHP_MSHUT / PHP_MINIT unless they do something |
||
| PHP_RINIT(SeasClick), | ||
| PHP_RSHUTDOWN(SeasClick), | ||
| NULL, | ||
| NULL, | ||
| NULL, | ||
| PHP_MINFO(SeasClick), | ||
| PHP_SEASCLICK_VERSION, | ||
| STANDARD_MODULE_PROPERTIES | ||
|
|
@@ -264,7 +254,7 @@ PHP_METHOD(SEASCLICK_RES_NAME, __construct) | |
| } | ||
| catch (const std::exception& e) | ||
| { | ||
| sc_zend_throw_exception(NULL, e.what(), 0 TSRMLS_CC); | ||
| sc_zend_throw_exception(SeasClickException_ce, e.what(), 0 TSRMLS_CC); | ||
| } | ||
|
|
||
| RETURN_TRUE; | ||
|
|
@@ -301,26 +291,28 @@ void getInsertSql(string *sql, char *table_name, zval *columns) | |
| *sql = "INSERT INTO " + (string)table_name + " ( " + fields_section.str() + " ) VALUES"; | ||
| } | ||
|
|
||
| /* {{{ proto array select(string sql, array params) | ||
| /* {{{ proto array select(string sql, array params, int mode) | ||
| */ | ||
| PHP_METHOD(SEASCLICK_RES_NAME, select) | ||
| { | ||
| char *sql = NULL; | ||
| size_t l_sql = 0; | ||
| zval* params = NULL; | ||
| zend_long fetch_mode = 0; | ||
|
|
||
| #ifndef FAST_ZPP | ||
| if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &sql, &l_sql, ¶ms) == FAILURE) | ||
| if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zl", &sql, &l_sql, ¶ms, &fetch_mode) == FAILURE) | ||
| { | ||
| return; | ||
| } | ||
| #else | ||
| #undef IS_UNDEF | ||
| #define IS_UNDEF Z_EXPECTED_LONG | ||
| ZEND_PARSE_PARAMETERS_START(1, 2) | ||
| ZEND_PARSE_PARAMETERS_START(1, 3) | ||
| Z_PARAM_STRING(sql, l_sql) | ||
| Z_PARAM_OPTIONAL | ||
| Z_PARAM_ARRAY(params) | ||
| Z_PARAM_LONG(fetch_mode) | ||
| ZEND_PARSE_PARAMETERS_END(); | ||
| #undef IS_UNDEF | ||
| #define IS_UNDEF 0 | ||
|
|
@@ -352,29 +344,64 @@ PHP_METHOD(SEASCLICK_RES_NAME, select) | |
| int key = Z_OBJ_HANDLE(*getThis()); | ||
| Client *client = clientMap.at(key); | ||
|
|
||
| array_init(return_value); | ||
| if (!(fetch_mode & SC_FETCH_ONE)) { | ||
| array_init(return_value); | ||
| } | ||
|
|
||
| client->Select(sql_s, [return_value, fetch_mode](const Block &block) { | ||
| if (fetch_mode & SC_FETCH_ONE) { | ||
| if (block.GetRowCount() > 0 && block.GetColumnCount() > 0) { | ||
| convertToZval(return_value, block[0], 0, "", 0, fetch_mode); | ||
| } | ||
| return; | ||
| } | ||
|
|
||
| client->Select(sql_s, [return_value](const Block& block) | ||
| { | ||
| zval *return_tmp; | ||
| for (size_t row = 0; row < block.GetRowCount(); ++row) | ||
| { | ||
| if (fetch_mode & SC_FETCH_KEY_PAIR) { | ||
| if (block.GetColumnCount() < 2) { | ||
| throw std::runtime_error("Key pair mode requires at least 2 columns to be present"); | ||
| } | ||
| zval *col1, *col2; | ||
| SC_MAKE_STD_ZVAL(col1); | ||
| SC_MAKE_STD_ZVAL(col2); | ||
|
|
||
| convertToZval(col1, block[0], row, "", 0, fetch_mode|SC_FETCH_ONE); | ||
| convertToZval(col2, block[1], row, "", 0, fetch_mode|SC_FETCH_ONE); | ||
|
|
||
| if (Z_TYPE_P(col1) == IS_LONG) { | ||
| zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_P(col1), col2); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Compatibility This is the definition of PHP 5 version
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed |
||
| } else { | ||
| convert_to_string(col1); | ||
| zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR_P(col1), col2); | ||
| } | ||
| zval_ptr_dtor(col1); | ||
| continue; | ||
| } | ||
|
|
||
| SC_MAKE_STD_ZVAL(return_tmp); | ||
| array_init(return_tmp); | ||
| if (!(fetch_mode & SC_FETCH_COLUMN)) { | ||
| array_init(return_tmp); | ||
| } | ||
|
|
||
| for (size_t column = 0; column < block.GetColumnCount(); ++column) | ||
| { | ||
| string column_name = block.GetColumnName(column); | ||
| convertToZval(return_tmp, block[column], row, column_name, 0); | ||
| if (fetch_mode & SC_FETCH_COLUMN) { | ||
| convertToZval(return_tmp, block[0], row, "", 0, fetch_mode|SC_FETCH_ONE); | ||
| break; | ||
| } else { | ||
| convertToZval(return_tmp, block[column], row, column_name, 0, fetch_mode); | ||
| } | ||
| } | ||
| add_next_index_zval(return_value, return_tmp); | ||
| } | ||
| } | ||
| ); | ||
|
|
||
| }); | ||
| } | ||
| catch (const std::exception& e) | ||
| { | ||
| sc_zend_throw_exception(NULL, e.what(), 0 TSRMLS_CC); | ||
| sc_zend_throw_exception(SeasClickException_ce, e.what(), 0 TSRMLS_CC); | ||
| } | ||
| } | ||
| /* }}} */ | ||
|
|
@@ -476,7 +503,7 @@ PHP_METHOD(SEASCLICK_RES_NAME, insert) | |
| } | ||
| catch (const std::exception& e) | ||
| { | ||
| sc_zend_throw_exception(NULL, e.what(), 0 TSRMLS_CC); | ||
| sc_zend_throw_exception(SeasClickException_ce, e.what(), 0 TSRMLS_CC); | ||
| } | ||
| RETURN_TRUE; | ||
| } | ||
|
|
@@ -538,7 +565,7 @@ PHP_METHOD(SEASCLICK_RES_NAME, execute) | |
| } | ||
| catch (const std::exception& e) | ||
| { | ||
| sc_zend_throw_exception(NULL, e.what(), 0 TSRMLS_CC); | ||
| sc_zend_throw_exception(SeasClickException_ce, e.what(), 0 TSRMLS_CC); | ||
| } | ||
| RETURN_TRUE; | ||
| } | ||
|
|
@@ -558,7 +585,7 @@ PHP_METHOD(SEASCLICK_RES_NAME, __destruct) | |
| } | ||
| catch (const std::exception& e) | ||
| { | ||
| sc_zend_throw_exception(NULL, e.what(), 0 TSRMLS_CC); | ||
| sc_zend_throw_exception(SeasClickException_ce, e.what(), 0 TSRMLS_CC); | ||
| } | ||
| RETURN_TRUE; | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -66,7 +66,7 @@ array(2) { | |
| } | ||
| ["arraynull_c"]=> | ||
| array(1) { | ||
| ["array"]=> | ||
| [0]=> | ||
| string(6) "string" | ||
| } | ||
| } | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please do some compatibility tests, such as zend_long type does not support PHP 5 version
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed