📄 php_mssql.c
字号:
} switch(Z_TYPE_PP(field)) { case IS_STRING: { int i; for (i=0; i<result->num_fields; i++) { if (!strcasecmp(result->fields[i].name, Z_STRVAL_PP(field))) { field_offset = i; break; } } if (i>=result->num_fields) { /* no match found */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s field not found in result", Z_STRVAL_PP(field)); RETURN_FALSE; } break; } default: convert_to_long_ex(field); field_offset = Z_LVAL_PP(field); if (field_offset<0 || field_offset>=result->num_fields) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified"); RETURN_FALSE; } break; } *return_value = result->data[Z_LVAL_PP(row)][field_offset]; zval_copy_ctor(return_value);}/* }}} *//* {{{ proto bool mssql_next_result(resource result_id) Move the internal result pointer to the next result */PHP_FUNCTION(mssql_next_result){ zval **mssql_result_index; int retvalue; mssql_result *result; mssql_link *mssql_ptr; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result); mssql_ptr = result->mssql_ptr; retvalue = dbresults(mssql_ptr->link); while (dbnumcols(mssql_ptr->link) <= 0 && retvalue == SUCCEED) { retvalue = dbresults(mssql_ptr->link); } if (retvalue == FAIL) { RETURN_FALSE; } else if (retvalue == NO_MORE_RESULTS || retvalue == NO_MORE_RPC_RESULTS) { if (result->statement) { _mssql_get_sp_result(mssql_ptr, result->statement TSRMLS_CC); } RETURN_FALSE; } else { _free_result(result, 1); result->cur_row=result->num_fields=result->num_rows=0; dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)); retvalue = dbnextrow(mssql_ptr->link); result->num_fields = dbnumcols(mssql_ptr->link); result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*result->num_fields); result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue TSRMLS_CC); RETURN_TRUE; }}/* }}} *//* {{{ proto void mssql_min_error_severity(int severity) Sets the lower error severity */PHP_FUNCTION(mssql_min_error_severity){ zval **severity; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &severity)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long_ex(severity); MS_SQL_G(min_error_severity) = Z_LVAL_PP(severity);}/* }}} *//* {{{ proto void mssql_min_message_severity(int severity) Sets the lower message severity */PHP_FUNCTION(mssql_min_message_severity){ zval **severity; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &severity)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long_ex(severity); MS_SQL_G(min_message_severity) = Z_LVAL_PP(severity);}/* }}} *//* {{{ proto int mssql_init(string sp_name [, resource conn_id]) Initializes a stored procedure or a remote stored procedure */PHP_FUNCTION(mssql_init){ zval **sp_name, **mssql_link_index; mssql_link *mssql_ptr; mssql_statement *statement; int id; switch(ZEND_NUM_ARGS()) { case 1: if (zend_get_parameters_ex(1, &sp_name)==FAILURE) { RETURN_FALSE; } id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); CHECK_LINK(id); break; case 2: if (zend_get_parameters_ex(2, &sp_name, &mssql_link_index)==FAILURE) { RETURN_FALSE; } id = -1; break; default: WRONG_PARAM_COUNT; break; } ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, mssql_link_index, id, "MS SQL-Link", le_link, le_plink); convert_to_string_ex(sp_name); if (dbrpcinit(mssql_ptr->link, Z_STRVAL_PP(sp_name),0)==FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to init stored procedure"); RETURN_FALSE; } statement=NULL; statement = ecalloc(1,sizeof(mssql_statement)); if (statement!=NULL) { statement->link = mssql_ptr; statement->executed=FALSE; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to allocate statement"); RETURN_FALSE; } statement->id = zend_list_insert(statement,le_statement); RETURN_RESOURCE(statement->id);}/* }}} *//* {{{ proto bool mssql_bind(resource stmt, string param_name, mixed var, int type [, int is_output[, int is_null[, int maxlen]]]) Adds a parameter to a stored procedure or a remote stored procedure */PHP_FUNCTION(mssql_bind){ int type, is_output, is_null, datalen, maxlen = -1; zval **stmt, **param_name, **var, **yytype; mssql_link *mssql_ptr; mssql_statement *statement; mssql_bind bind,*bindp; int status = 0; LPBYTE value = NULL; /* BEGIN input validation */ switch(ZEND_NUM_ARGS()) { case 4: if (zend_get_parameters_ex(4, &stmt, ¶m_name, &var, &yytype)==FAILURE) { RETURN_FALSE; } convert_to_long_ex(yytype); type=Z_LVAL_PP(yytype); is_null=FALSE; is_output=FALSE; break; case 5: { zval **yyis_output; if (zend_get_parameters_ex(5, &stmt, ¶m_name, &var, &yytype, &yyis_output)==FAILURE) { RETURN_FALSE; } convert_to_long_ex(yytype); convert_to_long_ex(yyis_output); type=Z_LVAL_PP(yytype); is_null=FALSE; is_output=Z_LVAL_PP(yyis_output); } break; case 6: { zval **yyis_output, **yyis_null; if (zend_get_parameters_ex(6, &stmt, ¶m_name, &var, &yytype, &yyis_output, &yyis_null)==FAILURE) { RETURN_FALSE; } convert_to_long_ex(yytype); convert_to_long_ex(yyis_output); convert_to_long_ex(yyis_null); type=Z_LVAL_PP(yytype); is_output=Z_LVAL_PP(yyis_output); is_null=Z_LVAL_PP(yyis_null); } break; case 7: { zval **yyis_output, **yyis_null, **yymaxlen; if (zend_get_parameters_ex(7, &stmt, ¶m_name, &var, &yytype, &yyis_output, &yyis_null, &yymaxlen)==FAILURE) { RETURN_FALSE; } convert_to_long_ex(yytype); convert_to_long_ex(yyis_output); convert_to_long_ex(yyis_null); convert_to_long_ex(yymaxlen); type=Z_LVAL_PP(yytype); is_output=Z_LVAL_PP(yyis_output); is_null=Z_LVAL_PP(yyis_null); if (is_output) { maxlen=Z_LVAL_PP(yymaxlen); } } break; default: WRONG_PARAM_COUNT; break; } /* END input validation */ ZEND_FETCH_RESOURCE(statement, mssql_statement *, stmt, -1, "MS SQL-Statement", le_statement); if (statement==NULL) { RETURN_FALSE; } mssql_ptr=statement->link; /* modify datalen and maxlen according to dbrpcparam documentation */ if ( (type==SQLVARCHAR) || (type==SQLCHAR) || (type==SQLTEXT) ) { /* variable-length type */ if (is_null) { maxlen=0; datalen=0; } else { convert_to_string_ex(var); datalen=Z_STRLEN_PP(var); value=(LPBYTE)Z_STRVAL_PP(var); } } else { /* fixed-length type */ if (is_null) { datalen=0; } else { datalen=-1; } maxlen=-1; switch (type) { case SQLFLT4: case SQLFLT8: case SQLFLTN: convert_to_double_ex(var); value=(LPBYTE)(&Z_DVAL_PP(var)); break; case SQLBIT: case SQLINT1: case SQLINT2: case SQLINT4: convert_to_long_ex(var); value=(LPBYTE)(&Z_LVAL_PP(var)); break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported type"); RETURN_FALSE; break; } } convert_to_string_ex(param_name); if (is_output) { status=DBRPCRETURN; } /* hashtable of binds */ if (! statement->binds) { ALLOC_HASHTABLE(statement->binds); zend_hash_init(statement->binds, 13, NULL, _mssql_bind_hash_dtor, 0); } if (zend_hash_exists(statement->binds, Z_STRVAL_PP(param_name), Z_STRLEN_PP(param_name))) { RETURN_FALSE; } else { memset((void*)&bind,0,sizeof(mssql_bind)); zend_hash_add(statement->binds, Z_STRVAL_PP(param_name), Z_STRLEN_PP(param_name), &bind, sizeof(mssql_bind), (void **)&bindp); if( NULL == bindp ) RETURN_FALSE; bindp->zval=*var; zval_add_ref(var); /* no call to dbrpcparam if RETVAL */ if ( strcmp("RETVAL",Z_STRVAL_PP(param_name))!=0 ) { if (dbrpcparam(mssql_ptr->link, Z_STRVAL_PP(param_name), (BYTE)status, type, maxlen, datalen, (LPBYTE)value)==FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set parameter"); RETURN_FALSE; } } } RETURN_TRUE;}/* }}} *//* {{{ proto mixed mssql_execute(resource stmt [, bool skip_results = false]) Executes a stored procedure on a MS-SQL server database */PHP_FUNCTION(mssql_execute){ zval **stmt, **skip; zend_bool skip_results = 0; int retvalue, retval_results; mssql_link *mssql_ptr; mssql_statement *statement; mssql_result *result; int num_fields; int batchsize; int ac = ZEND_NUM_ARGS(); batchsize = MS_SQL_G(batchsize); if (ac < 1 || ac > 2 || zend_get_parameters_ex(ac, &stmt, &skip)==FAILURE) { WRONG_PARAM_COUNT; } if (ac == 2) { skip_results = Z_BVAL_PP(skip); } ZEND_FETCH_RESOURCE(statement, mssql_statement *, stmt, -1, "MS SQL-Statement", le_statement); mssql_ptr=statement->link; if (dbrpcexec(mssql_ptr->link)==FAIL || dbsqlok(mssql_ptr->link)==FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "stored procedure execution failed"); dbcancel(mssql_ptr->link); RETURN_FALSE; } retval_results=dbresults(mssql_ptr->link); if (retval_results==FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not retrieve results"); dbcancel(mssql_ptr->link); RETURN_FALSE; } /* The following is just like mssql_query, fetch all rows from the first result * set into the row buffer. */ result=NULL; if (retval_results == SUCCEED) { if (skip_results) { do { dbcanquery(mssql_ptr->link); retval_results = dbresults(mssql_ptr->link); } while (retval_results == SUCCEED); } else { /* Skip results not returning any columns */ while ((num_fields = dbnumcols(mssql_ptr->link)) <= 0 && retval_results == SUCCEED) { retval_results = dbresults(mssql_ptr->link); } if ((num_fields = dbnumcols(mssql_ptr->link)) > 0) { retvalue = dbnextrow(mssql_ptr->link); result = (mssql_result *) emalloc(sizeof(mssql_result)); result->batchsize = batchsize; result->blocks_initialized = 1; result->data = (zval **) emalloc(sizeof(zval *)*MSSQL_ROWS_BLOCK); result->mssql_ptr = mssql_ptr; result->cur_field=result->cur_row=result->num_rows=0; result->num_fields = num_fields; result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*num_fields); result->statement = statement; result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue TSRMLS_CC); } } } if (retval_results == NO_MORE_RESULTS || retval_results == NO_MORE_RPC_RESULTS) { _mssql_get_sp_result(mssql_ptr, statement TSRMLS_CC); } if (result==NULL) { RETURN_TRUE; /* no recordset returned ...*/ } else { ZEND_REGISTER_RESOURCE(return_value, result, le_result); }}/* }}} *//* {{{ proto bool mssql_free_statement(resource result_index) Free a MS-SQL statement index */PHP_FUNCTION(mssql_free_statement){ zval **mssql_statement_index; mssql_statement *statement; int retvalue; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_statement_index)==FAILURE) { WRONG_PARAM_COUNT; } if (Z_TYPE_PP(mssql_statement_index)==IS_RESOURCE && Z_LVAL_PP(mssql_statement_index)==0) { RETURN_FALSE; } ZEND_FETCH_RESOURCE(statement, mssql_statement *, mssql_statement_index, -1, "MS SQL-statement", le_statement); /* Release remaining results */ do { dbcanquery(statement->link->link); retvalue = dbresults(statement->link->link); } while (retvalue == SUCCEED); zend_list_delete(Z_RESVAL_PP(mssql_statement_index)); RETURN_TRUE;}/* }}} *//* {{{ proto string mssql_guid_string(string binary [,int short_format]) Converts a 16 byte binary GUID to a string */PHP_FUNCTION(mssql_guid_string){ zval **binary, **short_format; int sf = 0; char buffer[32+1]; char buffer2[36+1]; switch(ZEND_NUM_ARGS()) { case 1: if (zend_get_parameters_ex(1, &binary)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -