📄 php_mssql.c
字号:
dbconvert(NULL, SQLDATETIM4, dbdata(mssql_ptr->link,offset), -1, SQLDATETIME, (LPBYTE) &temp, -1); dbdatecrack(mssql_ptr->link, &dateinfo, &temp); } else { dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset)); } res_length = 19; res_buf = (unsigned char *) emalloc(res_length+1); sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second); } Z_STRVAL_P(result) = res_buf; Z_STRLEN_P(result) = res_length; Z_TYPE_P(result) = IS_STRING; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "column %d has unknown data type (%d)", offset, coltype(offset)); ZVAL_FALSE(result); } } }}static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type TSRMLS_DC){ if (dbdatlen(mssql_ptr->link,offset) == 0) { ZVAL_NULL(result); return; } if (column_type == SQLVARBINARY || column_type == SQLBINARY || column_type == SQLIMAGE) { DBBINARY *bin; unsigned char *res_buf; int res_length = dbdatlen(mssql_ptr->link, offset); res_buf = (unsigned char *) emalloc(res_length+1); bin = ((DBBINARY *)dbdata(mssql_ptr->link, offset)); memcpy(res_buf, bin, res_length); res_buf[res_length] = '\0'; Z_STRLEN_P(result) = res_length; Z_STRVAL_P(result) = res_buf; Z_TYPE_P(result) = IS_STRING; } else if (dbwillconvert(coltype(offset),SQLCHAR)) { unsigned char *res_buf; DBDATEREC dateinfo; int res_length = dbdatlen(mssql_ptr->link,offset); if ((column_type != SQLDATETIME && column_type != SQLDATETIM4) || MS_SQL_G(datetimeconvert)) { switch (column_type) { case SQLDATETIME : case SQLDATETIM4 : res_length += 20; break; case SQLMONEY : case SQLMONEY4 : case SQLMONEYN : case SQLDECIMAL : case SQLNUMERIC : res_length += 5; case 127 : res_length += 20; break; } res_buf = (unsigned char *) emalloc(res_length+1); res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR, res_buf, -1); res_buf[res_length] = '\0'; } else { if (column_type == SQLDATETIM4) { DBDATETIME temp; dbconvert(NULL, SQLDATETIM4, dbdata(mssql_ptr->link,offset), -1, SQLDATETIME, (LPBYTE) &temp, -1); dbdatecrack(mssql_ptr->link, &dateinfo, &temp); } else { dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset)); } res_length = 19; res_buf = (unsigned char *) emalloc(res_length+1); sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second); } Z_STRVAL_P(result) = res_buf; Z_STRLEN_P(result) = res_length; Z_TYPE_P(result) = IS_STRING; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "column %d has unknown data type (%d)", offset, coltype(offset)); ZVAL_FALSE(result); }}static void _mssql_get_sp_result(mssql_link *mssql_ptr, mssql_statement *statement TSRMLS_DC) { int i, num_rets, type; char *parameter; mssql_bind *bind; /* Now to fetch RETVAL and OUTPUT values*/ num_rets = dbnumrets(mssql_ptr->link); if (num_rets!=0) { for (i = 1; i <= num_rets; i++) { parameter = (char*)dbretname(mssql_ptr->link, i); type = dbrettype(mssql_ptr->link, i); if (statement->binds != NULL) { /* Maybe a non-parameter sp */ if (zend_hash_find(statement->binds, parameter, strlen(parameter), (void**)&bind)==SUCCESS) { switch (type) { case SQLBIT: case SQLINT1: case SQLINT2: case SQLINT4: convert_to_long_ex(&bind->zval); /* FIXME this works only on little endian machine !!! */ Z_LVAL_P(bind->zval) = *((int *)(dbretdata(mssql_ptr->link,i))); break; case SQLFLT4: case SQLFLT8: case SQLFLTN: case SQLMONEY4: case SQLMONEY: case SQLMONEYN: convert_to_double_ex(&bind->zval); Z_DVAL_P(bind->zval) = *((double *)(dbretdata(mssql_ptr->link,i))); break; case SQLCHAR: case SQLVARCHAR: case SQLTEXT: convert_to_string_ex(&bind->zval); Z_STRLEN_P(bind->zval) = dbretlen(mssql_ptr->link,i); Z_STRVAL_P(bind->zval) = estrndup(dbretdata(mssql_ptr->link,i),Z_STRLEN_P(bind->zval)); break; /* TODO binary */ } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "An output parameter variable was not provided"); } } } } if (statement->binds != NULL) { /* Maybe a non-parameter sp */ if (zend_hash_find(statement->binds, "RETVAL", 6, (void**)&bind)==SUCCESS) { if (dbhasretstat(mssql_ptr->link)) { convert_to_long_ex(&bind->zval); Z_LVAL_P(bind->zval)=dbretstatus(mssql_ptr->link); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "stored procedure has no return value. Nothing was returned into RETVAL"); } } }}static int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int retvalue TSRMLS_DC) { int i, j = 0; int *column_types; char computed_buf[16]; column_types = (int *) emalloc(sizeof(int) * result->num_fields); for (i=0; i<result->num_fields; i++) { char *source = NULL; char *fname = (char *)dbcolname(mssql_ptr->link,i+1); if (*fname) { result->fields[i].name = estrdup(fname); } else { if (j>0) { snprintf(computed_buf,16,"computed%d",j); } else { strcpy(computed_buf,"computed"); } result->fields[i].name = estrdup(computed_buf); j++; } result->fields[i].max_length = dbcollen(mssql_ptr->link,i+1); source = (char *)dbcolsource(mssql_ptr->link,i+1); if (source) { result->fields[i].column_source = estrdup(source); } else { result->fields[i].column_source = empty_string; } column_types[i] = coltype(i+1); Z_TYPE(result->fields[i]) = column_types[i]; /* set numeric flag */ switch (column_types[i]) { case SQLINT1: case SQLINT2: case SQLINT4: case SQLINTN: case SQLFLT4: case SQLFLT8: case SQLNUMERIC: case SQLDECIMAL: result->fields[i].numeric = 1; break; case SQLCHAR: case SQLVARCHAR: case SQLTEXT: default: result->fields[i].numeric = 0; break; } } i=0; if (!result->data) { result->data = (zval **) emalloc(sizeof(zval *)*MSSQL_ROWS_BLOCK*(++result->blocks_initialized)); } while (retvalue!=FAIL && retvalue!=NO_MORE_ROWS) { result->num_rows++; if (result->num_rows > result->blocks_initialized*MSSQL_ROWS_BLOCK) { result->data = (zval **) erealloc(result->data,sizeof(zval *)*MSSQL_ROWS_BLOCK*(++result->blocks_initialized)); } result->data[i] = (zval *) emalloc(sizeof(zval)*result->num_fields); for (j=0; j<result->num_fields; j++) { INIT_ZVAL(result->data[i][j]); MS_SQL_G(get_column_content(mssql_ptr, j+1, &result->data[i][j], column_types[j] TSRMLS_CC)); } if (i<result->batchsize || result->batchsize==0) { i++; dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)); retvalue=dbnextrow(mssql_ptr->link); } else break; result->lastresult = retvalue; } efree(column_types); if (result->statement && (retvalue == NO_MORE_RESULTS || retvalue == NO_MORE_RPC_RESULTS)) { _mssql_get_sp_result(mssql_ptr, result->statement TSRMLS_CC); } return i;}/* {{{ proto int mssql_fetch_batch(resource result_index) Returns the next batch of records */PHP_FUNCTION(mssql_fetch_batch){ zval **mssql_result_index; mssql_result *result; mssql_link *mssql_ptr; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) { WRONG_PARAM_COUNT; } if (Z_TYPE_PP(mssql_result_index)==IS_RESOURCE && Z_LVAL_PP(mssql_result_index)==0) { RETURN_FALSE; } ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result); mssql_ptr = result->mssql_ptr; _free_result(result, 0); result->cur_row=result->num_rows=0; result->num_rows = _mssql_fetch_batch(mssql_ptr, result, result->lastresult TSRMLS_CC); RETURN_LONG(result->num_rows);}/* }}} *//* {{{ proto resource mssql_query(string query [, resource conn_id [, int batch_size]]) Perform an SQL query on a MS-SQL server database */PHP_FUNCTION(mssql_query){ zval **query, **mssql_link_index, **zbatchsize; int retvalue; mssql_link *mssql_ptr; mssql_result *result; int id, num_fields; int batchsize; batchsize = MS_SQL_G(batchsize); switch(ZEND_NUM_ARGS()) { case 1: if (zend_get_parameters_ex(1, &query)==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, &query, &mssql_link_index)==FAILURE) { RETURN_FALSE; } id = -1; break; case 3: if (zend_get_parameters_ex(3, &query, &mssql_link_index, &zbatchsize)==FAILURE) { RETURN_FALSE; } id = -1; convert_to_long_ex(zbatchsize); batchsize = Z_LVAL_PP(zbatchsize); 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(query); if (dbcmd(mssql_ptr->link, Z_STRVAL_PP(query))==FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set query"); RETURN_FALSE; } if (dbsqlexec(mssql_ptr->link)==FAIL || (retvalue = dbresults(mssql_ptr->link))==FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Query failed"); dbcancel(mssql_ptr->link); RETURN_FALSE; } /* Skip results not returning any columns */ while ((num_fields = dbnumcols(mssql_ptr->link)) <= 0 && retvalue == SUCCEED) { retvalue = dbresults(mssql_ptr->link); } if (num_fields <= 0) { RETURN_TRUE; } retvalue=dbnextrow(mssql_ptr->link); if (retvalue==FAIL) { dbcancel(mssql_ptr->link); RETURN_FALSE; } result = (mssql_result *) emalloc(sizeof(mssql_result)); result->statement = NULL; result->num_fields = num_fields; result->blocks_initialized = 1; result->batchsize = batchsize; result->data = NULL; result->blocks_initialized = 0; result->mssql_ptr = mssql_ptr; result->cur_field=result->cur_row=result->num_rows=0; result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*result->num_fields); result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue TSRMLS_CC); ZEND_REGISTER_RESOURCE(return_value, result, le_result);}/* }}} *//* {{{ proto int mssql_rows_affected(resource conn_id) Returns the number of records affected by the query */PHP_FUNCTION(mssql_rows_affected){ zval **mssql_link_index; mssql_link *mssql_ptr; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_link_index)==FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, mssql_link_index, -1, "MS SQL-Link", le_link, le_plink); RETURN_LONG(DBCOUNT(mssql_ptr->link));}/* }}} *//* {{{ proto bool mssql_free_result(resource result_index) Free a MS-SQL result index */PHP_FUNCTION(mssql_free_result){ zval **mssql_result_index; mssql_result *result; int retvalue; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) { WRONG_PARAM_COUNT; } if (Z_TYPE_PP(mssql_result_index)==IS_RESOURCE && Z_LVAL_PP(mssql_result_index)==0) { RETURN_FALSE; } ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result); /* Release remaining results */ do { dbcanquery(result->mssql_ptr->link); retvalue = dbresults(result->mssql_ptr->link); } while (retvalue == SUCCEED); zend_list_delete(Z_RESVAL_PP(mssql_result_index)); RETURN_TRUE;}/* }}} *//* {{{ proto string mssql_get_last_message(void) Gets the last message from the MS-SQL server */PHP_FUNCTION(mssql_get_last_message){ if (MS_SQL_G(server_message)) { RETURN_STRING(MS_SQL_G(server_message),1); } else { RETURN_STRING(empty_string,1); }}/* }}} *//* {{{ proto int mssql_num_rows(resource mssql_result_index) Returns the number of rows fetched in from the result id specified */PHP_FUNCTION(mssql_num_rows){ zval **mssql_result_index; mssql_result *result; 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); Z_LVAL_P(return_value) = result->num_rows; Z_TYPE_P(return_value) = IS_LONG;}/* }}} *//* {{{ proto int mssql_num_fields(resource mssql_result_index) Returns the number of fields fetched in from the result id specified */PHP_FUNCTION(mssql_num_fields){ zval **mssql_result_index; mssql_result *result; 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); Z_LVAL_P(return_value) = result->num_fields; Z_TYPE_P(return_value) = IS_LONG;}/* }}} */static void php_mssql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type, int expected_args){ zval **mssql_result_index, **resulttype = NULL; mssql_result *result;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -