| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 /* |  | 
| 2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved. |  | 
| 3  * |  | 
| 4  * Redistribution and use in source and binary forms, with or without |  | 
| 5  * modification, are permitted provided that the following conditions |  | 
| 6  * are met: |  | 
| 7  * 1. Redistributions of source code must retain the above copyright |  | 
| 8  *    notice, this list of conditions and the following disclaimer. |  | 
| 9  * 2. Redistributions in binary form must reproduce the above copyright |  | 
| 10  *    notice, this list of conditions and the following disclaimer in the |  | 
| 11  *    documentation and/or other materials provided with the distribution. |  | 
| 12  * |  | 
| 13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |  | 
| 14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |  | 
| 15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |  | 
| 16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR |  | 
| 17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |  | 
| 18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |  | 
| 19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |  | 
| 20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |  | 
| 21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |  | 
| 22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |  | 
| 23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |  | 
| 24  */ |  | 
| 25 |  | 
| 26 #include "config.h" |  | 
| 27 #include "core/platform/sql/SQLiteTransaction.h" |  | 
| 28 |  | 
| 29 #include "core/platform/sql/SQLiteDatabase.h" |  | 
| 30 |  | 
| 31 namespace WebCore { |  | 
| 32 |  | 
| 33 SQLiteTransaction::SQLiteTransaction(SQLiteDatabase& db, bool readOnly) |  | 
| 34     : m_db(db) |  | 
| 35     , m_inProgress(false) |  | 
| 36     , m_readOnly(readOnly) |  | 
| 37 { |  | 
| 38 } |  | 
| 39 |  | 
| 40 SQLiteTransaction::~SQLiteTransaction() |  | 
| 41 { |  | 
| 42     if (m_inProgress) |  | 
| 43         rollback(); |  | 
| 44 } |  | 
| 45 |  | 
| 46 void SQLiteTransaction::begin() |  | 
| 47 { |  | 
| 48     if (!m_inProgress) { |  | 
| 49         ASSERT(!m_db.m_transactionInProgress); |  | 
| 50         // Call BEGIN IMMEDIATE for a write transaction to acquire |  | 
| 51         // a RESERVED lock on the DB file. Otherwise, another write |  | 
| 52         // transaction (on another connection) could make changes |  | 
| 53         // to the same DB file before this transaction gets to execute |  | 
| 54         // any statements. If that happens, this transaction will fail. |  | 
| 55         // http://www.sqlite.org/lang_transaction.html |  | 
| 56         // http://www.sqlite.org/lockingv3.html#locking |  | 
| 57         if (m_readOnly) |  | 
| 58             m_inProgress = m_db.executeCommand("BEGIN"); |  | 
| 59         else |  | 
| 60             m_inProgress = m_db.executeCommand("BEGIN IMMEDIATE"); |  | 
| 61         m_db.m_transactionInProgress = m_inProgress; |  | 
| 62     } |  | 
| 63 } |  | 
| 64 |  | 
| 65 void SQLiteTransaction::commit() |  | 
| 66 { |  | 
| 67     if (m_inProgress) { |  | 
| 68         ASSERT(m_db.m_transactionInProgress); |  | 
| 69         m_inProgress = !m_db.executeCommand("COMMIT"); |  | 
| 70         m_db.m_transactionInProgress = m_inProgress; |  | 
| 71     } |  | 
| 72 } |  | 
| 73 |  | 
| 74 void SQLiteTransaction::rollback() |  | 
| 75 { |  | 
| 76     // We do not use the 'm_inProgress = m_db.executeCommand("ROLLBACK")' constr
     uct here, |  | 
| 77     // because m_inProgress should always be set to false after a ROLLBACK, and |  | 
| 78     // m_db.executeCommand("ROLLBACK") can sometimes harmlessly fail, thus retur
     ning |  | 
| 79     // a non-zero/true result (http://www.sqlite.org/lang_transaction.html). |  | 
| 80     if (m_inProgress) { |  | 
| 81         ASSERT(m_db.m_transactionInProgress); |  | 
| 82         m_db.executeCommand("ROLLBACK"); |  | 
| 83         m_inProgress = false; |  | 
| 84         m_db.m_transactionInProgress = false; |  | 
| 85     } |  | 
| 86 } |  | 
| 87 |  | 
| 88 void SQLiteTransaction::stop() |  | 
| 89 { |  | 
| 90     if (m_inProgress) { |  | 
| 91         m_inProgress = false; |  | 
| 92         m_db.m_transactionInProgress = false; |  | 
| 93     } |  | 
| 94 } |  | 
| 95 |  | 
| 96 bool SQLiteTransaction::wasRolledBackBySqlite() const |  | 
| 97 { |  | 
| 98     // According to http://www.sqlite.org/c3ref/get_autocommit.html, |  | 
| 99     // the auto-commit flag should be off in the middle of a transaction |  | 
| 100     return m_inProgress && m_db.isAutoCommitOn(); |  | 
| 101 } |  | 
| 102 |  | 
| 103 } // namespace WebCore |  | 
| OLD | NEW | 
|---|