2 * This file is part of NeverNote
\r
3 * Copyright 2009 Randy Baumgarte
\r
5 * This file may be licensed under the terms of of the
\r
6 * GNU General Public License Version 2 (the ``GPL'').
\r
8 * Software distributed under the License is distributed
\r
9 * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
\r
10 * express or implied. See the GPL for the specific language
\r
11 * governing rights and limitations.
\r
13 * You should have received a copy of the GPL along with this
\r
14 * program. If not, go to http://www.gnu.org/licenses/gpl.html
\r
15 * or write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
21 package cx.fbn.nevernote.sql;
\r
23 import java.util.ArrayList;
\r
24 import java.util.HashMap;
\r
25 import java.util.List;
\r
27 import com.evernote.edam.type.Tag;
\r
28 import com.trolltech.qt.core.QBuffer;
\r
29 import com.trolltech.qt.core.QByteArray;
\r
30 import com.trolltech.qt.core.QIODevice;
\r
31 import com.trolltech.qt.gui.QIcon;
\r
32 import com.trolltech.qt.gui.QImage;
\r
33 import com.trolltech.qt.gui.QPixmap;
\r
35 import cx.fbn.nevernote.sql.driver.NSqlQuery;
\r
36 import cx.fbn.nevernote.utilities.ApplicationLogger;
\r
38 public class TagTable {
\r
39 private final ApplicationLogger logger;
\r
40 DatabaseConnection db;
\r
42 public TagTable (ApplicationLogger l, DatabaseConnection d) {
\r
47 public void createTable() {
\r
49 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
50 logger.log(logger.HIGH, "Creating table Tag...");
\r
51 if (!query.exec("Create table Tag (guid varchar primary key, " +
\r
52 "parentGuid varchar, sequence integer, hashCode integer, name varchar, isDirty boolean)"))
\r
53 logger.log(logger.HIGH, "Table TAG creation FAILED!!!");
\r
57 public void dropTable() {
\r
59 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
60 query.exec("Drop table Tag");
\r
64 public List<Tag> getAll() {
\r
67 List<Tag> index = new ArrayList<Tag>();
\r
70 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
72 check = query.exec("Select guid, parentGuid, sequence, name"
\r
75 logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");
\r
76 logger.log(logger.EXTREME, query.lastError());
\r
78 while (query.next()) {
\r
79 tempTag = new Tag();
\r
80 tempTag.setGuid(query.valueString(0));
\r
81 if (query.valueString(1) != null)
\r
82 tempTag.setParentGuid(query.valueString(1));
\r
84 tempTag.setParentGuid(null);
\r
85 int sequence = new Integer(query.valueString(2)).intValue();
\r
86 tempTag.setUpdateSequenceNum(sequence);
\r
87 tempTag.setName(query.valueString(3));
\r
88 index.add(tempTag);
\r
93 public Tag getTag(String guid) {
\r
94 Tag tempTag = new Tag();
\r
96 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
98 if (!query.prepare("Select guid, parentGuid, sequence, name"
\r
99 +" from Tag where guid=:guid"))
\r
100 logger.log(logger.EXTREME, "Tag select by guid SQL prepare has failed.");
\r
102 query.bindValue(":guid", guid);
\r
104 logger.log(logger.EXTREME, "Tag select by guid SQL exec has failed.");
\r
106 if (!query.next()) {
\r
109 tempTag.setGuid(query.valueString(0));
\r
110 tempTag.setParentGuid(query.valueString(1));
\r
111 int sequence = new Integer(query.valueString(2)).intValue();
\r
112 tempTag.setUpdateSequenceNum(sequence);
\r
113 tempTag.setName(query.valueString(3));
\r
117 public void updateTag(Tag tempTag, boolean isDirty) {
\r
120 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
121 check = query.prepare("Update Tag set parentGuid=:parentGuid, sequence=:sequence, "+
\r
122 "hashCode=:hashCode, name=:name, isDirty=:isDirty "
\r
123 +"where guid=:guid");
\r
126 logger.log(logger.EXTREME, "Tag SQL update prepare has failed.");
\r
127 logger.log(logger.EXTREME, query.lastError());
\r
129 query.bindValue(":parentGuid", tempTag.getParentGuid());
\r
130 query.bindValue(":sequence", tempTag.getUpdateSequenceNum());
\r
131 query.bindValue(":hashCode", tempTag.hashCode());
\r
132 query.bindValue(":name", tempTag.getName());
\r
133 query.bindValue(":isDirty", isDirty);
\r
134 query.bindValue(":guid", tempTag.getGuid());
\r
136 check = query.exec();
\r
138 logger.log(logger.MEDIUM, "Tag Table update failed.");
\r
142 public void expungeTag(String guid, boolean needsSync) {
\r
146 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
148 check = query.prepare("delete from Tag "
\r
149 +"where guid=:guid");
\r
151 logger.log(logger.EXTREME, "Tag SQL delete prepare has failed.");
\r
152 logger.log(logger.EXTREME, query.lastError());
\r
154 query.bindValue(":guid", guid);
\r
155 check = query.exec();
\r
157 logger.log(logger.MEDIUM, "Tag delete failed.");
\r
159 check = query.prepare("delete from NoteTags "
\r
160 +"where tagGuid=:guid");
\r
162 logger.log(logger.EXTREME, "NoteTags SQL delete prepare has failed.");
\r
163 logger.log(logger.EXTREME, query.lastError());
\r
166 query.bindValue(":guid", guid);
\r
167 check = query.exec();
\r
169 logger.log(logger.MEDIUM, "NoteTags delete failed.");
\r
171 // Add the work to the parent queue
\r
173 DeletedTable del = new DeletedTable(logger, db);
\r
174 del.addDeletedItem(guid, "Tag");
\r
178 public void addTag(Tag tempTag, boolean isDirty) {
\r
181 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
182 check = query.prepare("Insert Into Tag (guid, parentGuid, sequence, hashCode, name, isDirty)"
\r
183 +" Values(:guid, :parentGuid, :sequence, :hashCode, :name, :isDirty)");
\r
185 logger.log(logger.EXTREME, "Tag SQL insert prepare has failed.");
\r
186 logger.log(logger.EXTREME, query.lastError());
\r
188 query.bindValue(":guid", tempTag.getGuid());
\r
189 query.bindValue(":parentGuid", tempTag.getParentGuid());
\r
190 query.bindValue(":sequence", tempTag.getUpdateSequenceNum());
\r
191 query.bindValue(":hashCode", tempTag.hashCode());
\r
192 query.bindValue(":name", tempTag.getName());
\r
193 query.bindValue(":isDirty", isDirty);
\r
195 check = query.exec();
\r
197 logger.log(logger.MEDIUM, "Tag Table insert failed.");
\r
198 logger.log(logger.MEDIUM, query.lastError());
\r
201 // Update a tag's parent
\r
202 public void updateTagParent(String guid, String parentGuid) {
\r
205 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
206 check = query.prepare("Update Tag set parentGuid=:parentGuid where guid=:guid");
\r
208 logger.log(logger.EXTREME, "Tag SQL tag parent update prepare has failed.");
\r
209 logger.log(logger.EXTREME, query.lastError());
\r
212 query.bindValue(":parentGuid", parentGuid);
\r
213 query.bindValue(":guid", guid);
\r
215 check = query.exec();
\r
217 logger.log(logger.MEDIUM, "Tag parent update failed.");
\r
218 logger.log(logger.MEDIUM, query.lastError());
\r
221 //Save tags from Evernote
\r
222 public void saveTags(List<Tag> tags) {
\r
224 for (int i=0; i<tags.size(); i++) {
\r
225 tempTag = tags.get(i);
\r
226 addTag(tempTag, false);
\r
229 // Update a tag sequence number
\r
230 public void updateTagSequence(String guid, int sequence) {
\r
232 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
233 check = query.prepare("Update Tag set sequence=:sequence where guid=:guid");
\r
234 query.bindValue(":sequence", sequence);
\r
235 query.bindValue(":guid", guid);
\r
239 logger.log(logger.MEDIUM, "Tag sequence update failed.");
\r
240 logger.log(logger.MEDIUM, query.lastError());
\r
244 // Update a tag sequence number
\r
245 public void updateTagGuid(String oldGuid, String newGuid) {
\r
248 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
249 check = query.prepare("Update Tag set guid=:newGuid where guid=:oldGuid");
\r
250 query.bindValue(":newGuid", newGuid);
\r
251 query.bindValue(":oldGuid", oldGuid);
\r
254 logger.log(logger.MEDIUM, "Tag guid update failed.");
\r
255 logger.log(logger.MEDIUM, query.lastError());
\r
258 check = query.prepare("Update Tag set parentGuid=:newGuid where parentGuid=:oldGuid");
\r
259 query.bindValue(":newGuid", newGuid);
\r
260 query.bindValue(":oldGuid", oldGuid);
\r
263 logger.log(logger.MEDIUM, "Tag guid update failed.");
\r
264 logger.log(logger.MEDIUM, query.lastError());
\r
267 check = query.prepare("Update NoteTags set tagGuid=:newGuid where tagGuid=:oldGuid");
\r
268 query.bindValue(":newGuid", newGuid);
\r
269 query.bindValue(":oldGuid", oldGuid);
\r
272 logger.log(logger.MEDIUM, "Tag guid update failed for NoteTags.");
\r
273 logger.log(logger.MEDIUM, query.lastError());
\r
278 public List<Tag> getDirty() {
\r
280 List<Tag> index = new ArrayList<Tag>();
\r
284 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
286 check = query.exec("Select guid, parentGuid, sequence, name"
\r
287 +" from Tag where isDirty = true");
\r
289 logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");
\r
290 while (query.next()) {
\r
291 tempTag = new Tag();
\r
292 tempTag.setGuid(query.valueString(0));
\r
293 tempTag.setParentGuid(query.valueString(1));
\r
294 int sequence = new Integer(query.valueString(2)).intValue();
\r
295 tempTag.setUpdateSequenceNum(sequence);
\r
296 tempTag.setName(query.valueString(3));
\r
297 if (tempTag.getParentGuid() != null && tempTag.getParentGuid().equals(""))
\r
298 tempTag.setParentGuid(null);
\r
299 index.add(tempTag);
\r
303 // Find a guid based upon the name
\r
304 public String findTagByName(String name) {
\r
306 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
308 query.prepare("Select guid from tag where name=:name");
\r
309 query.bindValue(":name", name);
\r
311 logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");
\r
314 val = query.valueString(0);
\r
317 // given a guid, does the tag exist
\r
318 public boolean exists(String guid) {
\r
320 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
322 query.prepare("Select guid from tag where guid=:guid");
\r
323 query.bindValue(":guid", guid);
\r
325 logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");
\r
326 boolean retval = query.next();
\r
329 // This is a convience method to check if a tag exists & update/create based upon it
\r
330 public void syncTag(Tag tag, boolean isDirty) {
\r
331 if (exists(tag.getGuid()))
\r
332 updateTag(tag, isDirty);
\r
334 addTag(tag, isDirty);
\r
336 public void resetDirtyFlag(String guid) {
\r
338 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
340 query.prepare("Update tag set isdirty=false where guid=:guid");
\r
341 query.bindValue(":guid", guid);
\r
343 logger.log(logger.EXTREME, "Error resetting tag dirty field.");
\r
347 // Get the custom icon
\r
348 public QIcon getIcon(String guid) {
\r
349 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
351 if (!query.prepare("Select icon from tag where guid=:guid"))
\r
352 logger.log(logger.EXTREME, "Error preparing tag icon select.");
\r
353 query.bindValue(":guid", guid);
\r
355 logger.log(logger.EXTREME, "Error finding tag icon.");
\r
356 if (!query.next() || query.getBlob(0) == null)
\r
359 QByteArray blob = new QByteArray(query.getBlob(0));
\r
360 QIcon icon = new QIcon(QPixmap.fromImage(QImage.fromData(blob)));
\r
363 // Set the custom icon
\r
364 public void setIcon(String guid, QIcon icon, String type) {
\r
365 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
366 if (icon == null) {
\r
367 if (!query.prepare("update tag set icon=null where guid=:guid"))
\r
368 logger.log(logger.EXTREME, "Error preparing tag icon update.");
\r
370 if (!query.prepare("update tag set icon=:icon where guid=:guid"))
\r
371 logger.log(logger.EXTREME, "Error preparing tag icon update.");
\r
372 QBuffer buffer = new QBuffer();
\r
373 if (!buffer.open(QIODevice.OpenModeFlag.ReadWrite)) {
\r
374 logger.log(logger.EXTREME, "Failure to open buffer. Aborting.");
\r
377 QPixmap p = icon.pixmap(32, 32);
\r
378 QImage i = p.toImage();
\r
379 i.save(buffer, type.toUpperCase());
\r
381 QByteArray b = new QByteArray(buffer.buffer());
\r
382 if (!b.isNull() && !b.isEmpty())
\r
383 query.bindValue(":icon", b.toByteArray());
\r
387 query.bindValue(":guid", guid);
\r
388 if (!query.exec())
\r
389 logger.log(logger.LOW, "Error setting tag icon. " +query.lastError());
\r
392 // Get a list of all icons
\r
393 public HashMap<String, QIcon> getAllIcons() {
\r
394 HashMap<String, QIcon> values = new HashMap<String, QIcon>();
\r
395 NSqlQuery query = new NSqlQuery(db.getConnection());
\r
397 if (!query.exec("SELECT guid, icon from tag"))
\r
398 logger.log(logger.EXTREME, "Error executing SavedSearch getAllIcons select.");
\r
399 while (query.next()) {
\r
400 if (query.getBlob(1) != null) {
\r
401 String guid = query.valueString(0);
\r
402 QByteArray blob = new QByteArray(query.getBlob(1));
\r
403 QIcon icon = new QIcon(QPixmap.fromImage(QImage.fromData(blob)));
\r
404 values.put(guid, icon);
\r