1/* 2 +----------------------------------------------------------------------+ 3 | PHP Version 5 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 1997-2013 The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.php.net/license/3_01.txt | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Author: Wez Furlong <wez@php.net> | 16 | Frank M. Kromann <frank@kromann.info> | 17 +----------------------------------------------------------------------+ 18*/ 19 20/* $Id$ */ 21 22#ifdef HAVE_CONFIG_H 23# include "config.h" 24#endif 25 26#include "php.h" 27#include "php_ini.h" 28#include "ext/standard/info.h" 29#include "pdo/php_pdo.h" 30#include "pdo/php_pdo_driver.h" 31#include "php_pdo_dblib.h" 32#include "php_pdo_dblib_int.h" 33#include "zend_exceptions.h" 34 35ZEND_DECLARE_MODULE_GLOBALS(dblib) 36static PHP_GINIT_FUNCTION(dblib); 37 38const zend_function_entry pdo_dblib_functions[] = { 39 PHP_FE_END 40}; 41 42#if ZEND_MODULE_API_NO >= 20050922 43static const zend_module_dep pdo_dblib_deps[] = { 44 ZEND_MOD_REQUIRED("pdo") 45 ZEND_MOD_END 46}; 47#endif 48 49#if PDO_DBLIB_IS_MSSQL 50zend_module_entry pdo_mssql_module_entry = { 51#else 52zend_module_entry pdo_dblib_module_entry = { 53#endif 54#if ZEND_MODULE_API_NO >= 20050922 55 STANDARD_MODULE_HEADER_EX, NULL, 56 pdo_dblib_deps, 57#else 58 STANDARD_MODULE_HEADER, 59#endif 60#if PDO_DBLIB_IS_MSSQL 61 "pdo_mssql", 62#elif defined(PHP_WIN32) 63 "pdo_sybase", 64#else 65 "pdo_dblib", 66#endif 67 pdo_dblib_functions, 68 PHP_MINIT(pdo_dblib), 69 PHP_MSHUTDOWN(pdo_dblib), 70 NULL, 71 PHP_RSHUTDOWN(pdo_dblib), 72 PHP_MINFO(pdo_dblib), 73 "1.0.1", 74 PHP_MODULE_GLOBALS(dblib), 75 PHP_GINIT(dblib), 76 NULL, 77 NULL, 78 STANDARD_MODULE_PROPERTIES_EX 79}; 80 81#if defined(COMPILE_DL_PDO_DBLIB) || defined(COMPILE_DL_PDO_MSSQL) 82#if PDO_DBLIB_IS_MSSQL 83ZEND_GET_MODULE(pdo_mssql) 84#else 85ZEND_GET_MODULE(pdo_dblib) 86#endif 87#endif 88 89int error_handler(DBPROCESS *dbproc, int severity, int dberr, 90 int oserr, char *dberrstr, char *oserrstr) 91{ 92 pdo_dblib_err *einfo; 93 char *state = "HY000"; 94 TSRMLS_FETCH(); 95 96 if(dbproc) { 97 einfo = (pdo_dblib_err*)dbgetuserdata(dbproc); 98 if (!einfo) einfo = &DBLIB_G(err); 99 } else { 100 einfo = &DBLIB_G(err); 101 } 102 103 einfo->severity = severity; 104 einfo->oserr = oserr; 105 einfo->dberr = dberr; 106 if (einfo->oserrstr) { 107 efree(einfo->oserrstr); 108 } 109 if (einfo->dberrstr) { 110 efree(einfo->dberrstr); 111 } 112 if (oserrstr) { 113 einfo->oserrstr = estrdup(oserrstr); 114 } else { 115 einfo->oserrstr = NULL; 116 } 117 if (dberrstr) { 118 einfo->dberrstr = estrdup(dberrstr); 119 } else { 120 einfo->dberrstr = NULL; 121 } 122 123 switch (dberr) { 124 case SYBESEOF: 125 case SYBEFCON: state = "01002"; break; 126 case SYBEMEM: state = "HY001"; break; 127 case SYBEPWD: state = "28000"; break; 128 } 129 strcpy(einfo->sqlstate, state); 130 131#if 0 132 php_error_docref(NULL TSRMLS_CC, E_WARNING, 133 "dblib error: %d %s (severity %d)", 134 dberr, dberrstr, severity); 135#endif 136 137 return INT_CANCEL; 138} 139 140int msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, 141 int severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line) 142{ 143 pdo_dblib_err *einfo; 144 TSRMLS_FETCH(); 145 146 if (severity) { 147 einfo = (pdo_dblib_err*)dbgetuserdata(dbproc); 148 if (!einfo) { 149 einfo = &DBLIB_G(err); 150 } 151 152 if (einfo->lastmsg) { 153 efree(einfo->lastmsg); 154 } 155 156 einfo->lastmsg = estrdup(msgtext); 157 } 158 159#if 0 160 php_error_docref(NULL TSRMLS_CC, E_WARNING, "dblib message: %s (severity %d)", msgtext, severity); 161#endif 162 163 return 0; 164} 165 166static PHP_GINIT_FUNCTION(dblib) 167{ 168 memset(dblib_globals, 0, sizeof(*dblib_globals)); 169 dblib_globals->err.sqlstate = dblib_globals->sqlstate; 170} 171 172PHP_RSHUTDOWN_FUNCTION(pdo_dblib) 173{ 174 if (DBLIB_G(err).oserrstr) { 175 efree(DBLIB_G(err).oserrstr); 176 DBLIB_G(err).oserrstr = NULL; 177 } 178 if (DBLIB_G(err).dberrstr) { 179 efree(DBLIB_G(err).dberrstr); 180 DBLIB_G(err).dberrstr = NULL; 181 } 182 if (DBLIB_G(err).lastmsg) { 183 efree(DBLIB_G(err).lastmsg); 184 DBLIB_G(err).lastmsg = NULL; 185 } 186 return SUCCESS; 187} 188 189PHP_MINIT_FUNCTION(pdo_dblib) 190{ 191 if (FAIL == dbinit()) { 192 return FAILURE; 193 } 194 195 if (FAILURE == php_pdo_register_driver(&pdo_dblib_driver)) { 196 return FAILURE; 197 } 198 199 /* TODO: 200 201 dbsetifile() 202 dbsetmaxprocs() 203 dbsetlogintime() 204 dbsettime() 205 206 */ 207 208#if !PHP_DBLIB_IS_MSSQL 209 dberrhandle(error_handler); 210 dbmsghandle(msg_handler); 211#endif 212 213 return SUCCESS; 214} 215 216PHP_MSHUTDOWN_FUNCTION(pdo_dblib) 217{ 218 php_pdo_unregister_driver(&pdo_dblib_driver); 219 dbexit(); 220 return SUCCESS; 221} 222 223PHP_MINFO_FUNCTION(pdo_dblib) 224{ 225 php_info_print_table_start(); 226 php_info_print_table_header(2, "PDO Driver for " 227#if PDO_DBLIB_IS_MSSQL 228 "MSSQL" 229#elif defined(PHP_WIN32) 230 "FreeTDS/Sybase/MSSQL" 231#else 232 "FreeTDS/Sybase" 233#endif 234 " DB-lib", "enabled"); 235 php_info_print_table_row(2, "Flavour", PDO_DBLIB_FLAVOUR); 236 php_info_print_table_end(); 237} 238 239