Skip to content

Commit 6c1ad7a

Browse files
committed
Process transaction parameters in separate function
1 parent 8795635 commit 6c1ad7a

File tree

1 file changed

+51
-38
lines changed

1 file changed

+51
-38
lines changed

interbase.c

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
11441192
PHP_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

Comments
 (0)