@@ -1141,6 +1141,54 @@ PHP_FUNCTION(ibase_drop_db)
11411141
11421142#define TPB_MAX_SIZE (8*sizeof(char))
11431143
1144+ void _php_ibase_populate_trans (zend_long trans_argl , zend_long trans_timeout , char * last_tpb , unsigned short * len ) /* {{{ */
1145+ {
1146+ unsigned short tpb_len = 0 ;
1147+ if (trans_argl != PHP_IBASE_DEFAULT ) {
1148+ last_tpb [tpb_len ++ ] = isc_tpb_version3 ;
1149+
1150+ /* access mode */
1151+ if (PHP_IBASE_READ == (trans_argl & PHP_IBASE_READ )) {
1152+ last_tpb [tpb_len ++ ] = isc_tpb_read ;
1153+ } else if (PHP_IBASE_WRITE == (trans_argl & PHP_IBASE_WRITE )) {
1154+ last_tpb [tpb_len ++ ] = isc_tpb_write ;
1155+ }
1156+
1157+ /* isolation level */
1158+ if (PHP_IBASE_COMMITTED == (trans_argl & PHP_IBASE_COMMITTED )) {
1159+ last_tpb [tpb_len ++ ] = isc_tpb_read_committed ;
1160+ if (PHP_IBASE_REC_VERSION == (trans_argl & PHP_IBASE_REC_VERSION )) {
1161+ last_tpb [tpb_len ++ ] = isc_tpb_rec_version ;
1162+ } else if (PHP_IBASE_REC_NO_VERSION == (trans_argl & PHP_IBASE_REC_NO_VERSION )) {
1163+ last_tpb [tpb_len ++ ] = isc_tpb_no_rec_version ;
1164+ }
1165+ } else if (PHP_IBASE_CONSISTENCY == (trans_argl & PHP_IBASE_CONSISTENCY )) {
1166+ last_tpb [tpb_len ++ ] = isc_tpb_consistency ;
1167+ } else if (PHP_IBASE_CONCURRENCY == (trans_argl & PHP_IBASE_CONCURRENCY )) {
1168+ last_tpb [tpb_len ++ ] = isc_tpb_concurrency ;
1169+ }
1170+
1171+ /* lock resolution */
1172+ if (PHP_IBASE_NOWAIT == (trans_argl & PHP_IBASE_NOWAIT )) {
1173+ last_tpb [tpb_len ++ ] = isc_tpb_nowait ;
1174+ } else if (PHP_IBASE_WAIT == (trans_argl & PHP_IBASE_WAIT )) {
1175+ last_tpb [tpb_len ++ ] = isc_tpb_wait ;
1176+ if (PHP_IBASE_LOCK_TIMEOUT == (trans_argl & PHP_IBASE_LOCK_TIMEOUT )) {
1177+ if (trans_timeout <= 0 || trans_timeout > 0x7FFF ) {
1178+ php_error_docref (NULL , E_WARNING , "Invalid timeout parameter" );
1179+ } else {
1180+ last_tpb [tpb_len ++ ] = isc_tpb_lock_timeout ;
1181+ last_tpb [tpb_len ++ ] = sizeof (ISC_SHORT );
1182+ last_tpb [tpb_len ] = (ISC_SHORT )trans_timeout ;
1183+ tpb_len += sizeof (ISC_SHORT );
1184+ }
1185+ }
1186+ }
1187+ }
1188+ * len = tpb_len ;
1189+ }
1190+ /* }}} */
1191+
11441192PHP_FUNCTION (ibase_trans )
11451193{
11461194 unsigned short i , link_cnt = 0 , tpb_len = 0 ;
@@ -1200,55 +1248,20 @@ PHP_FUNCTION(ibase_trans)
12001248
12011249 convert_to_long_ex (& args [i ]);
12021250 trans_argl = Z_LVAL (args [i ]);
1203-
12041251 if (trans_argl != PHP_IBASE_DEFAULT ) {
1205- last_tpb [tpb_len ++ ] = isc_tpb_version3 ;
1206-
1207- /* access mode */
1208- if (PHP_IBASE_READ == (trans_argl & PHP_IBASE_READ )) {
1209- last_tpb [tpb_len ++ ] = isc_tpb_read ;
1210- } else if (PHP_IBASE_WRITE == (trans_argl & PHP_IBASE_WRITE )) {
1211- last_tpb [tpb_len ++ ] = isc_tpb_write ;
1212- }
1213-
1214- /* isolation level */
1215- if (PHP_IBASE_COMMITTED == (trans_argl & PHP_IBASE_COMMITTED )) {
1216- last_tpb [tpb_len ++ ] = isc_tpb_read_committed ;
1217- if (PHP_IBASE_REC_VERSION == (trans_argl & PHP_IBASE_REC_VERSION )) {
1218- last_tpb [tpb_len ++ ] = isc_tpb_rec_version ;
1219- } else if (PHP_IBASE_REC_NO_VERSION == (trans_argl & PHP_IBASE_REC_NO_VERSION )) {
1220- last_tpb [tpb_len ++ ] = isc_tpb_no_rec_version ;
1221- }
1222- } else if (PHP_IBASE_CONSISTENCY == (trans_argl & PHP_IBASE_CONSISTENCY )) {
1223- last_tpb [tpb_len ++ ] = isc_tpb_consistency ;
1224- } else if (PHP_IBASE_CONCURRENCY == (trans_argl & PHP_IBASE_CONCURRENCY )) {
1225- last_tpb [tpb_len ++ ] = isc_tpb_concurrency ;
1226- }
1227-
1228- /* lock resolution */
1229- if (PHP_IBASE_NOWAIT == (trans_argl & PHP_IBASE_NOWAIT )) {
1230- last_tpb [tpb_len ++ ] = isc_tpb_nowait ;
1231- } else if (PHP_IBASE_WAIT == (trans_argl & PHP_IBASE_WAIT )) {
1232- last_tpb [tpb_len ++ ] = isc_tpb_wait ;
1252+ // Skip conflicting parameters
1253+ if (PHP_IBASE_NOWAIT != (trans_argl & PHP_IBASE_NOWAIT ) && PHP_IBASE_WAIT == (trans_argl & PHP_IBASE_WAIT )) {
12331254 if (PHP_IBASE_LOCK_TIMEOUT == (trans_argl & PHP_IBASE_LOCK_TIMEOUT )) {
12341255 if ((i + 1 < argn ) && (Z_TYPE (args [i + 1 ]) == IS_LONG )){
12351256 i ++ ;
12361257 convert_to_long_ex (& args [i ]);
12371258 trans_timeout = Z_LVAL (args [i ]);
1238-
1239- if (trans_timeout <= 0 || trans_timeout > 0x7FFF ) {
1240- php_error_docref (NULL , E_WARNING , "Invalid timeout parameter" );
1241- } else {
1242- last_tpb [tpb_len ++ ] = isc_tpb_lock_timeout ;
1243- last_tpb [tpb_len ++ ] = sizeof (ISC_SHORT );
1244- last_tpb [tpb_len ] = (ISC_SHORT )trans_timeout ;
1245- tpb_len += sizeof (ISC_SHORT );
1246- }
12471259 } else {
12481260 php_error_docref (NULL , E_WARNING , "IBASE_LOCK_TIMEOUT expects next argument to be timeout value" );
12491261 }
12501262 }
12511263 }
1264+ _php_ibase_populate_trans (trans_argl , trans_timeout , last_tpb , & tpb_len );
12521265 }
12531266 }
12541267 }
0 commit comments