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