Annotation of embedaddon/php/ext/pdo_dblib/dblib_driver.c, revision 1.1

1.1     ! misho       1: /*
        !             2:   +----------------------------------------------------------------------+
        !             3:   | PHP Version 5                                                        |
        !             4:   +----------------------------------------------------------------------+
        !             5:   | Copyright (c) 1997-2012 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: dblib_driver.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            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: 
        !            35: static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info TSRMLS_DC)
        !            36: {
        !            37:        pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
        !            38:        pdo_dblib_err *einfo = &H->err;
        !            39:        pdo_dblib_stmt *S = NULL;
        !            40:        char *message;
        !            41:        char *msg;
        !            42: 
        !            43:        if (stmt) {
        !            44:                S = (pdo_dblib_stmt*)stmt->driver_data;
        !            45:                einfo = &S->err;
        !            46:        }
        !            47: 
        !            48:        if (einfo->dberr == SYBESMSG && einfo->lastmsg) {
        !            49:                msg = einfo->lastmsg;
        !            50:        } else if (einfo->dberr == SYBESMSG && DBLIB_G(err).lastmsg) {
        !            51:                msg = DBLIB_G(err).lastmsg;
        !            52:                DBLIB_G(err).lastmsg = NULL;
        !            53:        } else {
        !            54:                msg = einfo->dberrstr;
        !            55:        }
        !            56: 
        !            57:        spprintf(&message, 0, "%s [%d] (severity %d) [%s]",
        !            58:                msg, einfo->dberr, einfo->severity, stmt ? stmt->active_query_string : "");
        !            59: 
        !            60:        add_next_index_long(info, einfo->dberr);
        !            61:        add_next_index_string(info, message, 0);
        !            62:        add_next_index_long(info, einfo->oserr);
        !            63:        add_next_index_long(info, einfo->severity);
        !            64:        if (einfo->oserrstr) {
        !            65:                add_next_index_string(info, einfo->oserrstr, 1);
        !            66:        }
        !            67: 
        !            68:        return 1;
        !            69: }
        !            70: 
        !            71: 
        !            72: static int dblib_handle_closer(pdo_dbh_t *dbh TSRMLS_DC)
        !            73: {
        !            74:        pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
        !            75: 
        !            76:        if (H) {
        !            77:                if (H->link) {
        !            78:                        dbclose(H->link);
        !            79:                        H->link = NULL;
        !            80:                }
        !            81:                if (H->login) {
        !            82:                        dbfreelogin(H->login);
        !            83:                        H->login = NULL;
        !            84:                }
        !            85:                pefree(H, dbh->is_persistent);
        !            86:                dbh->driver_data = NULL;
        !            87:        }
        !            88:        return 0;
        !            89: }
        !            90: 
        !            91: static int dblib_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, pdo_stmt_t *stmt, zval *driver_options TSRMLS_DC)
        !            92: {
        !            93:        pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
        !            94:        pdo_dblib_stmt *S = ecalloc(1, sizeof(*S));
        !            95:        
        !            96:        S->H = H;
        !            97:        stmt->driver_data = S;
        !            98:        stmt->methods = &dblib_stmt_methods;
        !            99:        stmt->supports_placeholders = PDO_PLACEHOLDER_NONE;
        !           100:        S->err.sqlstate = stmt->error_code;
        !           101: 
        !           102:        return 1;
        !           103: }
        !           104: 
        !           105: static long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRMLS_DC)
        !           106: {
        !           107:        pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
        !           108:        RETCODE ret, resret;
        !           109: 
        !           110:        dbsetuserdata(H->link, (BYTE*)&H->err);
        !           111: 
        !           112:        if (FAIL == dbcmd(H->link, sql)) {
        !           113:                return -1;
        !           114:        }
        !           115: 
        !           116:        if (FAIL == dbsqlexec(H->link)) {
        !           117:                return -1;
        !           118:        }
        !           119:        
        !           120:        resret = dbresults(H->link);
        !           121: 
        !           122:        if (resret == FAIL) {
        !           123:                return -1;
        !           124:        }
        !           125: 
        !           126:        ret = dbnextrow(H->link);
        !           127:        if (ret == FAIL) {
        !           128:                return -1;
        !           129:        }
        !           130: 
        !           131:        if (dbnumcols(H->link) <= 0) {
        !           132:                return DBCOUNT(H->link);
        !           133:        }
        !           134: 
        !           135:        /* throw away any rows it might have returned */
        !           136:        dbcanquery(H->link);
        !           137: 
        !           138:        return DBCOUNT(H->link);
        !           139: }
        !           140: 
        !           141: static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquotedlen, char **quoted, int *quotedlen, enum pdo_param_type paramtype TSRMLS_DC)
        !           142: {
        !           143:        pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
        !           144:        char *q;
        !           145:        int l = 1;
        !           146: 
        !           147:        *quoted = q = safe_emalloc(2, unquotedlen, 3);
        !           148:        *q++ = '\'';
        !           149: 
        !           150:        while (unquotedlen--) {
        !           151:                if (*unquoted == '\'') {
        !           152:                        *q++ = '\'';
        !           153:                        *q++ = '\'';
        !           154:                        l += 2;
        !           155:                } else {
        !           156:                        *q++ = *unquoted;
        !           157:                        ++l;
        !           158:                }
        !           159:                unquoted++;
        !           160:        }
        !           161: 
        !           162:        *q++ = '\'';
        !           163:        *q++ = '\0';
        !           164:        *quotedlen = l+1;
        !           165:        
        !           166:        return 1;
        !           167: }
        !           168: 
        !           169: static struct pdo_dbh_methods dblib_methods = {
        !           170:        dblib_handle_closer,
        !           171:        dblib_handle_preparer,
        !           172:        dblib_handle_doer,
        !           173:        dblib_handle_quoter,
        !           174:        NULL,
        !           175:        NULL,
        !           176:        NULL,
        !           177:        NULL,
        !           178:        NULL, /* last insert */
        !           179:        dblib_fetch_error, /* fetch error */
        !           180:        NULL, /* get attr */
        !           181:        NULL, /* check liveness */
        !           182: };
        !           183: 
        !           184: static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC)
        !           185: {
        !           186:        pdo_dblib_db_handle *H;
        !           187:        int i, ret = 0;
        !           188:        struct pdo_data_src_parser vars[] = {
        !           189:                { "charset",    NULL,   0 },
        !           190:                { "appname",    "PHP " PDO_DBLIB_FLAVOUR,       0 },
        !           191:                { "host",               "127.0.0.1", 0 },
        !           192:                { "dbname",             NULL,   0 },
        !           193:                { "secure",             NULL,   0 }, /* DBSETLSECURE */
        !           194:                /* TODO: DBSETLVERSION ? */
        !           195:        };
        !           196: 
        !           197:        php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, 5);
        !           198: 
        !           199:        H = pecalloc(1, sizeof(*H), dbh->is_persistent);
        !           200:        H->login = dblogin();
        !           201:        H->err.sqlstate = dbh->error_code;
        !           202: 
        !           203:        if (!H->login) {
        !           204:                goto cleanup;
        !           205:        }
        !           206: 
        !           207:        if (dbh->username) {
        !           208:                DBSETLUSER(H->login, dbh->username);
        !           209:        }
        !           210:        if (dbh->password) {
        !           211:                DBSETLPWD(H->login, dbh->password);
        !           212:        }
        !           213:        
        !           214: #if !PHP_DBLIB_IS_MSSQL
        !           215:        if (vars[0].optval) {
        !           216:                DBSETLCHARSET(H->login, vars[0].optval);
        !           217:        }
        !           218: #endif
        !           219: 
        !           220:        DBSETLAPP(H->login, vars[1].optval);
        !           221: 
        !           222: #if PHP_DBLIB_IS_MSSQL
        !           223:        dbprocerrhandle(H->login, (EHANDLEFUNC) error_handler);
        !           224:        dbprocmsghandle(H->login, (MHANDLEFUNC) msg_handler);
        !           225: #endif
        !           226: 
        !           227:        H->link = dbopen(H->login, vars[2].optval);
        !           228: 
        !           229:        if (H->link == NULL) {
        !           230:                goto cleanup;
        !           231:        }
        !           232: 
        !           233:        /* dblib do not return more than this length from text/image */
        !           234:        DBSETOPT(H->link, DBTEXTLIMIT, "2147483647");
        !           235:        
        !           236:        /* limit text/image from network */
        !           237:        DBSETOPT(H->link, DBTEXTSIZE, "2147483647");
        !           238: 
        !           239:        if (vars[3].optval && FAIL == dbuse(H->link, vars[3].optval)) {
        !           240:                goto cleanup;
        !           241:        }
        !           242: 
        !           243:        ret = 1;
        !           244:        dbh->max_escaped_char_length = 2;
        !           245:        dbh->alloc_own_columns = 1;
        !           246: 
        !           247: cleanup:
        !           248:        for (i = 0; i < sizeof(vars)/sizeof(vars[0]); i++) {
        !           249:                if (vars[i].freeme) {
        !           250:                        efree(vars[i].optval);
        !           251:                }
        !           252:        }
        !           253: 
        !           254:        dbh->methods = &dblib_methods;
        !           255:        dbh->driver_data = H;
        !           256: 
        !           257:        if (!ret) {
        !           258:                zend_throw_exception_ex(php_pdo_get_exception(), DBLIB_G(err).dberr TSRMLS_CC,
        !           259:                        "SQLSTATE[%s] %s (severity %d)",
        !           260:                        DBLIB_G(err).sqlstate,
        !           261:                        DBLIB_G(err).dberrstr,
        !           262:                        DBLIB_G(err).severity);
        !           263:        }
        !           264: 
        !           265:        return ret;
        !           266: }
        !           267: 
        !           268: pdo_driver_t pdo_dblib_driver = {
        !           269: #if PDO_DBLIB_IS_MSSQL
        !           270:        PDO_DRIVER_HEADER(mssql),
        !           271: #elif defined(PHP_WIN32)
        !           272:        PDO_DRIVER_HEADER(sybase),
        !           273: #else
        !           274:        PDO_DRIVER_HEADER(dblib),
        !           275: #endif
        !           276:        pdo_dblib_handle_factory
        !           277: };
        !           278: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>