summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank M. Kromann <fmk@php.net>2002-12-16 22:26:49 +0000
committerFrank M. Kromann <fmk@php.net>2002-12-16 22:26:49 +0000
commit5664a358fa92af8bc388920d679f80009ade6cd4 (patch)
treeb052891bcf6c3fedafd576762e17a1d4d9b8dc40
parent24975495a74cc4835c727fd814f4ae4f3732bd59 (diff)
downloadphp-git-5664a358fa92af8bc388920d679f80009ade6cd4.tar.gz
Allow the native MSSQL extension to be compiled with FreeTDS on *nix platforms.
This will make the whole MSSAL API available on these platforms. @Allow compilation of mssql extension on *nix.
-rw-r--r--ext/mssql/config.m427
-rw-r--r--ext/mssql/php_mssql.c28
-rw-r--r--ext/mssql/php_mssql.h43
3 files changed, 88 insertions, 10 deletions
diff --git a/ext/mssql/config.m4 b/ext/mssql/config.m4
new file mode 100644
index 0000000000..cdfc0cffd2
--- /dev/null
+++ b/ext/mssql/config.m4
@@ -0,0 +1,27 @@
+dnl
+dnl $Id$
+dnl
+
+PHP_ARG_WITH(mssql,for MSSQL support via FreeTDS,
+[ --with-mssql[=DIR] Include MSSQL-DB support. DIR is the FreeTDS home
+ directory, defaults to /usr/local/freetds.])
+
+
+if test "$PHP_MSSQL" != "no"; then
+ if test "$PHP_MSSQL" = "yes"; then
+ MSSQL_INCDIR=/usr/local/freetds/include
+ MSSQL_LIBDIR=/usr/local/freetds/lib
+ else
+ MSSQL_INCDIR=$PHP_MSSQL/include
+ MSSQL_LIBDIR=$PHP_MSSQL/lib
+ fi
+ PHP_ADD_INCLUDE($MSSQL_INCDIR)
+ PHP_ADD_LIBRARY_WITH_PATH(sybdb, $MSSQL_LIBDIR, MSSQL_SHARED_LIBADD)
+ PHP_NEW_EXTENSION(mssql, php_mssql.c, $ext_shared)
+ AC_CHECK_LIB(dnet_stub, dnet_addr,
+ [ PHP_ADD_LIBRARY_WITH_PATH(dnet_stub,,MSSQL_SHARED_LIBADD)
+ AC_DEFINE(HAVE_LIBDNET_STUB,1,[ ])
+ ])
+ AC_DEFINE(HAVE_MSSQL,1,[ ])
+ AC_DEFINE(HAVE_FREETDS,1,[ ])
+fi
diff --git a/ext/mssql/php_mssql.c b/ext/mssql/php_mssql.c
index a610e2d33f..20de48cd4c 100644
--- a/ext/mssql/php_mssql.c
+++ b/ext/mssql/php_mssql.c
@@ -442,24 +442,30 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
RETURN_FALSE;
}
- dbprocerrhandle(mssql.login, (DBERRHANDLE_PROC) php_mssql_error_handler);
- dbprocmsghandle(mssql.login, (DBMSGHANDLE_PROC) php_mssql_message_handler);
+ 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) == 1){
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)) {
@@ -492,7 +498,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
RETURN_FALSE;
}
- if (dbsetopt(mssql.link, DBBUFFER, "2")==FAIL) {
+ if (DBSETOPT(mssql.link, DBBUFFER, "2")==FAIL) {
efree(hashed_details);
dbfreelogin(mssql.login);
dbclose(mssql.link);
@@ -501,7 +507,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (MS_SQL_G(textlimit) != -1) {
sprintf(buffer, "%li", MS_SQL_G(textlimit));
- if (dbsetopt(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {
+ if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {
efree(hashed_details);
dbfreelogin(mssql.login);
RETURN_FALSE;
@@ -554,7 +560,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
#if BROKEN_MSSQL_PCONNECTS
log_error("PHP/MS SQL: Reconnect successful!",php_rqst->server);
#endif
- if (dbsetopt(mssql_ptr->link, DBBUFFER, "2")==FAIL) {
+ 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
@@ -605,7 +611,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
RETURN_FALSE;
}
- if (dbsetopt(mssql.link, DBBUFFER,"2")==FAIL) {
+ if (DBSETOPT(mssql.link, DBBUFFER,"2")==FAIL) {
efree(hashed_details);
dbfreelogin(mssql.login);
dbclose(mssql.link);
@@ -614,7 +620,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (MS_SQL_G(textlimit) != -1) {
sprintf(buffer, "%li", MS_SQL_G(textlimit));
- if (dbsetopt(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {
+ if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {
efree(hashed_details);
dbfreelogin(mssql.login);
RETURN_FALSE;
@@ -1108,7 +1114,11 @@ PHP_FUNCTION(mssql_query)
* 1) Being able to fire up another query without explicitly reading all rows
* 2) Having numrows accessible
*/
+#ifdef HAVE_FREETDS
+ if ((num_fields = dbnumcols(mssql_ptr->link)) <= 0) {
+#else
if ((num_fields = dbnumcols(mssql_ptr->link)) <= 0 && !dbdataready(mssql_ptr->link)) {
+#endif
RETURN_TRUE;
}
@@ -1172,8 +1182,10 @@ PHP_FUNCTION(mssql_free_result)
}
ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS SQL-result", le_result);
+#ifndef HAVE_FREETDS
if (dbdataready(result->mssql_ptr->link))
dbresults(result->mssql_ptr->link);
+#endif
zend_list_delete(Z_LVAL_PP(mssql_result_index));
RETURN_TRUE;
}
@@ -1996,7 +2008,7 @@ PHP_FUNCTION(mssql_bind)
/* 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, (LPCBYTE)value)==FAIL) {
+ 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;
}
diff --git a/ext/mssql/php_mssql.h b/ext/mssql/php_mssql.h
index 876f75db43..3437c798f8 100644
--- a/ext/mssql/php_mssql.h
+++ b/ext/mssql/php_mssql.h
@@ -24,6 +24,7 @@
#if HAVE_MSSQL
+#define MSDBLIB
#ifdef PHP_WIN32
#define PHP_MSSQL_API __declspec(dllexport)
#else
@@ -35,14 +36,52 @@
#include "sqlfront.h"
#include "sqldb.h"
+#if HAVE_FREETDS
+#define SQLTEXT SYBTEXT
+#define SQLCHAR SYBCHAR
+#define SQLVARCHAR SYBVARCHAR
+#define SQLINT1 SYBINT1
+#define SQLINT2 SYBINT2
+#define SQLINT4 SYBINT4
+#define SQLINTN SYBINTN
+#define SQLBIT SYBBIT
+#define SQLFLT4 SYBREAL
+#define SQLFLT8 SYBFLT8
+#define SQLFLTN SYBFLTN
+#define SQLDECIMAL SYBDECIMAL
+#define SQLNUMERIC SYBNUMERIC
+#define SQLDATETIME SYBDATETIME
+#define SQLDATETIM4 SYBDATETIME4
+#define SQLDATETIMN SYBDATETIMN
+#define SQLMONEY SYBMONEY
+#define SQLMONEY4 SYBMONEY4
+#define SQLMONEYN SYBMONEYN
+#define SQLIMAGE SYBIMAGE
+#define SQLBINARY SYBBINARY
+#define SQLVARBINARY SYBVARBINARY
+#define DBERRHANDLE(a, b) dberrhandle(b)
+#define DBMSGHANDLE(a, b) dbmsghandle(b)
+#define DBSETOPT(a, b, c) dbsetopt(a, b, c, -1)
+#define NO_MORE_RPC_RESULTS 3
+#define dbfreelogin dbloginfree
+#define dbrpcexec dbrpcsend
+typedef unsigned char *LPBYTE;
+#else
+#define DBERRHANDLE(a, b) dbprocerrhandle(a, b)
+#define DBMSGHANDLE(a, b) dbprocerrhandle(a, b)
+#define EHANDLEFUNC DBERRHANDLE_PROC
+#define MHANDLEFUNC DBMSGHANDLE_PROC
+#define DBSETOPT(a, b, c) dbsetopt(a, b, c)
+#endif
+
#define coltype(j) dbcoltype(mssql_ptr->link,j)
#define intcol(i) ((int) *(DBINT *) dbdata(mssql_ptr->link,i))
#define smallintcol(i) ((int) *(DBSMALLINT *) dbdata(mssql_ptr->link,i))
#define tinyintcol(i) ((int) *(DBTINYINT *) dbdata(mssql_ptr->link,i))
#define anyintcol(j) (coltype(j)==SQLINT4?intcol(j):(coltype(j)==SQLINT2?smallintcol(j):tinyintcol(j)))
#define charcol(i) ((DBCHAR *) dbdata(mssql_ptr->link,i))
-#define floatcol4(i) ((float) *(DBFLT4 *) dbdata(mssql_ptr->link,i))
-#define floatcol8(i) ((float) *(DBFLT8 *) dbdata(mssql_ptr->link,i))
+#define floatcol4(i) (*(DBFLT8 *) dbdata(mssql_ptr->link,i))
+#define floatcol8(i) (*(DBFLT8 *) dbdata(mssql_ptr->link,i))
#ifdef ZTS
#include "TSRM.h"