@@ -761,51 +761,49 @@ static bool php_firebird_begin_transaction(pdo_dbh_t *dbh, bool is_auto_commit_t
761
761
pdo_firebird_db_handle * H = (pdo_firebird_db_handle * )dbh -> driver_data ;
762
762
763
763
/* isc_xxx are all 1 byte. */
764
- char tpb [5 ] = { isc_tpb_version3 }, * ptpb = tpb + 1 ;
764
+ char tpb [4 ] = { isc_tpb_version3 };
765
+ size_t tpb_size ;
766
+
767
+ /* access mode. writable or readonly */
768
+ tpb [1 ] = H -> is_writable_txn ? isc_tpb_write : isc_tpb_read ;
765
769
766
770
if (is_auto_commit_txn ) {
767
771
/*
768
- * In autocommit mode, we need to always read the latest information, that is,
769
- * expect phantom reads, so we set read committed.
772
+ * In autocommit mode, we need to always read the latest information, so we set `read committed`.
770
773
*/
771
- * ptpb ++ = isc_tpb_read_committed ;
772
- * ptpb ++ = isc_tpb_rec_version ;
774
+ tpb [2 ] = isc_tpb_read_committed ;
775
+ /* Ignore indeterminate data from other transactions. This option required only with `read committed`.*/
776
+ tpb [3 ] = isc_tpb_rec_version ;
777
+ tpb_size = 4 ;
773
778
} else {
774
779
switch (H -> txn_isolation_level ) {
775
780
/*
776
- * firebird's read committed has the option to wait until other transactions
781
+ * firebird's ` read committed` has the option to wait until other transactions
777
782
* commit or rollback if there is indeterminate data.
778
783
* Introducing too many configuration values at once can cause confusion, so
779
784
* we don't support in PDO that feature yet.
780
- *
781
- * Also, there is information that depending on the settings, it is possible to
782
- * reproduce behavior like read uncommited, but at least with the current firebird
783
- * API, this is not possible.
784
785
*/
785
786
case PDO_FB_READ_COMMITTED :
786
- * ptpb ++ = isc_tpb_read_committed ;
787
- * ptpb ++ = isc_tpb_rec_version ;
787
+ tpb [2 ] = isc_tpb_read_committed ;
788
+ /* Ignore indeterminate data from other transactions. This option required only with `read committed`.*/
789
+ tpb [3 ] = isc_tpb_rec_version ;
790
+ tpb_size = 4 ;
788
791
break ;
789
792
790
793
case PDO_FB_SERIALIZABLE :
791
- * ptpb ++ = isc_tpb_consistency ;
794
+ tpb [2 ] = isc_tpb_consistency ;
795
+ tpb_size = 3 ;
792
796
break ;
793
797
794
798
case PDO_FB_REPEATABLE_READ :
795
799
default :
796
- * ptpb ++ = isc_tpb_concurrency ;
800
+ tpb [2 ] = isc_tpb_concurrency ;
801
+ tpb_size = 3 ;
797
802
break ;
798
803
}
799
804
}
800
805
801
-
802
- if (H -> is_writable_txn ) {
803
- * ptpb ++ = isc_tpb_write ;
804
- } else {
805
- * ptpb ++ = isc_tpb_read ;
806
- }
807
-
808
- if (isc_start_transaction (H -> isc_status , & H -> tr , 1 , & H -> db , (unsigned short )(ptpb - tpb ), tpb )) {
806
+ if (isc_start_transaction (H -> isc_status , & H -> tr , 1 , & H -> db , tpb_size , tpb )) {
809
807
php_firebird_error (dbh );
810
808
return false;
811
809
}
0 commit comments