ordersprinter/webapp/php/utilities/operations.php

62 lines
2.4 KiB
PHP

<?php
require_once (__DIR__. '/../dbutils.php');
class Operations {
public static function createOperation($pdo,$opType,$table,
$logtime,
$trans,
$signtxt,
$tseSignature,
$pubkeyRef,
$sigalgRef,
$serialNoRef,
$certificateRef,
$sigcounter,
$tseerror) {
$terminalInfo = Terminals::getTerminalInfo();
$terminalEntryId = Terminals::createOrReferenceTerminalDbEntry($pdo, $terminalInfo);
$range = RANGE_ORDER;
if ($opType == DbUtils::$PROCESSTYPE_VORGANG) {
$range = RANGE_ORDER;
} else if ($opType == DbUtils::$PROCESSTYPE_BELEG) {
$range = RANGE_BILL;
} else if ($opType == DbUtils::$PROCESSTYPE_SONSTIGER_VORGANG) {
$range = RANGE_CLOSING;
}
$sql = "SELECT MAX(COALESCE(bonid,0)) as maxbonid FROM %operations% WHERE typerange=?";
$res = CommonUtils::fetchSqlAll($pdo, $sql,array($range));
$maxbonid = intval($res[0]["maxbonid"]);
$sql = "SELECT MAX(COALESCE(id,0)) as maxid FROM %operations%";
$res = CommonUtils::fetchSqlAll($pdo, $sql);
$maxid = intval($res[0]["maxid"]);
if (strlen($signtxt) > 120) {
// the signtxt is only for debug purposes. So cut it and show that it was cut
$signtxt = substr($signtxt, 0, 117) . "...";
}
// In parallel transactions and with transaction isolatoon level REPEATABLE READ it may be possible that the max id is already set by another transaction.
// Therefore run this in a try catch block just in case of a deadlock and increment the maxid in catch
// In a very very unikely case of race condition still the bonid can be created multiple times, but the unique primary key id is evidence that there is no
// intention in creating an invalid operation. Therefore also this comment is left in this source code!
$attempt = 0;
$ok = false;
while (!$ok) {
try {
$sql = "INSERT INTO %operations% (id,typerange,bonid,processtype,handledintable,logtime,trans,sigcounter,tsesignature,pubkey,sigalg,serialno,certificate,signtxt,tseerror,terminalid) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
CommonUtils::execSql($pdo, $sql, array($maxid+1,$range,$maxbonid+1,$opType,$table,$logtime,$trans, $sigcounter, $tseSignature, $pubkeyRef, $sigalgRef, $serialNoRef,$certificateRef, $signtxt, $tseerror, $terminalEntryId));
$ok = true;
} catch (Exception $ex) {
$maxid++;
$attempt++;
}
}
$opid = $pdo->lastInsertId();
return $opid;
}
}