@@ -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
287302static 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