function edit_post($f3) { // Update Tool Locations $this->D->sharedLocationsList = array(); if ($f3->exists('POST.locations')) { foreach ($f3->get('POST.locations') as $id) { $this->D->sharedLocationsList[] = \R::load('locations', $id); } } $f3->clear('POST.locations'); $this->D->import($f3->get('POST')); $this->D->training_levels or $this->D->training_levels = json_encode($f3->get('TRAINING_LEVELS')); \R::begin(); try { $id = \R::store($this->D); \R::commit(); } catch (\Exception $e) { \R::rollback(); if ($e->getSQLState() == 23000) { } throw new \Exception($this->D->name . ' is not a unique name.'); throw new \Exception(); } if ($f3->get('dry')) { logger($f3, 'added ' . $this->class_name() . ', id=' . $id); } else { logger($f3, 'modified ' . $this->class_name() . ', id=' . $id); } $f3->reroute($this->redirect()); }
function response($message, $error = 0, $log = 1) { global $systemname, $systemURL; if ($log == 1 and $message) { if (isset($_COOKIE["loguserid"])) { $userid = $_COOKIE["loguserid"]; } else { $userid = 0; } $number = getphonenumber($userid); logresult($number, $message); } R::commit(); echo '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>', $systemname, '</title>'; echo '<base href="', $systemURL, '" />'; echo '<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />'; echo '<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css" />'; if (file_exists("analytics.php")) { require "analytics.php"; } echo '</head><body><div class="container">'; if ($error) { echo '<div class="alert alert-danger" role="alert">', $message, '</div>'; } else { echo '<div class="alert alert-success" role="alert">', $message, '</div>'; } echo '</div></body></html>'; exit; }
public function save() { $rules = array('customer_id' => 'required|', 'payment_amount' => 'required|numeric', 'payment_memo' => 'required'); $filters = array('payment_memo' => 'trim|sanitize_string', 'payment_amount' => 'trim|sanitize_string|numeric', 'customer_id' => 'trim|numeric'); $postValues = $gump->filter($this->{$postarray}, $filters); $validated = $gump->validate($gump->filter($postValues, $filters), $rules); $this->payment_amount = $postValues['payment_amount']; $this->payment_memo = $postValues['payment_memo']; $this->who_is_getting_paid = $postValues['customer_id']; if ($validated === TRUE) { R::begin(); try { /*Payment Add*/ $payment = R::findOne('user', ' id = ? and created_by=? ', array($this->who_is_getting_paid, $this->who_is_paying)); $current_balance = $payment->balance2; $reseller_balance = R::dispense("reseller_balance"); $reseller_balance->user_id = $this->who_is_getting_paid; $reseller_balance->amount = $this->{$payment_amount}; $reseller_balance->load_by = $this->who_is_paying; $reseller_balance->note = $this->comments; $reseller_balance->ip = $_SERVER["REMOTE_ADDR"]; $reseller_balance->updated = CURRENT_DTT; if ($this->payment_type == "add") { $payment->balance2 = $payment->balance2 + $this->payment_amount; $payment->return_payment = 0; //add R::exec("CALL preparestatement({$this->who_is_paying},{$this->payment_amount},{$current_balance},{$this->who_is_getting_paid},'debit','{$this->payment_memo}')"); } elseif ($this->payment_type == "return") { $payment->balance2 = $payment->balance2 - $this->payment_amount; $payment->return_payment = 1; //return R::exec("CALL preparestatement({$this->who_is_paying},{$this->payment_amount},{$current_balance},{$this->who_is_getting_paid},'credit','{$this->payment_memo}')"); } R::save($payment); R::save($reseller_balance); R::commit(); } catch (Exception $e) { R::rollback(); $this->setError("" . $e->getMessage()); } } else { $this->setError($gump->get_readable_errors(true)); } if ($this->getError() == "") { $this->fails = FALSE; } else { $this->fails = TRUE; } }
public static function removeChild($table, $parentBean, $bean) { //we still need 2 separate queries because the parent's left_id can't be updated... R::begin(); try { R::trash($bean); R::exec('UPDATE ' . $table . ' SET left_id = left_id-2 WHERE left_id > ?', array($bean->right_id)); R::exec('UPDATE ' . $table . ' SET right_id = right_id-2 WHERE right_id >= ?', array($bean->right_id)); $parentBean->right_id -= 2; R::commit(); } catch (Exception $e) { R::rollback(); throw $e; } }
public function save() { $this->amount = abs($this->amount); if ($this->phone == "") { $this->setError("Please Give number"); } elseif (strlen($this->phone) < 11) { $this->setError("Phone number must be 11 digit"); } elseif ($this->amount < 10 || $this->amount > 1000) { $this->setError("Amount not valid"); } elseif ($this->restrictDublicateLoad($this->phone) == 1) { $this->setError("You can not request same number within 15 minute."); } else { R::begin(); try { foreach ($this->cut_balance_from_id as $boss_id) { $current_balance = L::getBalance($boss_id, "flexiload"); if ($current_balance < $this->amount) { $this->setError("You do not have sufficient amount in your account"); } else { R::exec("UPDATE user SET {$this->balance_field}={$this->balance_field}-{$this->amount} where id='{$boss_id}'"); R::exec("CALL preparestatement({$boss_id},{$this->amount},{$current_balance},{$this->user_id},'credit','{$this->comments}')"); } } $flexiload = R::dispense("flexiload"); $flexiload->phone = $this->phone; $flexiload->balance = $this->amount; $flexiload->load_type = $this->type; $flexiload->user_id = $this->user_id; $flexiload->s_date = CURRENT_DT; $flexiload->status = 'pending'; $flexiload->s_time = time(); $flexiload->submitted_date = CURRENT_DTT; $flexiload->operator = $this->getOperatorName($this->phone); R::store($flexiload); R::commit(); } catch (Exception $e) { R::rollback(); $this->setError("" . $e->getMessage()); } } if ($this->getError() == "") { $this->fails = FALSE; } else { $this->fails = TRUE; } }
public function cancel() { $cs = Config::getConfig("company_quests"); $details = $cs[$this->name]; //$company = R::relatedOne($this->bean, 'company'); $user = R::relatedOne($this->bean, 'user'); if ($user == null) { R::trash($this->bean); return; } $company = R::findOne('company', 'user_id = ?', array($user->id)); $company->balance -= floor($details["oncomplete"]["cash"] * 0.1); R::begin(); R::trash($this->bean); R::store($company); R::commit(); }
static function registerUser($uname, $keys, $values) { #self::connectDb(); R::begin(); for ($i = 0; $i < sizeof($values); $i++) { $user = R::dispense('users'); $user->uname = $uname; $user->prop = $keys[$i]; $user->value = $values[$i]; R::store($user); } try { $id = R::commit(); return '1'; } catch (Exception $e) { return "0"; } }
/** * handle company rules */ protected function cronHandleCrule() { // delete old rules R::exec('DELETE FROM `crule` WHERE `until` < ?', array(time())); // get new rules $crules = R::find('crule'); // counter $counter = array('buy' => 0, 'sell' => 0); foreach ($crules as $crule) { $company = R::relatedOne($crule, 'company'); $amount = R::getCell('SELECT `' . $crule->r_name . '` FROM `company_' . ($crule->r_type == 'product' ? 'products' : 'ress') . '` WHERE company_id = ?', array($company->id)); // fix amount with existant orders $existant = R::related($company, 'order', 'r_name = ? AND type = ?', array($crule->r_name, $crule->action)); foreach ($existant as $e) { if ($e->type == 'buy') { $amount += $e->r_amount; } else { $amount -= $e->r_amount; } } $order = R::dispense('order'); $order->type = $crule->action; $order->r_type = $crule->r_type; $order->r_name = $crule->r_name; $order->price = $crule->r_price; $order->date = time(); $order->automatic = false; $order->a_expires = 0; $sold = 0; if ($crule->action == 'buy' && $amount < $crule->r_limit) { // create buy order $maxBuy = $crule->r_limit - $amount; $costs = $maxBuy * $crule->r_price; if ($costs > $company->balance) { $maxBuy = floor($company->balance / $crule->r_price); } if ($maxBuy == 0) { continue; } $company->balance -= $maxBuy * $crule->r_price; $order->r_amount = $maxBuy; $counter['buy']++; } else { if ($crule->action == 'sell' && $amount > $crule->r_limit) { // create sell order $order->r_amount = $amount - $crule->r_limit; $sold += $amount - $crule->r_limit; $counter['sell']++; } else { continue; } } R::begin(); if ($sold != 0) { R::exec('UPDATE `company_' . ($crule->r_type == 'product' ? 'products' : 'ress') . '` SET `' . $crule->r_name . '` = `' . $crule->r_name . '`-? WHERE company_id = ?', array($sold, $company->id)); } R::store($order); R::store($company); R::associate($order, $company); R::commit(); } $this->log('handleCrule', $counter['buy'] . ' new buy-orders, ' . $counter['sell'] . ' new sell-orders'); }
exit('DB alarm get run time transation failed \\n' . $e->getMessage()); } try { R::begin(); if ($target == 'dc-view') { $data_yidong = R::exec(' DELETE FROM dcom_dcview ' . ' WHERE create_time >= :create_time ', [':create_time' => $last_run_time]); } else { $data_yidong = R::exec(' DELETE FROM dcom_yidong ' . ' WHERE yidong_code LIKE "' . $target . '%" ' . ' AND create_time >= :create_time ', [':create_time' => $last_run_time]); $data_guanlian = R::exec(' DELETE FROM dcom_yidongguanlian ' . ' WHERE yidong_code LIKE "' . $target . '%" ' . ' AND guanlianzhi >= :guanlianzhi ', [':guanlianzhi' => $last_run_time]); } } catch (Exception $e) { R::rollback(); R::close(); exit('DB alarm do delete since [ ' . $last_run_time . ' ] failed \\n' . $e->getMessage()); } R::commit(TRUE); R::close(); /* config db */ R::addDatabase('config', $GLOBALS['db_config_url'], $GLOBALS['db_config_user'], $GLOBALS['db_config_pass']); R::selectDatabase('config'); if (!R::testConnection()) { exit('DB config connect failed \\n' . $e->getMessage()); } R::freeze(TRUE); /* 删除:最后运行ID */ try { $data_lastid = R::exec(' DELETE FROM gds_alarm.sys_last_id ' . ' WHERE alarm_type = :alarm_type ' . ' AND create_time >= :create_time ', [':alarm_type' => $target, ':create_time' => $last_run_time]); } catch (Exception $e) { R::close(); exit('DB config insert failed \\n' . $e->getMessage()); }
/** * commit a bean with transactions * @param object $bean * @return $res false or last insert id */ public static function commitBean($bean) { R::begin(); try { $res = R::store($bean); R::commit(); } catch (Exception $e) { R::rollback(); $res = false; } return $res; }
public function show_Questing() { if ($this->myNPCQuestRole == 'none') { $this->error('Dieses NPC hat keine Quest für dich!'); } if ($this->myNPCQuestRole == 'startnpc' && $this->myNPCQuest->accepted == 0) { $this->output('maintext', $this->myNPCQuestData["text2"] . ' Denk daran: Je schneller du dieses Quest erledigst, desto mehr Erfahrungspunkte bekommst du als Belohnung!'); R::begin(); foreach ($this->myNPCQuestData["items"] as $k => $v) { $inv = R::dispense('inventory'); $inv->amount = $v["amount"]; $inv->param = $v["param"]; $inv->item_id = $v["id"]; $inv->user = $this->user; R::store($inv); } $this->myNPCQuest->accepted = 1; $this->myNPCQuest->accept_time = time(); R::store($this->myNPCQuest); R::commit(); } elseif ($this->myNPCQuestRole == 'stopnpc' && $this->myNPCQuest->accepted == 1) { // check if user has needed items in inventory $items = array(); foreach ($this->myNPCQuestData["items"] as $k => $v) { $inv = R::findOne('inventory', ' item_id = ? AND amount >= ? AND param = ? AND user_id = ?', array($v["id"], $v["amount"], $v["param"], $this->user->getID())); if ($inv == null) { $this->output('maintext', 'Leider hast du nicht alle nötigen Items dabei!'); $this->output('options', array('interact' => 'Zurück')); return; } $items[$v["id"]]["data"] = $inv; $items[$v["id"]]["amount"] = $v["amount"]; } // calculate bonus $this->myNPCQuest->complete_time = time(); $took = $this->myNPCQuest->complete_time - $this->myNPCQuest->accept_time; $xp = $this->myNPCQuestData["base_xp"]; $cash = $this->myNPCQuestData["base_cash"]; // randomize xp/cash $xp += 2 - mt_rand(0, 4); $cash += 2 - mt_rand(0, 4); if ($took > $this->myNPCQuestData["base_time"]) { $diff = $took - $this->myNPCQuestData["base_time"]; // subtract of the bonus $xp -= floor($diff / 10); // every ten seconds late subtract 1xp if ($xp < 1) { $xp = 1; } $cash -= floor($diff / 5); // every five seconds late substract 1 cash if ($cash < 0) { $cash = 0; } } R::begin(); $this->user->cash += $cash; $this->user->changeXP($this->user->xp + $xp); // take items from inventory foreach ($items as $i) { $i["data"]->amount -= $i["amount"]; R::store($i["data"]); } R::store($this->myNPCQuest); R::commit(); $quest = R::dispense('quests_npc'); $quest->giveNewQuest($this->user); $this->output('maintext', $this->myNPCQuestData["text2"] . ' <br /> <b>Du erhälst als Belohnung: ' . formatCash($cash) . ' {money} und ' . formatCash($xp) . ' {eye}</b>'); } else { $this->output('maintext', 'Ich habe leider im Moment nichts zu tun für dich!'); } $this->output('options', array('interact' => 'Zurück')); }
function logresult($userid, $text) { R::selectDatabase('localdb'); R::begin(); $logtext = ""; if (is_array($text)) { foreach ($text as $value) { $logtext .= $value . "; "; } } else { $logtext = $text; } $logtext = strip_tags($logtext); $sent = R::dispense('sent'); $sent->number = $userid; $sent->text = $logtext; R::store($sent); R::commit(); R::selectDatabase('default'); }
function create_record($f3, $user, $instructor, $timestamp = false) { // Create Training Record $training = \R::dispense('trainings'); $training->users = $user; $training->tools = $this->D; $training->instructor = $instructor; $training->timestamp = $timestamp !== false ? $timestamp : time(); $training->level = $f3->get('POST.level'); $this->D->verify_training_level($f3->get('POST.level')); // Store Training Record \R::begin(); try { $id = \R::store($training); \R::commit(); $f3->set('message', $user->displayname . ' has been trained!'); $f3->set('success', 1); } catch (\Exception $e) { \R::rollback(); $f3->set('message', $user->displayname . ' is already trained on this machine at this level. No training record added.'); $f3->set('success', 0); } if ($f3->get('success')) { logger($f3, 'added ' . $this->class_name() . ', id=' . $id); } }
/** * /event/user/halv */ public function helAction() { $this->checkAccess(); $eDb = new eDb(); $halv = $eDb->getUserHalvFromUserId(session::getUserId()); if (empty($halv)) { http::locationHeader('/event/user/index', 'Du skal være del af en halv kvadrille for at oprette en hel'); } http::prg(); if (isset($_POST['send'])) { $this->validateHel(); if (empty($this->errors)) { // Prepare $ary = db::prepareToPostArray(array('halv'), true); R::begin(); // Delete other hele $eDb->deleteHelFromUserId(session::getUserId()); // Create $id = $eDb->createHel($ary); // Set a better name $name = $eDb->getUsersStrFromHel($id); $bean = rb::getBean('hel', 'id', $id); $bean->name = $name; R::store($bean); $res = R::commit(); if (!$res) { R::rollback(); } http::locationHeader('/event/user/index'); } else { echo html::getErrors($this->errors); } } echo $this->formCreateHel(); }
/** * Test Transactions. * * @return void */ public function testTransactions() { testpack('transactions'); R::begin(); $bean = R::dispense('bean'); R::store($bean); R::commit(); asrt(R::count('bean'), 1); R::wipe('bean'); R::freeze(1); R::begin(); $bean = R::dispense('bean'); R::store($bean); R::rollback(); asrt(R::count('bean'), 0); R::freeze(FALSE); testpack('genSlots'); asrt(R::genSlots(array('a', 'b')), '?,?'); asrt(R::genSlots(array('a')), '?'); asrt(R::genSlots(array()), ''); }
protected function actionM($action, $name, $details, $type, $id) { if (!is_numeric($id) || $id < 0) { $this->output('maintext', 'Ungültige Order!'); return; } $order = R::findOne('order', ' id = ? AND type = ? AND r_name = ?', array($id, $action == 'sell' ? 'buy' : 'sell', $name)); if (!$order) { $this->output('maintext', 'Die angegebene Order konnte nicht gefunden werden!'); return; } if (R::areRelated($order, $this->myCompany)) { $this->output('maintext', 'Die angegebene Order konnte nicht gefunden werden!'); return; } $orderCompany = R::relatedOne($order, 'company'); if (isset($_POST['amount']) && is_numeric($_POST['amount']) && $_POST['amount'] > 0) { $amount = $_POST['amount']; if ($action == 'sell') { if ($amount > ($type == 'r' ? $this->myRess->{$name} : $this->myProducts->{$name})) { $this->output('maintext', 'Deine Firma lagert nicht genügend Ressourcen für diesen Verkauf!'); return; } if ($amount > $order->r_amount) { $this->output('maintext', 'Diese Firma Ordert {' . $type . '_' . $name . '} maximal ' . formatCash($order->r_amount) . ' mal!'); return; } // checks done $this->myCompany->balance += $amount * $order->price; if ($type == 'r') { $this->myRess->{$name} -= $amount; $order->r_amount -= $amount; $targetComp = R::findOne('company_ress', ' company_id = ?', array($orderCompany->id)); $targetComp->{$name} += $amount; R::begin(); R::store($this->myRess); if ($order->r_amount <= 0) { R::trash($order); } else { R::store($order); } R::store($targetComp); R::store($this->myCompany); R::commit(); } else { $this->myProducts->{$name} -= $amount; $order->r_amount -= $amount; $targetComp = R::findOne('company_products', ' company_id = ?', array($orderCompany->id)); $targetComp->{$name} += $amount; R::begin(); R::store($this->myProducts); if ($order->r_amount <= 0) { R::trash($order); } else { R::store($order); } R::store($targetComp); R::store($this->myCompany); R::commit(); } $this->output('maintext', 'Der Verkauf war erfolgreich!'); return; } else { $totalPrice = $amount * $order->price; if ($totalPrice > $this->myCompany->balance) { $this->output('maintext', 'Deine Firma hat nicht genügend Geld für diesen Kauf!'); return; } if ($amount > $order->r_amount) { $this->output('maintext', 'Es werden maximal ' . formatCash($order->r_amount) . ' Verkaufseinheiten verkaufen!'); return; } // buy $this->myCompany->balance -= $totalPrice; if ($type == 'r') { $this->myRess->{$name} += $amount; } else { $this->myProducts->{$name} += $amount; } $order->r_amount -= $amount; R::begin(); R::store($this->myCompany); R::store($this->myRess); R::store($this->myProducts); if ($order->r_amount <= 0) { R::trash($order); } else { R::store($order); } R::commit(); $this->output('maintext', 'Der Kauf war erfolgreich!'); return; } } $this->output('maintext', '<h3>Fremde ' . ($order->type == 'sell' ? 'Verkauf' : 'Kauf') . 'order</h3> <p>{' . $type . '_' . $name . '}</p> <p>Firma: <b>' . htmlspecialchars($orderCompany->name) . '</b><br /> Preis pro VE: <b>' . formatCash($order->price) . ' {money}</b> <br /> Maximal Verfügbare VE\'s: <b>' . formatCash($order->r_amount) . '</b> </p> <h4>' . ($action == 'buy' ? 'Kaufen' : 'Verkaufen') . '</h4>'); $this->output('form', array('target' => 'action/' . $action . '/' . $name . '/m/' . $order->id, 'elements' => array(array('desc' => 'Menge', 'name' => 'amount', 'type' => 'text')))); }
public function show_Transfer() { $bankAccount = R::findOne('bank_account', ' user_id = ?', array($this->user->id)); if (isset($_POST["amount"]) && is_numeric($_POST["amount"]) && $_POST["amount"] > 0) { $amount = $_POST["amount"]; switch (@$_POST["type"]) { case "put": if ($bankAccount->balance < $amount) { $this->output('maintext', 'Du hast nicht genügend Geld auf deinem Bankkonto'); $this->output('options', array('transfer' => 'Zurück')); return; } $bankAccount->balance -= $amount; $this->company->balance += $amount; R::begin(); R::store($bankAccount); R::store($this->company); R::commit(); break; case "take": if ($this->company->balance < $amount) { $this->output('maintext', 'Es ist nicht genügend Geld auf dem Firmenkonto'); $this->output('options', array('transfer' => 'Zurück')); return; } $bankAccount->balance += $amount; $this->company->balance -= $amount; R::begin(); R::store($bankAccount); R::store($this->company); R::commit(); break; } } $this->output('maintext', 'Du kannst Geld von deinem Bankkonto auf das Firmen-Konto überweisen, oder Geld vom Firmen-Konto auf dein Konto überweisen. <br /><br /> Firmen-Konto: <b>' . formatCash($this->company->balance) . '</b> {money}<br /> Dein Bankkonto: <b>' . formatCash($bankAccount->balance) . ' {money}</b>'); $this->output('form', array('target' => 'transfer', 'elements' => array(array('desc' => "Betrag", 'name' => 'amount', 'type' => 'text'), array('desc' => "Aktion", 'name' => 'type', 'type' => 'select', 'options' => array('put' => 'Von deinem Bankkonto auf das Firmen-Konto überweisen', 'take' => 'Vom Firmen-Konto auf dein Bankkonto buchen'))))); $this->output('options', array('interact' => 'Zurück')); }
public function commit_tx() { \R::commit(); }
} R::freeze(true); try { R::begin(); foreach ($people_array as $people) { $person_old = R::getCell(' SELECT id ' . ' FROM supportsr.esr_frequent_people ' . ' WHERE name = :name ' . ' AND paper_number = :p_number ', [':name' => $people->pname, ':p_number' => $people->pidval]); if (empty($person_old) || $person_old == "") { $person_new = R::getRedBean()->dispense('esr_frequent_people'); $person_new->name = $people->pname; $person_new->paper_type = $people->ptype == '身份证' ? '身份证/Id card' : ($people->ptype == '台胞证' ? '台胞证/Efficiency certificate' : ($people->ptype == '护照' ? '护照/Passport' : ($people->ptype == '港澳通行证' ? '港澳通行证/Hong Kong-Macau passport' : ($people->ptype == '驾驶证' ? '驾驶证/Driving license' : '')))); $person_new->paper_number = $people->pidval; $person_new->comid = $user['organizationname'] . '|*|' . $user['userorganizationid']; $person_new_id = R::store($person_new); } } R::commit(); } catch (Exception $e) { header('Content-type:text/json;charset=utf-8'); echo json_encode(['result' => 'failed', 'error' => 'db error kayako', 'details' => $e->getMessage()]); R::rollback(); die; } R::close(); // Precalc date value $days_as_date = []; foreach ($day_array as $date) { array_push($days_as_date, strtotime($date)); } asort($days_as_date); $start_date_to_post = reset($days_as_date); $end_date_to_post = end($days_as_date);
/** * Test with plus query builder. * * @return void */ public function testWithWithConditionQueryBuilder() { testpack('Test with- and withCondition with Query Builder'); $book = R::dispense('book'); $page = R::dispense('page'); $page->num = 1; $book->ownPage[] = $page; $page = R::dispense('page'); $page->num = 2; $book->ownPage[] = $page; $id = R::store($book); $book = R::load('book', $id); asrt(count($book->ownPage), 2); $book = R::load('book', $id); asrt(count($book->withCondition(' num > 1')->ownPage), 1); $book = R::load('book', $id); asrt(count($book->withCondition(R::$f->begin()->num(' < ?')->put(2))->ownPage), 1); $book = R::load('book', $id); asrt(count($book->with(R::$f->begin()->limit(' 1 '))->ownPage), 1); $book = R::load('book', $id); asrt(count($book->withCondition(R::$f->begin()->num(' < 3'))->ownPage), 2); $book = R::load('book', $id); asrt(count($book->with(R::$f->begin()->limit(' 2 '))->ownPage), 2); testpack('Transaction suppr. in fluid mode'); R::freeze(FALSE); asrt(R::begin(), FALSE); asrt(R::commit(), FALSE); asrt(R::rollback(), FALSE); R::freeze(TRUE); asrt(R::begin(), TRUE); asrt(R::commit(), TRUE); R::freeze(FALSE); }