function db_insert($dbname, $data, $returnInsertId = FALSE) { $keys = array(); $values = array(); foreach ($data as $key => $value) { $keys[] = $key; $values[] = ":" . $key; } $keys = join(",", $keys); $values = join(",", $values); $insertquery = "INSERT INTO `{$dbname}` ({$keys}) VALUES ({$values})"; db_queryWith($insertquery, $data); if ($returnInsertId) { return $_ENV["DBPdo"]->lastInsertId(); } }
function performTransaction($tid) { // TODO: Implement logic. // 1. Get data from database via queryWith(..., array("tid" => $tid)) // 2. Load accounts from participants // 3. Fail gracefully, if that didn't work (i.e. we don't have exactly one unverified transaction, excactly one account for each participants, etc.) // 4. Perform account balance change // 5. Mark as transaction as verified // 6. Store updated data // // One potential problem: ensure database atomicity. try { $transaction = db_queryWith("SELECT * FROM transactions WHERE tid = :tid", array("tid" => $tid)); if ($transaction->rowCount() !== 1) { return "Transaction does not exist."; } $transaction = $transaction->fetch(); $srcAccount = $transaction["sourceAccount"]; $targAccount = $transaction["targetAccount"]; $srcArray = db_queryWith("SELECT * FROM accounts WHERE userid =:userid", array("userid" => $srcAccount)); if ($srcArray->rowCount() !== 1) { return "User does not exist"; } $srcArray = $srcArray->fetch(); $targArray = db_queryWith("SELECT * FROM accounts WHERE userid= :userid", array("userid" => $targAccount)); if ($targArray->rowCount() !== 1) { return "User does not exist"; } $targArray = $targArray->fetch(); $srcBalance = $srcArray["balance"] - $transaction["volume"]; $targBalance = $targArray["balance"] + $transaction["volume"]; if ($srcBalance >= 0 && $targBalance >= 0) { $firstTxn = db_queryWith("update accounts set balance =:srcBalance where userid=:userid", array("srcBalance" => $srcBalance, "userid" => $srcAccount)); if ($firstTxn) { $secondTxn = db_queryWith("update accounts set balance=:targBalance where userid=:userid", array("targBalance" => $targBalance, "userid" => $targAccount)); if ($secondTxn) { $verify = db_queryWith("update transactions set isVerified=1 where tid=:tid", array("tid" => $tid)); if ($verify) { return "Transaction is Successful"; } } else { //Reverting Back the changes in DB since secondTxn failed db_queryWith("update accounts set balance =:balance where userid=:userid", array("balance" => $srcArray->balance, "userid" => $srcAccount)); return "Transaction failed"; } } else { return "Transaction Failed"; } } else { return "Transaction failed due to insufficient balance"; } } catch (Exception $exe) { return "Transaction failed to perform"; } }