Skip to content

Commit d31d19e

Browse files
committed
Add PDO_SQLITE_ATTR_TRANSACTION_MODE
1 parent 03e2613 commit d31d19e

File tree

4 files changed

+82
-3
lines changed

4 files changed

+82
-3
lines changed

ext/pdo_sqlite/pdo_sqlite.stub.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ class Sqlite extends \PDO
3939
/** @cvalue PDO_SQLITE_ATTR_EXPLAIN_STATEMENT */
4040
public const int ATTR_EXPLAIN_STATEMENT = UNKNOWN;
4141

42+
/** @cvalue PDO_SQLITE_ATTR_TRANSACTION_MODE */
43+
public const int ATTR_TRANSACTION_MODE = UNKNOWN;
44+
45+
/** @cvalue PDO_SQLITE_ATTR_TRANSACTION_MODE_DEFERRED */
46+
public const int ATTR_TRANSACTION_MODE_DEFERRED = UNKNOWN;
47+
48+
/** @cvalue PDO_SQLITE_ATTR_TRANSACTION_MODE_IMMEDIATE */
49+
public const int ATTR_TRANSACTION_MODE_IMMEDIATE = UNKNOWN;
50+
51+
/** @cvalue PDO_SQLITE_ATTR_TRANSACTION_MODE_EXCLUSIVE */
52+
public const int ATTR_TRANSACTION_MODE_EXCLUSIVE = UNKNOWN;
53+
4254
#if SQLITE_VERSION_NUMBER >= 3043000
4355
public const int EXPLAIN_MODE_PREPARED = 0;
4456
public const int EXPLAIN_MODE_EXPLAIN = 1;

ext/pdo_sqlite/pdo_sqlite_arginfo.h

Lines changed: 25 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/pdo_sqlite/php_pdo_sqlite_int.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ typedef struct {
5151
struct pdo_sqlite_func *funcs;
5252
struct pdo_sqlite_collation *collations;
5353
zend_fcall_info_cache authorizer_fcc;
54+
zend_long transaction_mode;
5455
} pdo_sqlite_db_handle;
5556

5657
typedef struct {
@@ -75,7 +76,11 @@ enum {
7576
PDO_SQLITE_ATTR_READONLY_STATEMENT,
7677
PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES,
7778
PDO_SQLITE_ATTR_BUSY_STATEMENT,
78-
PDO_SQLITE_ATTR_EXPLAIN_STATEMENT
79+
PDO_SQLITE_ATTR_EXPLAIN_STATEMENT,
80+
PDO_SQLITE_ATTR_TRANSACTION_MODE,
81+
PDO_SQLITE_ATTR_TRANSACTION_MODE_DEFERRED,
82+
PDO_SQLITE_ATTR_TRANSACTION_MODE_IMMEDIATE,
83+
PDO_SQLITE_ATTR_TRANSACTION_MODE_EXCLUSIVE
7984
};
8085

8186
typedef int pdo_sqlite_create_collation_callback(void*, int, const void*, int, const void*);

ext/pdo_sqlite/sqlite_driver.c

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,22 @@ static bool sqlite_handle_begin(pdo_dbh_t *dbh)
255255
{
256256
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
257257

258-
if (sqlite3_exec(H->db, "BEGIN", NULL, NULL, NULL) != SQLITE_OK) {
258+
char *begin_statement;
259+
switch (H->transaction_mode) {
260+
case 0:
261+
case PDO_SQLITE_ATTR_TRANSACTION_MODE_DEFERRED:
262+
begin_statement = "BEGIN DEFERRED TRANSACTION";
263+
break;
264+
case PDO_SQLITE_ATTR_TRANSACTION_MODE_IMMEDIATE:
265+
begin_statement = "BEGIN IMMEDIATE TRANSACTION";
266+
break;
267+
case PDO_SQLITE_ATTR_TRANSACTION_MODE_EXCLUSIVE:
268+
begin_statement = "BEGIN EXCLUSIVE TRANSACTION";
269+
default:
270+
begin_statement = "BEGIN";
271+
}
272+
273+
if (sqlite3_exec(H->db, begin_statement, NULL, NULL, NULL) != SQLITE_OK) {
259274
pdo_sqlite_error(dbh);
260275
return false;
261276
}
@@ -286,11 +301,22 @@ static bool sqlite_handle_rollback(pdo_dbh_t *dbh)
286301

287302
static int pdo_sqlite_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value)
288303
{
304+
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
305+
289306
switch (attr) {
290307
case PDO_ATTR_CLIENT_VERSION:
291308
case PDO_ATTR_SERVER_VERSION:
292309
ZVAL_STRING(return_value, (char *)sqlite3_libversion());
293310
break;
311+
case PDO_SQLITE_ATTR_TRANSACTION_MODE:
312+
zend_long mode;
313+
if (H->transaction_mode == 0) {
314+
mode = PDO_SQLITE_ATTR_TRANSACTION_MODE_DEFERRED;
315+
} else {
316+
mode = H->transaction_mode;
317+
}
318+
ZVAL_LONG(return_value, mode);
319+
break;
294320

295321
default:
296322
return 0;
@@ -326,6 +352,18 @@ static bool pdo_sqlite_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
326352
}
327353
sqlite3_extended_result_codes(H->db, lval);
328354
return true;
355+
case PDO_SQLITE_ATTR_TRANSACTION_MODE:
356+
if (!pdo_get_long_param(&lval, val)) {
357+
return false;
358+
}
359+
if (lval != PDO_SQLITE_ATTR_TRANSACTION_MODE_DEFERRED &&
360+
lval != PDO_SQLITE_ATTR_TRANSACTION_MODE_IMMEDIATE &&
361+
lval != PDO_SQLITE_ATTR_TRANSACTION_MODE_EXCLUSIVE) {
362+
return false;
363+
}
364+
H->transaction_mode = lval;
365+
return true;
366+
329367
}
330368
return false;
331369
}

0 commit comments

Comments
 (0)