Esempio n. 1
0
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();
    }
}
Esempio n. 2
0
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";
    }
}