📄 php_mssql.c
字号:
break; default: WRONG_PARAM_COUNT; break; } if (hashed_details == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory"); RETURN_FALSE; } /* set a DBLOGIN record */ if ((mssql.login = dblogin()) == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate login record"); RETURN_FALSE; } DBERRHANDLE(mssql.login, (EHANDLEFUNC) php_mssql_error_handler); DBMSGHANDLE(mssql.login, (MHANDLEFUNC) php_mssql_message_handler);#ifndef HAVE_FREETDS if (MS_SQL_G(secure_connection)){ DBSETLSECURE(mssql.login); } else {#endif if (user) { DBSETLUSER(mssql.login,user); } if (passwd) { DBSETLPWD(mssql.login,passwd); }#ifndef HAVE_FREETDS }#endif DBSETLAPP(mssql.login,MS_SQL_G(appname)); mssql.valid = 1;#ifndef HAVE_FREETDS DBSETLVERSION(mssql.login, DBVER60);#endif/* DBSETLTIME(mssql.login, TIMEOUT_INFINITE); */ if (!MS_SQL_G(allow_persistent)) { persistent=0; } if (persistent) { list_entry *le; /* try to find if we already have this link in our persistent list */ if (new_link || zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length + 1, (void **) &le)==FAILURE) { /* we don't */ list_entry new_le; if (MS_SQL_G(max_links) != -1 && MS_SQL_G(num_links) >= MS_SQL_G(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MS_SQL_G(num_links)); efree(hashed_details); dbfreelogin(mssql.login); RETURN_FALSE; } if (MS_SQL_G(max_persistent) != -1 && MS_SQL_G(num_persistent) >= MS_SQL_G(max_persistent)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)", MS_SQL_G(num_persistent)); efree(hashed_details); dbfreelogin(mssql.login); RETURN_FALSE; } /* create the link */ if ((mssql.link = dbopen(mssql.login, host)) == FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to connect to server: %s", host); efree(hashed_details); dbfreelogin(mssql.login); RETURN_FALSE; } if (DBSETOPT(mssql.link, DBBUFFER, "2")==FAIL) { efree(hashed_details); dbfreelogin(mssql.login); dbclose(mssql.link); RETURN_FALSE; }#ifndef HAVE_FREETDS if (MS_SQL_G(textlimit) != -1) { sprintf(buffer, "%li", MS_SQL_G(textlimit)); if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) { efree(hashed_details); dbfreelogin(mssql.login); dbclose(mssql.link); RETURN_FALSE; } }#endif if (MS_SQL_G(textsize) != -1) { sprintf(buffer, "SET TEXTSIZE %li", MS_SQL_G(textsize)); dbcmd(mssql.link, buffer); dbsqlexec(mssql.link); dbresults(mssql.link); } /* hash it up */ mssql_ptr = (mssql_link *) malloc(sizeof(mssql_link)); memcpy(mssql_ptr, &mssql, sizeof(mssql_link)); Z_TYPE(new_le) = le_plink; new_le.ptr = mssql_ptr; if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length + 1, &new_le, sizeof(list_entry), NULL)==FAILURE) { free(mssql_ptr); efree(hashed_details); dbfreelogin(mssql.login); dbclose(mssql.link); RETURN_FALSE; } MS_SQL_G(num_persistent)++; MS_SQL_G(num_links)++; } else { /* we do */ if (Z_TYPE_P(le) != le_plink) {#if BROKEN_MSSQL_PCONNECTS log_error("PHP/MS SQL: Hashed persistent link is not a MS SQL link!",php_rqst->server);#endif php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hashed persistent link is not a MS SQL link!"); efree(hashed_details); RETURN_FALSE; } mssql_ptr = (mssql_link *) le->ptr; /* test that the link hasn't died */ if (DBDEAD(mssql_ptr->link) == TRUE) { dbclose(mssql_ptr->link);#if BROKEN_MSSQL_PCONNECTS log_error("PHP/MS SQL: Persistent link died, trying to reconnect...",php_rqst->server);#endif if ((mssql_ptr->link=dbopen(mssql_ptr->login,host))==NULL) {#if BROKEN_MSSQL_PCONNECTS log_error("PHP/MS SQL: Unable to reconnect!",php_rqst->server);#endif php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect"); zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1); efree(hashed_details); dbfreelogin(mssql_ptr->login); RETURN_FALSE; }#if BROKEN_MSSQL_PCONNECTS log_error("PHP/MS SQL: Reconnect successful!",php_rqst->server);#endif if (DBSETOPT(mssql_ptr->link, DBBUFFER, "2")==FAIL) {#if BROKEN_MSSQL_PCONNECTS log_error("PHP/MS SQL: Unable to set required options",php_rqst->server);#endif zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length + 1); efree(hashed_details); dbfreelogin(mssql_ptr->login); dbclose(mssql_ptr->link); RETURN_FALSE; } } } ZEND_REGISTER_RESOURCE(return_value, mssql_ptr, le_plink); } else { /* non persistent */ list_entry *index_ptr, new_index_ptr; /* first we check the hash for the hashed_details key. if it exists, * it should point us to the right offset where the actual mssql link sits. * if it doesn't, open a new mssql link, add it to the resource list, * and add a pointer to it with hashed_details as the key. */ if (!new_link && zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length + 1,(void **) &index_ptr)==SUCCESS) { int type,link; void *ptr; if (Z_TYPE_P(index_ptr) != le_index_ptr) { efree(hashed_details); dbfreelogin(mssql.login); RETURN_FALSE; } link = (int) index_ptr->ptr; ptr = zend_list_find(link,&type); /* check if the link is still there */ if (ptr && (type==le_link || type==le_plink)) { zend_list_addref(link); Z_LVAL_P(return_value) = link; php_mssql_set_default_link(link TSRMLS_CC); Z_TYPE_P(return_value) = IS_RESOURCE; dbfreelogin(mssql.login); efree(hashed_details); return; } else { zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length + 1); } } if (MS_SQL_G(max_links) != -1 && MS_SQL_G(num_links) >= MS_SQL_G(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MS_SQL_G(num_links)); efree(hashed_details); dbfreelogin(mssql.login); RETURN_FALSE; } if ((mssql.link=dbopen(mssql.login, host))==NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to connect to server: %s", host); efree(hashed_details); dbfreelogin(mssql.login); RETURN_FALSE; } if (DBSETOPT(mssql.link, DBBUFFER,"2")==FAIL) { efree(hashed_details); dbfreelogin(mssql.login); dbclose(mssql.link); RETURN_FALSE; }#ifndef HAVE_FREETDS if (MS_SQL_G(textlimit) != -1) { sprintf(buffer, "%li", MS_SQL_G(textlimit)); if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) { efree(hashed_details); dbfreelogin(mssql.login); dbclose(mssql.link); RETURN_FALSE; } }#endif if (MS_SQL_G(textsize) != -1) { sprintf(buffer, "SET TEXTSIZE %li", MS_SQL_G(textsize)); dbcmd(mssql.link, buffer); dbsqlexec(mssql.link); dbresults(mssql.link); } /* add it to the list */ mssql_ptr = (mssql_link *) emalloc(sizeof(mssql_link)); memcpy(mssql_ptr, &mssql, sizeof(mssql_link)); ZEND_REGISTER_RESOURCE(return_value, mssql_ptr, le_link); /* add it to the hash */ new_index_ptr.ptr = (void *) Z_LVAL_P(return_value); Z_TYPE(new_index_ptr) = le_index_ptr; if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length + 1,(void *) &new_index_ptr, sizeof(list_entry),NULL)==FAILURE) { efree(hashed_details); RETURN_FALSE; } MS_SQL_G(num_links)++; } efree(hashed_details); php_mssql_set_default_link(Z_LVAL_P(return_value) TSRMLS_CC);}static int php_mssql_get_default_link(INTERNAL_FUNCTION_PARAMETERS){ if (MS_SQL_G(default_link)==-1) { /* no link opened yet, implicitly open one */ ht = 0; php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0); } return MS_SQL_G(default_link);}/* {{{ proto int mssql_connect([string servername [, string username [, string password [, bool new_link]]]]) Establishes a connection to a MS-SQL server */PHP_FUNCTION(mssql_connect){ php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);}/* }}} *//* {{{ proto int mssql_pconnect([string servername [, string username [, string password [, bool new_link]]]]) Establishes a persistent connection to a MS-SQL server */PHP_FUNCTION(mssql_pconnect){ php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);}/* }}} *//* {{{ proto bool mssql_close([resource conn_id]) Closes a connection to a MS-SQL server */PHP_FUNCTION(mssql_close){ zval **mssql_link_index=NULL; int id; mssql_link *mssql_ptr; switch (ZEND_NUM_ARGS()) { case 0: id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); CHECK_LINK(id); break; case 1: if (zend_get_parameters_ex(1, &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); if (mssql_link_index) zend_list_delete(Z_RESVAL_PP(mssql_link_index)); else zend_list_delete(id); RETURN_TRUE;}/* }}} *//* {{{ proto bool mssql_select_db(string database_name [, resource conn_id]) Select a MS-SQL database */PHP_FUNCTION(mssql_select_db){ zval **db, **mssql_link_index; int id; mssql_link *mssql_ptr; switch(ZEND_NUM_ARGS()) { case 1: if (zend_get_parameters_ex(1, &db)==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, &db, &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(db); if (dbuse(mssql_ptr->link, Z_STRVAL_PP(db))==FAIL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to select database: %s", Z_STRVAL_PP(db)); RETURN_FALSE; } else { RETURN_TRUE; }}/* }}} */static void php_mssql_get_column_content_with_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; } switch (column_type) { case SQLBIT: case SQLINT1: case SQLINT2: case SQLINT4: case SQLINTN: { Z_LVAL_P(result) = (long) anyintcol(offset); Z_TYPE_P(result) = IS_LONG; break; } case SQLCHAR: case SQLVARCHAR: case SQLTEXT: { int length; char *data = charcol(offset); length=dbdatlen(mssql_ptr->link,offset);#if ilia_0 while (length>0 && data[length-1] == ' ') { /* nuke trailing whitespace */ length--; }#endif Z_STRVAL_P(result) = estrndup(data,length); Z_STRLEN_P(result) = length; Z_TYPE_P(result) = IS_STRING; break; } case SQLFLT4: Z_DVAL_P(result) = (double) floatcol4(offset); Z_TYPE_P(result) = IS_DOUBLE; break; case SQLMONEY: case SQLMONEY4: case SQLMONEYN: { DBFLT8 res_buf; dbconvert(NULL, column_type, dbdata(mssql_ptr->link,offset), 8, SQLFLT8, (LPBYTE)&res_buf, -1); Z_DVAL_P(result) = res_buf; Z_TYPE_P(result) = IS_DOUBLE; } break; case SQLFLT8: Z_DVAL_P(result) = (double) floatcol8(offset); Z_TYPE_P(result) = IS_DOUBLE; break;#ifdef SQLUNIQUE case SQLUNIQUE: {#else case 36: { /* FreeTDS hack */#endif char *data = charcol(offset); /* uniqueidentifier is a 16-byte binary number */ ZVAL_STRINGL(result, data, 16, 1); } break; case SQLVARBINARY: case SQLBINARY: case 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; } break; case SQLNUMERIC: default: { if (dbwillconvert(column_type,SQLCHAR)) { 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -