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