Background
The tr_list sentinel head node pattern (documented in PR #553, issues #523/#541) is a design debt that should be refactored in v14.
Currently, index 0 of tr_list is reserved for the default transaction via a placeholder node (trans=NULL). The destruction path (_php_fbird_commit_link) uses positional i==0 logic to distinguish default vs explicit transactions.
This is fragile because:
Proposed refactor: Option B
Add an explicit is_default flag to fbird_tr_list:
typedef struct tr_list {
fbird_transaction *trans;
bool is_default; /* replaces the positional i==0 convention */
struct tr_list *next;
} fbird_tr_list;
Then:
- Remove all 5 placeholder allocations
_php_fbird_commit_link(): replace if (i == 0) with if (p->is_default)
_php_fbird_def_trans(): walk list looking for is_default == true (or allocate new default node)
_php_fbird_trans_end(): replace tr_list->trans == NULL with "no node with is_default == true"
fbird_inspection.c: replace *l == tr_list (first node) with (*l)->is_default
Files to touch
| File |
Lines |
Change |
php_fbird_includes.h:133-136 |
struct definition |
Add is_default field |
fbird_connection.c:86-128 |
_php_fbird_commit_link |
Replace i==0 with is_default |
fbird_inspection.c:236-245 |
transaction cleanup |
Replace first-node check with is_default |
fbird_transaction.c:954-1018 |
_php_fbird_def_trans |
Walk list for is_default |
fbird_transaction.c:1037,1070,1079 |
_php_fbird_trans_end |
Update default-tx check |
fbird_query_prepare.c:235-236 |
autocommit cleanup |
Replace tr_list->trans == ... with is_default check |
firebird.c:1500-1504 |
fbird_reconnect_transaction |
Remove placeholder |
fbird_transaction.c:367-372 |
fbird_trans_start |
Remove placeholder |
fbird_transaction.c:937-941 |
fbird_trans multi-link |
Remove placeholder |
fbird_transaction.c:963-966 |
_php_fbird_def_trans |
Remove placeholder |
fbird_query_exec.c:190-194 |
_php_fbird_exec |
Remove placeholder |
Acceptance criteria
References
Background
The
tr_listsentinel head node pattern (documented in PR #553, issues #523/#541) is a design debt that should be refactored in v14.Currently, index 0 of
tr_listis reserved for the default transaction via a placeholder node (trans=NULL). The destruction path (_php_fbird_commit_link) uses positionali==0logic to distinguish default vs explicit transactions.This is fragile because:
i==0Proposed refactor: Option B
Add an explicit
is_defaultflag tofbird_tr_list:Then:
_php_fbird_commit_link(): replaceif (i == 0)withif (p->is_default)_php_fbird_def_trans(): walk list looking foris_default == true(or allocate new default node)_php_fbird_trans_end(): replacetr_list->trans == NULLwith "no node with is_default == true"fbird_inspection.c: replace*l == tr_list(first node) with(*l)->is_defaultFiles to touch
php_fbird_includes.h:133-136is_defaultfieldfbird_connection.c:86-128_php_fbird_commit_linki==0withis_defaultfbird_inspection.c:236-245is_defaultfbird_transaction.c:954-1018_php_fbird_def_transis_defaultfbird_transaction.c:1037,1070,1079_php_fbird_trans_endfbird_query_prepare.c:235-236tr_list->trans == ...withis_defaultcheckfirebird.c:1500-1504fbird_reconnect_transactionfbird_transaction.c:367-372fbird_trans_startfbird_transaction.c:937-941fbird_transmulti-linkfbird_transaction.c:963-966_php_fbird_def_transfbird_query_exec.c:190-194_php_fbird_execAcceptance criteria
is_defaultflag added tofbird_tr_liststructis_defaultinstead of positional logictests/transaction_default_slot.phptstill passes (regression check)tests/issue119.phptstill passestests/issue307_trans_start_nullable_options.phptstill passesReferences