bool PDOPgSqlStatement::create(const String& sql, const Array &options){ supports_placeholders = PDO_PLACEHOLDER_NAMED; bool scrollable = pdo_attr_lval( options, PDO_ATTR_CURSOR, PDO_CURSOR_FWDONLY ) == PDO_CURSOR_SCROLL; if(scrollable){ m_cursorName = ( boost::format("pdo_crsr_%08x") % ++m_cursorNameCounter ).str(); // Disable prepared statements supports_placeholders = PDO_PLACEHOLDER_NONE; } else if ( m_conn->m_emulate_prepare || (!options.empty() && pdo_attr_lval(options, PDO_ATTR_EMULATE_PREPARES, 0)) ) { supports_placeholders = PDO_PLACEHOLDER_NONE; } if( supports_placeholders != PDO_PLACEHOLDER_NONE && m_server->protocolVersion() > 2 ) { named_rewrite_template = "$%d"; String nsql; int ret = pdo_parse_params(sp_PDOStatement(this), sql, nsql); if(ret == 1){ // Query was rewritten } else if (ret == -1){ // Query didn't parse - exception should have been thrown at this point strncpy(m_conn->error_code, error_code, 6); m_conn->error_code[5] = '\0'; return false; } else { // Original is great nsql = sql; } m_stmtName = (boost::format("pdo_stmt_%08x") % ++m_stmtNameCounter).str(); m_resolvedQuery = (std::string)nsql; } return true; }
static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) { RETCODE rc; pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data; pdo_odbc_stmt *S = ecalloc(1, sizeof(*S)); enum pdo_cursor_type cursor_type = PDO_CURSOR_FWDONLY; int ret; char *nsql = NULL; size_t nsql_len = 0; S->H = H; S->assume_utf8 = H->assume_utf8; /* before we prepare, we need to peek at the query; if it uses named parameters, * we want PDO to rewrite them for us */ stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL; ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); if (ret == 1) { /* query was re-written */ sql = nsql; } else if (ret == -1) { /* couldn't grok it */ strcpy(dbh->error_code, stmt->error_code); efree(S); return 0; } rc = SQLAllocHandle(SQL_HANDLE_STMT, H->dbc, &S->stmt); if (rc == SQL_INVALID_HANDLE || rc == SQL_ERROR) { efree(S); if (nsql) { efree(nsql); } pdo_odbc_drv_error("SQLAllocStmt"); return 0; } cursor_type = pdo_attr_lval(driver_options, PDO_ATTR_CURSOR, PDO_CURSOR_FWDONLY); if (cursor_type != PDO_CURSOR_FWDONLY) { rc = SQLSetStmtAttr(S->stmt, SQL_ATTR_CURSOR_SCROLLABLE, (void*)SQL_SCROLLABLE, 0); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { pdo_odbc_stmt_error("SQLSetStmtAttr: SQL_ATTR_CURSOR_SCROLLABLE"); SQLFreeHandle(SQL_HANDLE_STMT, S->stmt); if (nsql) { efree(nsql); } return 0; } } rc = SQLPrepare(S->stmt, (char*)sql, SQL_NTS); if (nsql) { efree(nsql); } stmt->driver_data = S; stmt->methods = &odbc_stmt_methods; if (rc != SQL_SUCCESS) { pdo_odbc_stmt_error("SQLPrepare"); if (rc != SQL_SUCCESS_WITH_INFO) { /* clone error information into the db handle */ strcpy(H->einfo.last_err_msg, S->einfo.last_err_msg); H->einfo.file = S->einfo.file; H->einfo.line = S->einfo.line; H->einfo.what = S->einfo.what; strcpy(dbh->error_code, stmt->error_code); } } if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { return 0; } return 1; }
static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, zend_long sql_len, pdo_stmt_t *stmt, zval *driver_options) { pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data; pdo_pgsql_stmt *S = ecalloc(1, sizeof(pdo_pgsql_stmt)); int scrollable; int ret; char *nsql = NULL; int nsql_len = 0; int emulate = 0; int execute_only = 0; S->H = H; stmt->driver_data = S; stmt->methods = &pgsql_stmt_methods; scrollable = pdo_attr_lval(driver_options, PDO_ATTR_CURSOR, PDO_CURSOR_FWDONLY) == PDO_CURSOR_SCROLL; if (scrollable) { if (S->cursor_name) { efree(S->cursor_name); } spprintf(&S->cursor_name, 0, "pdo_crsr_%08x", ++H->stmt_counter); emulate = 1; } else if (driver_options) { if (pdo_attr_lval(driver_options, PDO_PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT, H->disable_native_prepares) == 1) { php_error_docref(NULL, E_DEPRECATED, "PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT is deprecated, use PDO::ATTR_EMULATE_PREPARES instead"); emulate = 1; } if (pdo_attr_lval(driver_options, PDO_ATTR_EMULATE_PREPARES, H->emulate_prepares) == 1) { emulate = 1; } if (pdo_attr_lval(driver_options, PDO_PGSQL_ATTR_DISABLE_PREPARES, H->disable_prepares) == 1) { execute_only = 1; } } else { emulate = H->disable_native_prepares || H->emulate_prepares; execute_only = H->disable_prepares; } if (!emulate && PQprotocolVersion(H->server) > 2) { stmt->supports_placeholders = PDO_PLACEHOLDER_NAMED; stmt->named_rewrite_template = "$%d"; ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); if (ret == 1) { /* query was re-written */ sql = nsql; } else if (ret == -1) { /* couldn't grok it */ strcpy(dbh->error_code, stmt->error_code); return 0; } if (!execute_only) { /* prepared query: set the query name and defer the actual prepare until the first execute call */ spprintf(&S->stmt_name, 0, "pdo_stmt_%08x", ++H->stmt_counter); } if (nsql) { S->query = nsql; } else { S->query = estrdup(sql); } return 1; } stmt->supports_placeholders = PDO_PLACEHOLDER_NONE; return 1; }
/* {{{ mysql_handle_preparer */ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; pdo_mysql_stmt *S = ecalloc(1, sizeof(pdo_mysql_stmt)); char *nsql = NULL; size_t nsql_len = 0; int ret; int server_version; PDO_DBG_ENTER("mysql_handle_preparer"); PDO_DBG_INF_FMT("dbh=%p", dbh); PDO_DBG_INF_FMT("sql=%.*s", (int)sql_len, sql); S->H = H; stmt->driver_data = S; stmt->methods = &mysql_stmt_methods; if (H->emulate_prepare) { goto end; } server_version = mysql_get_server_version(H->server); if (server_version < 40100) { goto fallback; } stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL; ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); if (ret == 1) { /* query was rewritten */ sql = nsql; sql_len = nsql_len; } else if (ret == -1) { /* failed to parse */ strcpy(dbh->error_code, stmt->error_code); PDO_DBG_RETURN(0); } if (!(S->stmt = mysql_stmt_init(H->server))) { pdo_mysql_error(dbh); if (nsql) { efree(nsql); } PDO_DBG_RETURN(0); } if (mysql_stmt_prepare(S->stmt, sql, sql_len)) { /* TODO: might need to pull statement specific info here? */ /* if the query isn't supported by the protocol, fallback to emulation */ if (mysql_errno(H->server) == 1295) { if (nsql) { efree(nsql); } goto fallback; } pdo_mysql_error(dbh); if (nsql) { efree(nsql); } PDO_DBG_RETURN(0); } if (nsql) { efree(nsql); } S->num_params = mysql_stmt_param_count(S->stmt); if (S->num_params) { S->params_given = 0; #if defined(PDO_USE_MYSQLND) S->params = NULL; #else S->params = ecalloc(S->num_params, sizeof(MYSQL_BIND)); S->in_null = ecalloc(S->num_params, sizeof(my_bool)); S->in_length = ecalloc(S->num_params, sizeof(zend_ulong)); #endif } dbh->alloc_own_columns = 1; S->max_length = pdo_attr_lval(driver_options, PDO_ATTR_MAX_COLUMN_LEN, 0); PDO_DBG_RETURN(1); fallback: end: stmt->supports_placeholders = PDO_PLACEHOLDER_NONE; PDO_DBG_RETURN(1); }