📄 mssql.c
字号:
sprintf(buffer, "%li", msSQL_GLOBAL(textlimit)); if (dbsetopt(mssql.link, DBTEXTLIMIT, buffer FREETDS_OPTION)==FAIL) { efree(hashed_details); dbfreelogin(mssql.login); RETURN_FALSE; } } if (msSQL_GLOBAL(textsize) != -1) { sprintf(buffer, "SET TEXTSIZE %li", msSQL_GLOBAL(textsize)); dbcmd(mssql.link, buffer); dbsqlexec(mssql.link); dbresults(mssql.link);// if (dbsetopt(mssql.link, DBTEXTSIZE, buffer)==FAIL) {// efree(hashed_details);// dbfreelogin(mssql.login);// RETURN_FALSE;// } } /* add it to the list */ mssql_ptr = (mssql_link *) emalloc(sizeof(mssql_link)); memcpy(mssql_ptr,&mssql,sizeof(mssql_link)); return_value->value.lval = php3_list_insert(mssql_ptr,msSQL_GLOBAL(le_link)); /* add it to the hash */ new_index_ptr.ptr = (void *) return_value->value.lval; new_index_ptr.type = le_index_ptr; if (_php3_hash_update(list,hashed_details,hashed_details_length+1,(void *) &new_index_ptr, sizeof(list_entry),NULL)==FAILURE) { efree(hashed_details); RETURN_FALSE; } msSQL_GLOBAL(num_links++); } efree(hashed_details); msSQL_GLOBAL(default_link)=return_value->value.lval;}static int php3_mssql_get_default_link(INTERNAL_FUNCTION_PARAMETERS){ msSQL_TLS_VARS; if (msSQL_GLOBAL(default_link)==-1) { /* no link opened yet, implicitly open one */ HashTable dummy; _php3_hash_init(&dummy,0,NULL,NULL,0); php3_mssql_do_connect(&dummy,return_value,list,plist,0); _php3_hash_destroy(&dummy); } return msSQL_GLOBAL(default_link);}/* {{{ proto int mssql_connect([string host [, string user [, string password]]]) Open MS-SQL server connection */void php3_mssql_connect(INTERNAL_FUNCTION_PARAMETERS){ php3_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);}/* }}} *//* {{{ proto int mssql_pconnect([string host [, string user [, string password]]]) Open permanent MS-SQL server connection */void php3_mssql_pconnect(INTERNAL_FUNCTION_PARAMETERS){ php3_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);}/* }}} *//* {{{ proto bool mssql_close([int link_id]) Close MS-SQL connection */void php3_mssql_close(INTERNAL_FUNCTION_PARAMETERS){ pval *mssql_link_index; int id,type; msSQL_TLS_VARS; switch (ARG_COUNT(ht)) { case 0: id = msSQL_GLOBAL(default_link); break; case 1: if (getParameters(ht, 1, &mssql_link_index)==FAILURE) { RETURN_FALSE; } convert_to_long(mssql_link_index); id = mssql_link_index->value.lval; break; default: WRONG_PARAM_COUNT; break; } php3_list_find(id,&type); if (type!=msSQL_GLOBAL(le_link) && type!=msSQL_GLOBAL(le_plink)) { php3_error(E_WARNING,"%d is not a MS SQL link index",id); RETURN_FALSE; } php3_list_delete(id); RETURN_TRUE;}/* }}} *//* {{{ proto bool mssql_select_db(string database [, int link_id]) Select MS-SQL database */void php3_mssql_select_db(INTERNAL_FUNCTION_PARAMETERS){ pval *db,*mssql_link_index; int id,type; mssql_link *mssql_ptr; msSQL_TLS_VARS; switch(ARG_COUNT(ht)) { case 1: if (getParameters(ht, 1, &db)==FAILURE) { RETURN_FALSE; } id = php3_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); break; case 2: if (getParameters(ht, 2, &db, &mssql_link_index)==FAILURE) { RETURN_FALSE; } convert_to_long(mssql_link_index); id = mssql_link_index->value.lval; break; default: WRONG_PARAM_COUNT; break; } CHECK_LINK(id); mssql_ptr = (mssql_link *) php3_list_find(id,&type); if (type!=msSQL_GLOBAL(le_link) && type!=msSQL_GLOBAL(le_plink)) { php3_error(E_WARNING,"%d is not a MS SQL link index",id); RETURN_FALSE; } convert_to_string(db); if (dbuse(mssql_ptr->link,db->value.str.val)==FAIL) { /*php3_error(E_WARNING,"MS SQL: Unable to select database: %s",mssql_error(mssql));*/ RETURN_FALSE; } else { RETURN_TRUE; }}/* }}} */static void php3_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,pval *result, int column_type){ if (dbdatlen(mssql_ptr->link,offset) == 0) { var_reset(result); return; } switch (column_type) { case SQLINT1: case SQLINT2: case SQLINT4: case SQLINTN: { result->value.lval = (long) anyintcol(offset); result->type = IS_LONG; break; } case SQLCHAR: case SQLVARCHAR: case SQLTEXT: { int length; char *data = charcol(offset); length=dbdatlen(mssql_ptr->link,offset); while (length>0 && charcol(offset)[length-1] == ' ') { /* nuke trailing whitespace */ length--; } result->value.str.val = estrndup(data,length); result->value.str.len = length; result->type = IS_STRING; break; } case SQLFLT8: { result->value.dval = (double) floatcol(offset); result->type = IS_DOUBLE; break; } case SQLNUMERIC: default: { if (dbwillconvert(coltype(offset),SQLCHAR)) { char *res_buf; int res_length = dbdatlen(mssql_ptr->link,offset); res_buf = (char *) emalloc(res_length+1); memset(res_buf, 0, res_length+1); dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length,SQLCHAR,res_buf,-1); result->value.str.len = res_length; result->value.str.val = res_buf; result->type = IS_STRING; } else { php3_error(E_WARNING,"MS SQL: column %d has unknown data type (%d)", offset, coltype(offset)); var_reset(result); } } }}static void php3_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,pval *result, int column_type){ if (dbdatlen(mssql_ptr->link,offset) == 0) { var_reset(result); return; } if (dbwillconvert(coltype(offset),SQLCHAR)) { unsigned char *res_buf; int res_length = dbdatlen(mssql_ptr->link,offset); res_buf = (unsigned char *) emalloc(res_length+1 + 19); memset(res_buf, 0, res_length+1 + 10); dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1); result->value.str.len = strlen(res_buf); result->value.str.val = res_buf; result->type = IS_STRING; } else { php3_error(E_WARNING,"MS SQL: column %d has unknown data type (%d)", offset, coltype(offset)); var_reset(result); }}/* {{{ proto int mssql_query(string query [, int link_id]) Send MS-SQL query */void php3_mssql_query(INTERNAL_FUNCTION_PARAMETERS){ pval *query,*mssql_link_index; int id,type,retvalue; mssql_link *mssql_ptr; mssql_result *result; int num_fields; int blocks_initialized=1; int i,j; int *column_types; msSQL_TLS_VARS; switch(ARG_COUNT(ht)) { case 1: if (getParameters(ht, 1, &query)==FAILURE) { RETURN_FALSE; } id = msSQL_GLOBAL(default_link); break; case 2: if (getParameters(ht, 2, &query, &mssql_link_index)==FAILURE) { RETURN_FALSE; } convert_to_long(mssql_link_index); id = mssql_link_index->value.lval; break; default: WRONG_PARAM_COUNT; break; } mssql_ptr = (mssql_link *) php3_list_find(id,&type); if (type!=msSQL_GLOBAL(le_link) && type!=msSQL_GLOBAL(le_plink)) { php3_error(E_WARNING,"%d is not a MS SQL link index",id); RETURN_FALSE; } convert_to_string(query); if (dbcmd(mssql_ptr->link,query->value.str.val)==FAIL) { php3_error(E_WARNING,"MS SQL: Unable to set query"); RETURN_FALSE; } if (dbsqlexec(mssql_ptr->link)==FAIL || dbresults(mssql_ptr->link)==FAIL) { php3_error(E_WARNING,"MS SQL: Query failed"); RETURN_FALSE; } /* The following is more or less the equivalent of mysql_store_result(). * fetch all rows from the server into the row buffer, thus: * 1) Being able to fire up another query without explicitly reading all rows * 2) Having numrows accessible */ retvalue=dbnextrow(mssql_ptr->link); if (retvalue==FAIL) { RETURN_FALSE; } num_fields = dbnumcols(mssql_ptr->link); if (num_fields<=0) { RETURN_TRUE; } column_types = (int *) emalloc(sizeof(int) * num_fields); for (i=0; i<num_fields; i++) { column_types[i] = coltype(i+1); } result = (mssql_result *) emalloc(sizeof(mssql_result)); result->data = (pval **) emalloc(sizeof(pval *)*MSSQL_ROWS_BLOCK); result->mssql_ptr = mssql_ptr; result->cur_field=result->cur_row=result->num_rows=0; result->num_fields = num_fields; i=0; while (retvalue!=FAIL && retvalue!=NO_MORE_ROWS) { result->num_rows++; if (result->num_rows > blocks_initialized*MSSQL_ROWS_BLOCK) { result->data = (pval **) erealloc(result->data,sizeof(pval *)*MSSQL_ROWS_BLOCK*(++blocks_initialized)); } result->data[i] = (pval *) emalloc(sizeof(pval)*num_fields); for (j=1; j<=num_fields; j++) { msSQL_GLOBAL(get_column_content(mssql_ptr, j, &result->data[i][j-1], column_types[j-1])); } retvalue=dbnextrow(mssql_ptr->link); dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)-1); i++; } result->num_rows = DBCOUNT(mssql_ptr->link); result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*num_fields); j=0; for (i=0; i<num_fields; i++) { char *fname = (char *)dbcolname(mssql_ptr->link,i+1); char computed_buf[16]; 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); result->fields[i].column_source = estrdup(dbcolsource(mssql_ptr->link,i+1)); if (!result->fields[i].column_source) { result->fields[i].column_source = empty_string; } result->fields[i].type = column_types[i]; /* set numeric flag */ switch (column_types[i]) { case SQLINT1: case SQLINT2: case SQLINT4: 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; } } efree(column_types); return_value->value.lval = php3_list_insert(result,msSQL_GLOBAL(le_result)); return_value->type = IS_LONG;}/* }}} */ /* {{{ proto bool mssql_free_result(int result) Free result memory */void php3_mssql_free_result(INTERNAL_FUNCTION_PARAMETERS){ pval *mssql_result_index; mssql_result *result; int type; msSQL_TLS_VARS; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &mssql_result_index)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(mssql_result_index); if (mssql_result_index->value.lval==0) { RETURN_FALSE; } result = (mssql_result *) php3_list_find(mssql_result_index->value.lval,&type); if (type!=msSQL_GLOBAL(le_result)) {// php3_error(E_WARNING,"%d is not a MS SQL result index",mssql_result_index->value.lval); RETURN_FALSE; } php3_list_delete(mssql_result_index->value.lval); RETURN_TRUE;}/* }}} *//* {{{ proto string mssql_get_last_message(void) Returns the last message from server (over min_message_severity?) */void php3_mssql_get_last_message(INTERNAL_FUNCTION_PARAMETERS){ msSQL_TLS_VARS; RETURN_STRING(msSQL_GLOBAL(server_message),1);}/* }}} *//* {{{ proto int mssql_num_rows(int result) Get number of rows in result */void php3_mssql_num_rows(INTERNAL_FUNCTION_PARAMETERS){ pval *result_index; int type,id; mssql_result *result; msSQL_TLS_VARS; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_index)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(result_index); id = result_index->value.lval; result = (mssql_result *) php3_list_find(id,&type); if (type!=msSQL_GLOBAL(le_result)) { php3_error(E_WARNING,"%d is not a MS SQL result index",id); RETURN_FALSE; } return_value->value.lval = result->num_rows; return_value->type = IS_LONG;}/* }}} *//* {{{ proto int mssql_num_fields(int result) Get number of fields in result */void php3_mssql_num_fields(INTERNAL_FUNCTION_PARAMETERS){ pval *result_index; int type,id; mssql_result *result; msSQL_TLS_VARS; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_index)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(result_index); id = result_index->value.lval; result = (mssql_result *) php3_list_find(id,&type); if (type!=msSQL_GLOBAL(le_result)) { php3_error(E_WARNING,"%d is not a MS SQL result index",id); RETURN_FALSE; } return_value->value.lval = result->num_fields; return_value->type = IS_LONG;}/* }}} *//* {{{ proto array mssql_fetch_row(int result) Get row as enumerated array */void php3_mssql_fetch_row(INTERNAL_FUNCTION_PARAMETERS){ pval *mssql_result_index; int type,i,id; mssql_result *result; pval field_content; msSQL_TLS_VARS; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &mssql_result_index)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(mssql_result_index); id = mssql_result_index->value.lval; result = (mssql_result *) php3_list_find(id,&type); if (type!=msSQL_GLOBAL(le_result)) { php3_error(E_WARNING,"%d is not a MS SQL result index",id); RETURN_FALSE; } if (result->cur_row >= result->num_rows) { RETURN_FALSE; } array_init(return_value); for (i=0; i<result->num_fields; i++) { field_content = result->data[result->cur_row][i]; pval_copy_constructor(&field_content); _php3_hash_index_update(return_value->value.ht, i, (void *) &field_content, sizeof(pval), NULL); } result->cur_row++;}/* }}} */static void php3_mssql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS){ pval *mssql_result_index; mssql_result *result; int type; int i; pval *pvalue_ptr,tmp; msSQL_TLS_VARS; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &mssql_result_index)==FAILURE) { WRONG_PARAM_COUNT; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -