X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=includes%2Fdb%2Fsql_functions.inc;h=56392e6d9fdb7eef8c2edbd838cb7517ab2d512e;hb=7618d9d62ee39a932f56565a4ce25d965bf53462;hp=febc3af824e4f1246be0f9659a7a6aced26616ab;hpb=ad0fdc78ec8ae2b67ef1b3a6d4f3393dba242310;p=fa-stable.git diff --git a/includes/db/sql_functions.inc b/includes/db/sql_functions.inc index febc3af8..56392e6d 100644 --- a/includes/db/sql_functions.inc +++ b/includes/db/sql_functions.inc @@ -15,12 +15,24 @@ //------------------------------------------------------------------- // Multilevel transaction control. // +$transaction_level = 0; +$transaction_data = null; -function begin_transaction() +function begin_transaction($func=null, $args=null) { - global $transaction_level; // set in set_global_connection() + global $transaction_level, $transaction_data, $SysPrefs; if (!$transaction_level) { + if ($SysPrefs->db_trail) { + $bt = debug_backtrace(); + $user = $_SESSION["wa_current_user"]->user; + $transaction_data = array( + 'user' => $_SESSION["wa_current_user"]->user, + 'msg'=> basename($bt[count($bt)-1]['file']).'@'.$bt[count($bt)-1]['line'], // call start point + 'entry' => $func, + 'data' => serialize($args), + ); + } db_query("BEGIN", "could not start a transaction"); } $transaction_level++; @@ -28,11 +40,22 @@ function begin_transaction() function commit_transaction() { - global $transaction_level; + global $transaction_level, $transaction_data, $SysPrefs, $db_last_inserted_id, $db; $transaction_level--; if (!$transaction_level) { + // FIXME: if logged to table remember to preserve last_insert_id! + if ($SysPrefs->db_trail == 1) { + $last_insert = $db_last_inserted_id; + $db_last_inserted_id = mysqli_insert_id($db); // preserve in case trail insert is done + $sql = "INSERT INTO ".TB_PREF."db_trail (user, msg, entry, data) VALUES (" + ."'".$transaction_data['user']."','".$transaction_data['msg']."','".$transaction_data['entry']."'," + .db_escape($transaction_data['data']).")"; + db_query($sql, 'cannot log user operation'); + $db_last_inserted_id = $last_insert; + } elseif ($SysPrefs->db_trail == 2) + error_log($transaction_data['msg'].'|'.$transaction_data['user'].'|'.$transaction_data['entry'].'|'.$transaction_data['data']); db_query("COMMIT", "could not commit a transaction"); } } @@ -48,6 +71,7 @@ function cancel_transaction() if ($transaction_level) { db_query("ROLLBACK", "could not cancel a transaction"); } + $transaction_level = 0; } //----------------------------------------------------------------------------- @@ -59,4 +83,51 @@ function update_record_status($id, $status, $table, $key) { db_query($sql, "Can't update record status"); } -?> +//----------------------------------------------------------------------------- +// +// Helper for sql subquery returning running totals from delta tables like stock_moves or bank_trans +// +// $table - table name with optional WHERE clause +// $column - delta column +// $index - comma delimited list of columns for total grouping and order +// Returns running totals with respective index column +// +function running_total_sql($table, $column, $index) +{ + + return "SELECT daily.$index, daily.$column, (@total:=@total+daily.$column) total + FROM + (SELECT $index, sum($column) $column FROM $table GROUP BY $index ORDER BY $index) daily, + (SELECT @total:=0) total_var"; +} + +/* + Return number of records in tables, where some foreign key $id is used. + $id - searched key value + $tables - array of table names (without prefix); when table name is used as a key, then + value is name of foreign key field. For numeric keys $stdkey field name is used. + $stdkey - standard name of foreign key. +*/ +function key_in_foreign_table($id, $tables, $stdkey) +{ + + if (!is_array($tables)) + $tables = array($tables); + + $sqls = array(); + foreach ($tables as $tbl => $key) { + if (is_numeric($tbl)) { + $tbl = $key; + $key = $stdkey; + } + $sqls[] = "(SELECT COUNT(*) as cnt FROM `".TB_PREF."$tbl` WHERE `$key`=".db_escape($id).")\n"; + } + + $sql = "SELECT sum(cnt) FROM (". implode(' UNION ', $sqls).") as counts"; + + $result = db_query($sql, "check relations for ".implode(',',$tables)." failed"); + $count = db_fetch($result); + + return $count[0]; +} +