1 /* ============================================================
2  *
3  * This file is a part of digiKam project
4  * https://www.digikam.org
5  *
6  * Date        : 2009-06-07
7  * Description : Core database abstract backend.
8  *
9  * Copyright (C) 2007-2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10  * Copyright (C) 2010-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
11  *
12  * This program is free software; you can redistribute it
13  * and/or modify it under the terms of the GNU General
14  * Public License as published by the Free Software Foundation;
15  * either version 2, or (at your option)
16  * any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * ============================================================ */
24 
25 #ifndef DIGIKAM_CORE_DB_BACKEND_PRIVATE_H
26 #define DIGIKAM_CORE_DB_BACKEND_PRIVATE_H
27 
28 // Local includes
29 
30 #include "dbenginebackend_p.h"
31 #include "coredbwatch.h"
32 
33 namespace Digikam
34 {
35 
36 class CoreDbWatch;
37 
38 class Q_DECL_HIDDEN CoreDbBackendPrivate : public BdEngineBackendPrivate
39 {
40 public:
41 
CoreDbBackendPrivate(CoreDbBackend * const backend)42     explicit CoreDbBackendPrivate(CoreDbBackend* const backend)
43         : BdEngineBackendPrivate            (backend),
44           watch                             (nullptr),
45           imageChangesetContainer           (this),
46           imageTagChangesetContainer        (this),
47           collectionImageChangesetContainer (this),
48           albumChangesetContainer           (this),
49           tagChangesetContainer             (this),
50           albumRootChangesetContainer       (this),
51           searchChangesetContainer          (this)
52     {
53     }
54 
55 public:
56 
57     CoreDbWatch* watch;
58 
59 public:
60 
sendToWatch(const ImageChangeset & changeset)61     void sendToWatch(const ImageChangeset& changeset)
62     {
63         watch->sendImageChange(changeset);
64     }
65 
sendToWatch(const ImageTagChangeset & changeset)66     void sendToWatch(const ImageTagChangeset& changeset)
67     {
68         watch->sendImageTagChange(changeset);
69     }
70 
sendToWatch(const CollectionImageChangeset & changeset)71     void sendToWatch(const CollectionImageChangeset& changeset)
72     {
73         watch->sendCollectionImageChange(changeset);
74     }
75 
sendToWatch(const AlbumChangeset & changeset)76     void sendToWatch(const AlbumChangeset& changeset)
77     {
78         watch->sendAlbumChange(changeset);
79     }
80 
sendToWatch(const TagChangeset & changeset)81     void sendToWatch(const TagChangeset& changeset)
82     {
83         watch->sendTagChange(changeset);
84     }
85 
sendToWatch(const AlbumRootChangeset & changeset)86     void sendToWatch(const AlbumRootChangeset& changeset)
87     {
88         watch->sendAlbumRootChange(changeset);
89     }
90 
sendToWatch(const SearchChangeset & changeset)91     void sendToWatch(const SearchChangeset& changeset)
92     {
93         watch->sendSearchChange(changeset);
94     }
95 
96     template <class T>
97     class Q_DECL_HIDDEN ChangesetContainer
98     {
99     public:
100 
ChangesetContainer(CoreDbBackendPrivate * const dd)101         explicit ChangesetContainer(CoreDbBackendPrivate* const dd)
102             : d(dd)
103         {
104         }
105 
recordChangeset(const T & changeset)106         void recordChangeset(const T& changeset)
107         {
108             if (d->isInTransaction)
109             {
110                 changesets << changeset;
111             }
112             else
113             {
114                 d->sendToWatch(changeset);
115             }
116         }
117 
sendOut()118         void sendOut()
119         {
120             foreach (const T& changeset, changesets)
121             {
122                 d->sendToWatch(changeset);
123             }
124 
125             changesets.clear();
126         }
127 
128     public:
129 
130         QList<T>                    changesets;
131         CoreDbBackendPrivate* const d;
132     };
133 
134 public:
135 
136     ChangesetContainer<ImageChangeset>           imageChangesetContainer;
137     ChangesetContainer<ImageTagChangeset>        imageTagChangesetContainer;
138     ChangesetContainer<CollectionImageChangeset> collectionImageChangesetContainer;
139     ChangesetContainer<AlbumChangeset>           albumChangesetContainer;
140     ChangesetContainer<TagChangeset>             tagChangesetContainer;
141     ChangesetContainer<AlbumRootChangeset>       albumRootChangesetContainer;
142     ChangesetContainer<SearchChangeset>          searchChangesetContainer;
143 
144 public:
145 
transactionFinished()146     void transactionFinished() override
147     {
148         BdEngineBackendPrivate::transactionFinished();
149 
150         imageChangesetContainer.sendOut();
151         imageTagChangesetContainer.sendOut();
152         collectionImageChangesetContainer.sendOut();
153         albumChangesetContainer.sendOut();
154         tagChangesetContainer.sendOut();
155         albumRootChangesetContainer.sendOut();
156         searchChangesetContainer.sendOut();
157     }
158 };
159 
160 } // namespace Digikam
161 
162 #endif // DIGIKAM_CORE_DB_BACKEND_PRIVATE_H
163