File indexing completed on 2025-03-09 03:54:59
0001 /* ============================================================ 0002 * 0003 * This file is a part of digiKam project 0004 * https://www.digikam.org 0005 * 0006 * Date : 2010-10-12 0007 * Description : Convenience object for grouping database operations 0008 * 0009 * SPDX-FileCopyrightText: 2010 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de> 0010 * 0011 * SPDX-License-Identifier: GPL-2.0-or-later 0012 * 0013 * ============================================================ */ 0014 0015 #include "facedboperationgroup.h" 0016 0017 // Qt includes 0018 0019 #include <QElapsedTimer> 0020 0021 // Local includes 0022 0023 #include "facedbaccess.h" 0024 #include "facedbbackend.h" 0025 0026 namespace Digikam 0027 { 0028 0029 class Q_DECL_HIDDEN FaceDbOperationGroup::Private 0030 { 0031 public: 0032 0033 explicit Private() 0034 : dbAccess(nullptr), 0035 acquired(false), 0036 maxTime (0) 0037 { 0038 } 0039 0040 public: 0041 0042 FaceDbAccess* dbAccess; 0043 bool acquired; 0044 QElapsedTimer timeAcquired; 0045 int maxTime; 0046 0047 public: 0048 0049 bool needsTransaction() const 0050 { 0051 return FaceDbAccess().parameters().isSQLite(); 0052 } 0053 0054 void acquire() 0055 { 0056 if (dbAccess) 0057 { 0058 acquired = dbAccess->backend()->beginTransaction(); 0059 } 0060 else 0061 { 0062 FaceDbAccess dbAccess; 0063 acquired = dbAccess.backend()->beginTransaction(); 0064 } 0065 0066 timeAcquired.start(); 0067 } 0068 0069 void release() 0070 { 0071 if (acquired) 0072 { 0073 if (dbAccess) 0074 { 0075 dbAccess->backend()->commitTransaction(); 0076 } 0077 else 0078 { 0079 FaceDbAccess dbAccess; 0080 dbAccess.backend()->commitTransaction(); 0081 } 0082 } 0083 } 0084 }; 0085 0086 // ----------------------------------------------------------------------- 0087 0088 FaceDbOperationGroup::FaceDbOperationGroup() 0089 : d(new Private) 0090 { 0091 if (d->needsTransaction()) 0092 { 0093 d->acquire(); 0094 } 0095 } 0096 0097 FaceDbOperationGroup::FaceDbOperationGroup(FaceDbAccess* const dbAccess) 0098 : d(new Private) 0099 { 0100 d->dbAccess = dbAccess; 0101 0102 if (d->needsTransaction()) 0103 { 0104 d->acquire(); 0105 } 0106 } 0107 0108 FaceDbOperationGroup::~FaceDbOperationGroup() 0109 { 0110 d->release(); 0111 delete d; 0112 } 0113 0114 void FaceDbOperationGroup::lift() 0115 { 0116 if (d->acquired) 0117 { 0118 d->release(); 0119 0120 if (d->dbAccess) 0121 { 0122 FaceDbAccessUnlock unlock(d->dbAccess); 0123 } 0124 0125 d->acquire(); 0126 } 0127 } 0128 0129 void FaceDbOperationGroup::setMaximumTime(int msecs) 0130 { 0131 d->maxTime = msecs; 0132 } 0133 0134 void FaceDbOperationGroup::resetTime() 0135 { 0136 d->timeAcquired.start(); 0137 } 0138 0139 void FaceDbOperationGroup::allowLift() 0140 { 0141 if (d->maxTime && (d->timeAcquired.elapsed() > d->maxTime)) 0142 { 0143 lift(); 0144 } 0145 } 0146 0147 } // namespace Digikam