diff options
Diffstat (limited to 'ext/pdo_pgsql/pgsql_driver.c')
-rw-r--r-- | ext/pdo_pgsql/pgsql_driver.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c index c5071e13fa..f0815cbada 100644 --- a/ext/pdo_pgsql/pgsql_driver.c +++ b/ext/pdo_pgsql/pgsql_driver.c @@ -124,12 +124,30 @@ static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, { pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data; pdo_pgsql_stmt *S = ecalloc(1, sizeof(pdo_pgsql_stmt)); + int ret = 1; + int scrollable; S->H = H; stmt->driver_data = S; stmt->methods = &pgsql_stmt_methods; - - return 1; + + scrollable = pdo_attr_lval(driver_options, PDO_ATTR_CURSOR, + PDO_CURSOR_FWDONLY TSRMLS_CC) == PDO_CURSOR_SCROLL; + + if (scrollable) { + PGresult *res; + int ret = 1; + + spprintf(&S->cursor_name, 0, "pdo_pgsql_cursor_%08x", stmt); + + res = PQexec(H->server, "BEGIN"); + if (PQresultStatus(res) != PGRES_COMMAND_OK) { + ret = 0; + } + PQclear(res); + } + + return ret; } static long pgsql_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRMLS_DC) |