OSDN Git Service

Split jazzy into a separate jar and add the ability to index MicroSoft & PDF document...
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / sql / NotebookTable.java
1 /*\r
2  * This file is part of NeverNote \r
3  * Copyright 2009 Randy Baumgarte\r
4  * \r
5  * This file may be licensed under the terms of of the\r
6  * GNU General Public License Version 2 (the ``GPL'').\r
7  *\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
12  *\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
17  *\r
18 */\r
19 \r
20 \r
21 package cx.fbn.nevernote.sql;\r
22 \r
23 import java.text.DateFormat;\r
24 import java.text.ParseException;\r
25 import java.text.SimpleDateFormat;\r
26 import java.util.ArrayList;\r
27 import java.util.HashMap;\r
28 import java.util.List;\r
29 \r
30 import com.evernote.edam.type.NoteSortOrder;\r
31 import com.evernote.edam.type.Notebook;\r
32 import com.evernote.edam.type.Publishing;\r
33 import com.trolltech.qt.core.QBuffer;\r
34 import com.trolltech.qt.core.QByteArray;\r
35 import com.trolltech.qt.core.QIODevice;\r
36 import com.trolltech.qt.gui.QIcon;\r
37 import com.trolltech.qt.gui.QImage;\r
38 import com.trolltech.qt.gui.QPixmap;\r
39 \r
40 import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
41 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
42 import cx.fbn.nevernote.utilities.Pair;\r
43 \r
44 public class NotebookTable {\r
45         \r
46         private final ApplicationLogger                 logger;\r
47         DatabaseConnection                                                      db;\r
48         \r
49         // Constructor\r
50         public NotebookTable(ApplicationLogger l, DatabaseConnection d) {\r
51                 logger = l;\r
52                 db = d;\r
53         }\r
54         // Create the table\r
55         public void createTable() {\r
56                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
57         logger.log(logger.HIGH, "Creating table Notebook...");\r
58         if (!query.exec("Create table Notebook (guid varchar primary key, " +\r
59                         "sequence integer, " +\r
60                         "name varchar, "+\r
61                         "defaultNotebook varchar, "+\r
62                         "serviceCreated timestamp, " +\r
63                         "serviceUpdated timestamp, "+\r
64                         "published boolean, "+\r
65                         "isDirty boolean, "+\r
66                         "autoEncrypt boolean, "+\r
67                         "readOnly boolean, " +\r
68                         "local boolean, "+\r
69                         "archived boolean)"))                           \r
70                 logger.log(logger.HIGH, "Table Notebook creation FAILED!!!");   \r
71         Notebook newnote = new Notebook();\r
72         newnote.setDefaultNotebook(true);\r
73         newnote.setName("My Notebook");\r
74         newnote.setPublished(false);\r
75         newnote.setGuid("1");\r
76         \r
77         // Setup an initial notebook\r
78                 SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
79         query = new NSqlQuery(db.getConnection());\r
80                 query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
81                                 +"serviceCreated, serviceUpdated, published, "   \r
82                                 + "isDirty, autoEncrypt, readOnly, " \r
83                                 + "local, archived) Values("\r
84                                 +":guid, :sequence, :name, :defaultNotebook,  "\r
85                                 +":serviceCreated, :serviceUpdated, :published, "\r
86                                 +":isDirty, :autoEncrypt, :readOnly, "\r
87                                 +":local, false)");\r
88                 query.bindValue(":guid", newnote.getGuid());\r
89                 query.bindValue(":sequence", newnote.getUpdateSequenceNum());\r
90                 query.bindValue(":name", newnote.getName());\r
91                 query.bindValue(":defaultNotebook", newnote.isDefaultNotebook());\r
92                 \r
93                 StringBuilder serviceCreated = new StringBuilder(simple.format(newnote.getServiceCreated()));                   \r
94                 StringBuilder serviceUpdated = new StringBuilder(simple.format(newnote.getServiceUpdated()));\r
95                 if (serviceUpdated.toString() == null)\r
96                         serviceUpdated = serviceCreated;\r
97                 query.bindValue(":serviceCreated", serviceCreated.toString());\r
98                 query.bindValue(":serviceUpdated", serviceCreated.toString());\r
99                 query.bindValue(":published",newnote.isPublished());\r
100                 \r
101                 query.bindValue(":isDirty", true);\r
102                 query.bindValue(":autoEncrypt", false);\r
103                 query.bindValue(":local", false);\r
104                 query.bindValue(":readOnly", false);\r
105 \r
106                 boolean check = query.exec();\r
107                 if (!check) {\r
108                         logger.log(logger.MEDIUM, "Initial Notebook Table insert failed.");\r
109                         logger.log(logger.MEDIUM, query.lastError().toString());\r
110                 }\r
111 \r
112                 \r
113         }\r
114         // Drop the table\r
115         public void dropTable() {\r
116                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
117                 query.exec("Drop table Notebook");\r
118         }\r
119         // Save an individual notebook\r
120         public void addNotebook(Notebook tempNotebook, boolean isDirty, boolean local) {\r
121                 boolean check;\r
122                 \r
123                 SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
124         NSqlQuery query = new NSqlQuery(db.getConnection());\r
125                 check = query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
126                                 +"serviceCreated, serviceUpdated, published, "   \r
127                                 + "isDirty, autoEncrypt, stack, " \r
128                                 + "local, archived, readOnly) Values("\r
129                                 +":guid, :sequence, :name, :defaultNotebook,  "\r
130                                 +":serviceCreated, :serviceUpdated, :published, "\r
131                                 +":isDirty, :autoEncrypt, "\r
132                                 +":stack, :local, false, false)");\r
133                 query.bindValue(":guid", tempNotebook.getGuid());\r
134                 query.bindValue(":sequence", tempNotebook.getUpdateSequenceNum());\r
135                 query.bindValue(":name", tempNotebook.getName());\r
136                 query.bindValue(":defaultNotebook", tempNotebook.isDefaultNotebook());\r
137                 \r
138                 StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                      \r
139                 StringBuilder serviceUpdated = new StringBuilder(simple.format(tempNotebook.getServiceUpdated()));\r
140                 if (serviceUpdated.toString() == null)\r
141                         serviceUpdated = serviceCreated;\r
142                 query.bindValue(":serviceCreated", serviceCreated.toString());\r
143                 query.bindValue(":serviceUpdated", serviceCreated.toString());\r
144                 query.bindValue(":published",tempNotebook.isPublished());\r
145                 \r
146                 if (isDirty)\r
147                         query.bindValue(":isDirty", true);\r
148                 else\r
149                         query.bindValue(":isDirty", false);\r
150                 query.bindValue(":autoEncrypt", false);\r
151                 query.bindValue(":local", local);\r
152                 query.bindValue(":stack", tempNotebook.getStack());\r
153 \r
154                 check = query.exec();\r
155                 if (!check) {\r
156                         logger.log(logger.MEDIUM, "Notebook Table insert failed.");\r
157                         logger.log(logger.MEDIUM, query.lastError().toString());\r
158                 }\r
159         }\r
160         // Delete the notebook based on a guid\r
161         public void expungeNotebook(String guid, boolean needsSync) {\r
162                 boolean check;\r
163         NSqlQuery query = new NSqlQuery(db.getConnection());\r
164 \r
165         check = query.prepare("delete from Notebook "\r
166                                 +"where guid=:guid");\r
167                 if (!check) {\r
168                         logger.log(logger.EXTREME, "Notebook SQL delete prepare has failed.");\r
169                         logger.log(logger.EXTREME, query.lastError().toString());\r
170                 }\r
171                 query.bindValue(":guid", guid);\r
172                 check = query.exec();\r
173                 if (!check) \r
174                         logger.log(logger.MEDIUM, "Notebook delete failed.");\r
175                 \r
176                 // Signal the parent that work needs to be done\r
177                 if  (needsSync) {\r
178                         DeletedTable deletedTable = new DeletedTable(logger, db);\r
179                         deletedTable.addDeletedItem(guid, "Notebook");\r
180                 }\r
181         }\r
182         // Update a notebook\r
183         public void updateNotebook(Notebook tempNotebook, boolean isDirty) {\r
184                 boolean check;\r
185                 \r
186                 SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
187                 \r
188         NSqlQuery query = new NSqlQuery(db.getConnection());\r
189         check = query.prepare("Update Notebook set sequence=:sequence, name=:name, defaultNotebook=:defaultNotebook, " +\r
190                         "serviceCreated=:serviceCreated, serviceUpdated=:serviceUpdated, "+\r
191                                 "published=:published, isDirty=:isDirty, publishinguri=:uri, "+\r
192                                 "publishingOrder=:order, " + \r
193                                 "publishingAscending=:ascending, " +\r
194                                 "publishingPublicDescription=:desc " +\r
195                                 "where guid=:guid ");\r
196         \r
197                 query.bindValue(":sequence", tempNotebook.getUpdateSequenceNum());\r
198                 query.bindValue(":name", tempNotebook.getName());\r
199                 query.bindValue(":defaultNotebook", tempNotebook.isDefaultNotebook());\r
200 \r
201                 StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                      \r
202                 StringBuilder serviceUpdated = new StringBuilder(simple.format(tempNotebook.getServiceUpdated()));                      \r
203                 query.bindValue(":serviceCreated", serviceCreated.toString());\r
204                 query.bindValue(":serviceUpdated", serviceUpdated.toString());\r
205                 \r
206                 query.bindValue(":published", tempNotebook.isPublished());\r
207                 query.bindValue(":isDirty", isDirty);\r
208                 \r
209                 if (tempNotebook.isPublished()) {\r
210                         query.bindValue(":uri", tempNotebook.getPublishing().getUri());\r
211                         query.bindValue(":order", tempNotebook.getPublishing().getOrder().getValue());\r
212                         query.bindValue(":ascending", tempNotebook.getPublishing().isAscending());\r
213                         query.bindValue(":desc", tempNotebook.getPublishing().getPublicDescription());\r
214                 } else {\r
215                         query.bindValue(":uri", "");\r
216                         query.bindValue(":order", NoteSortOrder.CREATED.getValue());\r
217                         query.bindValue(":ascending", false);\r
218                         query.bindValue(":desc", "");\r
219                 }\r
220                 \r
221                 query.bindValue(":guid", tempNotebook.getGuid());\r
222                 \r
223                 check = query.exec();\r
224                 if (!check) {\r
225                         logger.log(logger.MEDIUM, "Notebook Table update failed.");\r
226                         logger.log(logger.MEDIUM, query.lastError().toString());\r
227                 }\r
228         }\r
229         // Load notebooks from the database\r
230         public List<Notebook> getAll() {\r
231                 Notebook tempNotebook;\r
232                 List<Notebook> index = new ArrayList<Notebook>();\r
233                 boolean check;\r
234                                         \r
235         NSqlQuery query = new NSqlQuery(db.getConnection());\r
236                                         \r
237                 check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
238                                 "serviceCreated, "+\r
239                                 "serviceUpdated, "+\r
240                                 "published, stack, publishinguri, publishingascending, publishingPublicDescription, "+\r
241                                 "publishingOrder from Notebook order by name");\r
242                 if (!check)\r
243                         logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
244                 while (query.next()) {\r
245                         tempNotebook = new Notebook();\r
246                         tempNotebook.setGuid(query.valueString(0));\r
247                         int sequence = new Integer(query.valueString(1)).intValue();\r
248                         tempNotebook.setUpdateSequenceNum(sequence);\r
249                         tempNotebook.setName(query.valueString(2));\r
250                         tempNotebook.setDefaultNotebook(query.valueBoolean(3, false));\r
251                         DateFormat indfm = null;\r
252                         try {\r
253                                 indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
254 //                              indfm = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");\r
255                         } catch (Exception e) { }\r
256                         try {\r
257                                 tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
258                                 tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
259                         } catch (ParseException e) {\r
260                                 e.printStackTrace();\r
261                         }\r
262                         tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
263                         tempNotebook.setStack(query.valueString(7));\r
264                         if (tempNotebook.isPublished()) {\r
265                                 Publishing p = new Publishing();\r
266                                 p.setUri(query.valueString(8));\r
267                                 p.setAscending(query.valueBoolean(9, false));\r
268                                 p.setPublicDescription(query.valueString(10));\r
269                                 p.setOrder(NoteSortOrder.findByValue(query.valueInteger(11)));\r
270                                 tempNotebook.setPublishing(p);\r
271                         }\r
272                         index.add(tempNotebook); \r
273                 }       \r
274                 return index;\r
275         }       \r
276         public List<Notebook> getAllLocal() {\r
277                 Notebook tempNotebook;\r
278                 List<Notebook> index = new ArrayList<Notebook>();\r
279                 boolean check;\r
280 \r
281         NSqlQuery query = new NSqlQuery(db.getConnection());\r
282                                         \r
283                 check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
284                                 "serviceCreated, serviceUpdated, published, stack from Notebook where local=true order by name");\r
285                 if (!check)\r
286                         logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
287                 while (query.next()) {\r
288                         tempNotebook = new Notebook();\r
289                         tempNotebook.setGuid(query.valueString(0));\r
290                         int sequence = new Integer(query.valueString(1)).intValue();\r
291                         tempNotebook.setUpdateSequenceNum(sequence);\r
292                         tempNotebook.setName(query.valueString(2));\r
293                         \r
294                         DateFormat indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
295 //                      indfm = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");\r
296                         try {\r
297                                 tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
298                                 tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
299                         } catch (ParseException e) {\r
300                                 e.printStackTrace();\r
301                         }\r
302                         tempNotebook.setStack(query.valueString(7));\r
303                         index.add(tempNotebook); \r
304                 }       \r
305                 return index;\r
306         }\r
307         // Archive or un-archive a notebook\r
308         public void setArchived(String guid, boolean val) {\r
309                 boolean check;                  \r
310         NSqlQuery query = new NSqlQuery(db.getConnection());                                    \r
311                 check = query.prepare("Update notebook set archived=:archived where guid=:guid");\r
312                 if (!check)\r
313                         logger.log(logger.EXTREME, "Notebook SQL archive update has failed.");\r
314                 query.bindValue(":guid", guid);\r
315                 query.bindValue(":archived", val);\r
316                 query.exec();\r
317         }\r
318         // Load non-archived notebooks from the database\r
319         public List<Notebook> getAllArchived() {\r
320                 Notebook tempNotebook;\r
321                 List<Notebook> index = new ArrayList<Notebook>();\r
322                 boolean check;\r
323                                                 \r
324         NSqlQuery query = new NSqlQuery(db.getConnection());\r
325                                         \r
326                 check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
327                                 "serviceCreated, serviceUpdated, published, stack "+\r
328                                 "publishinguri, publishingascending, publishingPublicDescription, "+\r
329                                 "publishingOrder " +\r
330                                 "from Notebook where archived=true order by name");\r
331                 if (!check)\r
332                         logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
333                 while (query.next()) {\r
334                         tempNotebook = new Notebook();\r
335                         tempNotebook.setGuid(query.valueString(0));\r
336                         int sequence = new Integer(query.valueString(1)).intValue();\r
337                         tempNotebook.setUpdateSequenceNum(sequence);\r
338                         tempNotebook.setName(query.valueString(2));\r
339                         \r
340                         DateFormat indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
341 //                      indfm = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");\r
342                         try {\r
343                                 tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
344                                 tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
345                         } catch (ParseException e) {\r
346                                 e.printStackTrace();\r
347                         }\r
348                         tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
349                         tempNotebook.setStack(query.valueString(7));\r
350                         \r
351                         if (tempNotebook.isPublished()) {\r
352                                 Publishing p = new Publishing();\r
353                                 p.setUri(query.valueString(8));\r
354                                 p.setAscending(query.valueBoolean(9, false));\r
355                                 p.setPublicDescription(query.valueString(10));\r
356                                 p.setOrder(NoteSortOrder.findByValue(query.valueInteger(11)));\r
357                                 tempNotebook.setPublishing(p);\r
358                         }\r
359                         \r
360                         index.add(tempNotebook); \r
361                 }       \r
362                 return index;\r
363         }       \r
364         // Check for a local/remote notebook\r
365         public boolean isNotebookLocal(String guid) {\r
366         NSqlQuery query = new NSqlQuery(db.getConnection());\r
367                 \r
368                 query.prepare("Select local from Notebook where guid=:guid");\r
369                 query.bindValue(":guid", guid);\r
370                 query.exec();\r
371                 if (!query.next()) {\r
372                         return false;\r
373                 }\r
374                 boolean returnValue = query.valueBoolean(0, false);\r
375                 return returnValue;\r
376         }\r
377         public boolean isReadOnly(String guid) {\r
378         NSqlQuery query = new NSqlQuery(db.getConnection());\r
379                 \r
380                 query.prepare("Select readOnly from Notebook where guid=:guid");\r
381                 query.bindValue(":guid", guid);\r
382                 query.exec();\r
383                 if (!query.next()) {\r
384                         return false;\r
385                 }\r
386                 boolean returnValue = query.valueBoolean(0, false);\r
387                 return returnValue;\r
388         }\r
389         // Update a notebook sequence number\r
390         public void updateNotebookSequence(String guid, int sequence) {\r
391                 boolean check;\r
392         NSqlQuery query = new NSqlQuery(db.getConnection());\r
393                 check = query.prepare("Update Notebook set sequence=:sequence where guid=:guid");\r
394                 query.bindValue(":guid", guid);\r
395                 query.bindValue(":sequence", sequence);\r
396                 query.exec();\r
397                 if (!check) {\r
398                         logger.log(logger.MEDIUM, "Notebook sequence update failed.");\r
399                         logger.log(logger.MEDIUM, query.lastError());\r
400                 } \r
401         }\r
402         // Update a notebook GUID number\r
403         public void updateNotebookGuid(String oldGuid, String newGuid) {\r
404         NSqlQuery query = new NSqlQuery(db.getConnection());\r
405                 query.prepare("Update Notebook set guid=:newGuid where guid=:oldGuid");\r
406                 query.bindValue(":oldGuid", oldGuid);\r
407                 query.bindValue(":newGuid", newGuid);\r
408                 if (!query.exec()) {\r
409                         logger.log(logger.MEDIUM, "Notebook guid update failed.");\r
410                         logger.log(logger.MEDIUM, query.lastError());\r
411                 } \r
412                 \r
413                 // Update any notes containing the notebook guid\r
414                 query.prepare("Update Note set notebookGuid=:newGuid where notebookGuid=:oldGuid");\r
415                 query.bindValue(":oldGuid", oldGuid);\r
416                 query.bindValue(":newGuid", newGuid);\r
417                 if (!query.exec()) {\r
418                         logger.log(logger.MEDIUM, "Notebook guid update for note failed.");\r
419                         logger.log(logger.MEDIUM, query.lastError());\r
420                 } \r
421                 \r
422                 // Update any watch folders with the new guid\r
423                 query = new NSqlQuery(db.getConnection());\r
424                 query.prepare("Update WatchFolders set notebook=:newGuid where notebook=:oldGuid");\r
425                 query.bindValue(":oldGuid", oldGuid);\r
426                 query.bindValue(":newGuid", newGuid);\r
427                 if (!query.exec()) {\r
428                         logger.log(logger.MEDIUM, "Update WatchFolder notebook failed.");\r
429                         logger.log(logger.MEDIUM, query.lastError().toString());\r
430                 }               \r
431         }\r
432         // Get a list of notes that need to be updated\r
433         public List <Notebook> getDirty() {\r
434                 Notebook tempNotebook;\r
435                 List<Notebook> index = new ArrayList<Notebook>();\r
436                 boolean check;\r
437                                                 \r
438                 \r
439         NSqlQuery query = new NSqlQuery(db.getConnection());\r
440                                         \r
441                 check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
442                                 "serviceCreated, serviceUpdated, published, stack "+\r
443                                 "publishinguri, publishingascending, publishingPublicDescription, "+\r
444                                 "publishingOrder " +\r
445                                 "from Notebook where isDirty = true and local=false");\r
446                 if (!check) \r
447                         logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
448                 while (query.next()) {\r
449                         tempNotebook = new Notebook();\r
450                         tempNotebook.setGuid(query.valueString(0));\r
451                         int sequence = new Integer(query.valueString(1)).intValue();\r
452                         tempNotebook.setUpdateSequenceNum(sequence);\r
453                         tempNotebook.setName(query.valueString(2));\r
454                         \r
455                         DateFormat indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
456 //                      indfm = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");\r
457                         try {\r
458                                 tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
459                                 tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
460                         } catch (ParseException e) {\r
461                                 e.printStackTrace();\r
462                         }\r
463                         tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
464                         tempNotebook.setStack(query.valueString(7));\r
465                         \r
466                         if (tempNotebook.isPublished()) {\r
467                                 Publishing p = new Publishing();\r
468                                 p.setUri(query.valueString(8));\r
469                                 p.setAscending(query.valueBoolean(9, false));\r
470                                 p.setPublicDescription(query.valueString(10));\r
471                                 p.setOrder(NoteSortOrder.findByValue(query.valueInteger(11)));\r
472                                 tempNotebook.setPublishing(p);\r
473                         }\r
474                         \r
475                         index.add(tempNotebook);\r
476                 }       \r
477                 return index;   \r
478         }\r
479         // This is a convience method to check if a tag exists & update/create based upon it\r
480         public void syncNotebook(Notebook notebook, boolean isDirty) {\r
481                 if (!exists(notebook.getGuid())) {\r
482                         addNotebook(notebook, isDirty, isDirty);\r
483                         return;\r
484                 }\r
485                 updateNotebook(notebook, isDirty);\r
486         }\r
487         // does a record exist?\r
488         private boolean exists(String guid) {\r
489                 \r
490                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
491                 \r
492                 query.prepare("Select guid from notebook where guid=:guid");\r
493                 query.bindValue(":guid", guid);\r
494                 if (!query.exec())\r
495                         logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
496                 boolean retval = query.next();\r
497                 return retval;\r
498         }\r
499         // Reset the dirty flag.  Typically done after a sync.\r
500         public void  resetDirtyFlag(String guid) {\r
501                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
502                 \r
503                 query.prepare("Update notebook set isdirty='false' where guid=:guid");\r
504                 query.bindValue(":guid", guid);\r
505                 if (!query.exec())\r
506                         logger.log(logger.EXTREME, "Error resetting notebook dirty field.");\r
507         }\r
508         // Set the default notebook\r
509         public void setDefaultNotebook(String guid) {\r
510                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
511                 \r
512                 query.prepare("Update notebook set defaultNotebook=false");\r
513                 if (!query.exec())\r
514                         logger.log(logger.EXTREME, "Error removing default notebook.");\r
515                 query.prepare("Update notebook set defaultNotebook=true where guid = :guid");\r
516                 query.bindValue(":guid", guid);\r
517                 if (!query.exec())\r
518                         logger.log(logger.EXTREME, "Error setting default notebook.");\r
519         }\r
520         \r
521         // Get a list of all icons\r
522         public HashMap<String, QIcon> getAllIcons() {\r
523                 HashMap<String, QIcon> values = new HashMap<String, QIcon>();\r
524                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
525         \r
526                 if (!query.exec("SELECT guid, icon from notebook where ARCHIVED  != true"))\r
527                         logger.log(logger.EXTREME, "Error executing notebook getAllIcons select.");\r
528                 while (query.next()) {\r
529                         if (query.getBlob(1) != null) {\r
530                                 String guid = query.valueString(0);\r
531                                 QByteArray blob = new QByteArray(query.getBlob(1));\r
532                                 QIcon icon = new QIcon(QPixmap.fromImage(QImage.fromData(blob)));\r
533                                 values.put(guid, icon);\r
534                         }\r
535                 }\r
536                 return values;\r
537         }\r
538         \r
539         // Get the notebooks custom icon\r
540         public QIcon getIcon(String guid) {\r
541                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
542                 \r
543                 if (!query.prepare("Select icon from notebook where guid=:guid"))\r
544                         logger.log(logger.EXTREME, "Error preparing notebook icon select.");\r
545                 query.bindValue(":guid", guid);\r
546                 if (!query.exec())\r
547                         logger.log(logger.EXTREME, "Error finding notebook icon.");\r
548                 if (!query.next() || query.getBlob(0) == null)\r
549                         return null;\r
550                 \r
551                 QByteArray blob = new QByteArray(query.getBlob(0));\r
552                 QIcon icon = new QIcon(QPixmap.fromImage(QImage.fromData(blob)));\r
553                 return icon;\r
554         }\r
555         // Set the notebooks custom icon\r
556         public void setIcon(String guid, QIcon icon, String type) {\r
557                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
558                 if (icon == null) {\r
559                         if (!query.prepare("update notebook set icon=null where guid=:guid"))\r
560                                 logger.log(logger.EXTREME, "Error preparing notebook icon select.");\r
561                 } else {\r
562                         if (!query.prepare("update notebook set icon=:icon where guid=:guid"))\r
563                                 logger.log(logger.EXTREME, "Error preparing notebook icon select.");\r
564                         QBuffer buffer = new QBuffer();\r
565                 if (!buffer.open(QIODevice.OpenModeFlag.ReadWrite)) {\r
566                         logger.log(logger.EXTREME, "Failure to open buffer.  Aborting.");\r
567                         return;\r
568                 }\r
569                 QPixmap p = icon.pixmap(32, 32);\r
570                 QImage i = p.toImage();\r
571                 i.save(buffer, type.toUpperCase());\r
572                 buffer.close();\r
573                 QByteArray b = new QByteArray(buffer.buffer());\r
574                 if (!b.isNull() && !b.isEmpty())\r
575                         query.bindValue(":icon", b.toByteArray());\r
576                 else\r
577                         return;\r
578                 }\r
579                 query.bindValue(":guid", guid);\r
580                 if (!query.exec()) \r
581                         logger.log(logger.LOW, "Error setting notebook icon. " +query.lastError());\r
582         }\r
583         // Set the notebooks custom icon\r
584         public void setReadOnly(String guid, boolean readOnly) {\r
585                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
586                 if (!query.prepare("update notebook set readOnly=:readOnly where guid=:guid"))\r
587                         logger.log(logger.EXTREME, "Error preparing notebook read only.");\r
588                 query.bindValue(":guid", guid);\r
589                 query.bindValue(":readOnly", readOnly);\r
590                 if (!query.exec()) \r
591                         logger.log(logger.LOW, "Error setting notebook read only. " +query.lastError());\r
592         }\r
593 \r
594         // does a record exist?\r
595         public String findNotebookByName(String newname) {\r
596                 \r
597                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
598                 \r
599                 query.prepare("Select guid from notebook where name=:newname");\r
600                 query.bindValue(":newname", newname);\r
601                 if (!query.exec())\r
602                         logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
603                 String val = null;\r
604                 if (query.next())\r
605                         val = query.valueString(0);\r
606                 return val;\r
607         }\r
608         // Get a note tag counts\r
609         public List<Pair<String,Integer>> getNotebookCounts() {\r
610                 List<Pair<String,Integer>> counts = new ArrayList<Pair<String,Integer>>();              \r
611                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
612                 if (!query.exec("select notebookGuid, count(guid) from note where active=1 group by notebookguid;")) {\r
613                         logger.log(logger.EXTREME, "NoteTags SQL getTagCounts has failed.");\r
614                         logger.log(logger.MEDIUM, query.lastError());\r
615                         return null;\r
616                 }\r
617                 while (query.next()) {\r
618                         Pair<String,Integer> newCount = new Pair<String,Integer>();\r
619                         newCount.setFirst(query.valueString(0));\r
620                         newCount.setSecond(query.valueInteger(1));\r
621                         counts.add(newCount);\r
622                 }       \r
623                 return counts;\r
624         }\r
625 \r
626         // Get/Set stacks\r
627         public void clearStack(String guid) {\r
628                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
629                 \r
630                 query.prepare("Update notebook set stack='' where guid=:guid");\r
631                 query.bindValue(":guid", guid);\r
632                 if (!query.exec())\r
633                         logger.log(logger.EXTREME, "Error clearing notebook stack.");\r
634         }\r
635         // Get/Set stacks\r
636         public void setStack(String guid, String stack) {\r
637                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
638                 \r
639                 query.prepare("Update notebook set stack=:stack, isDirty=true where guid=:guid");\r
640                 query.bindValue(":guid", guid);\r
641                 query.bindValue(":stack", stack);\r
642                 if (!query.exec())\r
643                         logger.log(logger.EXTREME, "Error setting notebook stack.");\r
644         }\r
645         // Get all stack names\r
646         public List<String> getAllStackNames() {\r
647                 List<String> stacks = new ArrayList<String>();\r
648                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
649                 \r
650                 if (!query.exec("Select distinct stack from notebook")) {\r
651                         logger.log(logger.EXTREME, "Error getting all stack names.");\r
652                         return null;\r
653                 }\r
654                 \r
655                 while (query.next()) {\r
656                         if (query.valueString(0) != null && !query.valueString(0).trim().equals(""))\r
657                                 stacks.add(query.valueString(0));\r
658                 }\r
659                 return stacks;\r
660         }\r
661         // Rename a stack\r
662         public void renameStacks(String oldName, String newName) {\r
663                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
664                 \r
665                 if (!query.prepare("update notebook set stack=:newName where stack=:oldName")) {\r
666                         logger.log(logger.EXTREME, "Error preparing in renameStacks.");\r
667                         return;\r
668                 }\r
669                 query.bindValue(":oldName", oldName);\r
670                 query.bindValue(":newName", newName);\r
671                 if (!query.exec()) {\r
672                         logger.log(logger.EXTREME, "Error updating stack names");\r
673                         return;\r
674                 }\r
675                 \r
676                 if (!query.prepare("update SystemIcon set stack=:newName where stack=:oldName and type='STACK'")) {\r
677                         logger.log(logger.EXTREME, "Error preparing icon rename in renameStacks.");\r
678                         return;\r
679                 }\r
680                 query.bindValue(":oldName", oldName);\r
681                 query.bindValue(":newName", newName);\r
682                 if (!query.exec()) {\r
683                         logger.log(logger.EXTREME, "Error updating stack names for SystemIcon");\r
684                         return;\r
685                 }\r
686 \r
687         }\r
688         // Get/Set stacks\r
689         public boolean stackExists(String stack) {\r
690                 NSqlQuery query = new NSqlQuery(db.getConnection());\r
691                 \r
692                 query.prepare("Select guid from notebook where stack=:stack limit 1");\r
693                 query.bindValue(":stack", stack);\r
694                 if (!query.exec())\r
695                         logger.log(logger.EXTREME, "Error setting notebook stack.");\r
696                 if (query.next())\r
697                         return true;\r
698                 else\r
699                         return false;\r
700         }\r
701 }\r
702 \r