1dfe32fa1Soh_ci/*
2dfe32fa1Soh_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3dfe32fa1Soh_ci * Licensed under the Apache License, Version 2.0 (the "License");
4dfe32fa1Soh_ci * you may not use this file except in compliance with the License.
5dfe32fa1Soh_ci * You may obtain a copy of the License at
6dfe32fa1Soh_ci *
7dfe32fa1Soh_ci *     http://www.apache.org/licenses/LICENSE-2.0
8dfe32fa1Soh_ci *
9dfe32fa1Soh_ci * Unless required by applicable law or agreed to in writing, software
10dfe32fa1Soh_ci * distributed under the License is distributed on an "AS IS" BASIS,
11dfe32fa1Soh_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12dfe32fa1Soh_ci * See the License for the specific language governing permissions and
13dfe32fa1Soh_ci * limitations under the License.
14dfe32fa1Soh_ci */
15dfe32fa1Soh_ci
16dfe32fa1Soh_ci//! This module is used to implement database transactions.
17dfe32fa1Soh_ci//! Transaction is auto rollback if not commit by RAII.
18dfe32fa1Soh_ci
19dfe32fa1Soh_ciuse asset_definition::Result;
20dfe32fa1Soh_ci
21dfe32fa1Soh_ciuse crate::database::Database;
22dfe32fa1Soh_ci
23dfe32fa1Soh_ci/// Transaction for sqlite db
24dfe32fa1Soh_ci#[repr(C)]
25dfe32fa1Soh_cipub struct Transaction<'a> {
26dfe32fa1Soh_ci    db: &'a Database,
27dfe32fa1Soh_ci}
28dfe32fa1Soh_ci
29dfe32fa1Soh_ciimpl<'a> Transaction<'a> {
30dfe32fa1Soh_ci    /// Create a transaction instance.
31dfe32fa1Soh_ci    pub(crate) fn new(db: &'a Database) -> Transaction<'a> {
32dfe32fa1Soh_ci        Transaction { db }
33dfe32fa1Soh_ci    }
34dfe32fa1Soh_ci
35dfe32fa1Soh_ci    /// Begin a database transaction.
36dfe32fa1Soh_ci    /// Once the transaction is begun, the caller must call the rollback or commit function later.
37dfe32fa1Soh_ci    pub(crate) fn begin(&mut self) -> Result<()> {
38dfe32fa1Soh_ci        self.db.exec("begin transaction")
39dfe32fa1Soh_ci    }
40dfe32fa1Soh_ci
41dfe32fa1Soh_ci    /// Rollback the database transaction.
42dfe32fa1Soh_ci    pub(crate) fn rollback(self) -> Result<()> {
43dfe32fa1Soh_ci        self.db.exec("rollback")
44dfe32fa1Soh_ci    }
45dfe32fa1Soh_ci
46dfe32fa1Soh_ci    /// Commit the database transaction.
47dfe32fa1Soh_ci    pub(crate) fn commit(self) -> Result<()> {
48dfe32fa1Soh_ci        self.db.exec("commit")
49dfe32fa1Soh_ci    }
50dfe32fa1Soh_ci}
51