4 dbFile = 'sqLibrary.db'
6 bookRemovedTable='books_deleted'
7 bookCategoryTable='book_categories'
8 bookRemovedCategoryTable='books_deleted_categories'
9 categoryTable = 'categories'
12 bookTableCreation = '''
13 CREATE TABLE IF NOT EXISTS books
14 (id INTEGER PRIMARY KEY AUTOINCREMENT,
15 isbn, lccn, title, subtitle, authors, edition,
16 publisher, publish_year, publish_month, publish_location,
17 pages, pagination, weight, last_updated);
19 CREATE TABLE IF NOT EXISTS books_deleted
20 (id INTEGER PRIMARY KEY,
21 isbn, lccn, title, subtitle, authors, edition,
22 publisher, publish_year, publish_month, publish_location,
23 pages, pagination, weight, last_updated);
25 CREATE TABLE IF NOT EXISTS categories
26 (cat_id INTEGER PRIMARY KEY, category STRING UNIQUE ON CONFLICT IGNORE);
28 CREATE TABLE IF NOT EXISTS book_categories
29 (id INTEGER, cat_id INTEGER);
31 CREATE TABLE IF NOT EXISTS books_deleted_categories
32 (id INTEGER, cat_id INTEGER);
35 columns = ['id', 'isbn', 'lccn',
36 'title', 'subtitle', 'authors', 'edition',
37 'publisher', 'publish year', 'publish month', 'publish location',
38 'pages', 'pagination', 'weight', 'last updated']
40 bookTriggerCreation = '''
41 CREATE TRIGGER IF NOT EXISTS insert_books_time AFTER INSERT ON books
43 UPDATE books SET last_updated = DATETIME('NOW') WHERE rowid = new.rowid;
46 CREATE TRIGGER IF NOT EXISTS update_books_time AFTER UPDATE ON books
48 UPDATE books SET last_updated = DATETIME('NOW') WHERE rowid = new.rowid;
51 CREATE TRIGGER IF NOT EXISTS delete_books_backup BEFORE DELETE ON books
53 INSERT INTO books_deleted (id, isbn, lccn,
54 title, subtitle, authors, edition,
55 publisher, publish_year, publish_month, publish_location,
56 pages, pagination, weight, last_updated)
57 SELECT id, isbn, lccn,
58 title, subtitle, authors, edition,
59 publisher, publish_year, publish_month, publish_location,
60 pages, pagination, weight, last_updated
62 WHERE rowid = old.rowid;
63 INSERT INTO books_deleted_categories (id, cat_id)
64 SELECT id, cat_id FROM book_categories WHERE id = old.rowid;
65 DELETE FROM book_categories WHERE id = old.rowid;
68 CREATE TRIGGER IF NOT EXISTS delete_backup AFTER DELETE ON books_deleted
70 DELETE FROM books_deleted_categories WHERE id = old.rowid;
73 CREATE TRIGGER IF NOT EXISTS delete_category AFTER DELETE ON categories
75 DELETE FROM book_categories WHERE cat_id = old.cat_id;
76 DELETE FROM books_deleted_categories WHERE cat_id = old.cat_id;
79 CREATE TRIGGER IF NOT EXISTS insert_book_category_time AFTER INSERT ON book_categories
81 UPDATE books SET last_updated = DATETIME('NOW') WHERE id = new.id;
84 CREATE TRIGGER IF NOT EXISTS delete_book_category_time AFTER DELETE ON book_categories
86 UPDATE books SET last_updated = DATETIME('NOW') WHERE id = old.id;
90 ################################3
91 # character escaping, etc for sql queries
92 #################################
94 return s.replace(" ","_").lower()
97 return '"' + str(v).strip().replace('"','""') + '"'
99 ###################################
101 ##################################
103 conn = sqlite3.connect(dbFile)
107 for k,v in book.items():
109 cols.append(colify(k))
110 vals.append(stringify(v))
112 query = "INSERT INTO "+bookTable+" ("+", ".join(cols)+") VALUES ("+", ".join(vals)+");"
117 def updateBook(book, bookID):
118 conn = sqlite3.connect(dbFile)
121 for k,v in book.items():
122 updates.append(colify(k)+"="+stringify(v))
123 query = "UPDATE "+bookTable+" SET " + ", ".join(updates)+" WHERE id = " +str(bookID)+";"
129 conn = sqlite3.connect(dbFile)
131 query = "SELECT * FROM "+bookTable+";"
145 def getBooksByCategory(cat):
146 conn = sqlite3.connect(dbFile)
148 query = "SELECT "+",".join(map(colify,columns))+" FROM "+bookTable+" JOIN "+bookCategoryTable+" USING (id) WHERE cat_id = :id;"
162 def getRemovedBooks():
163 conn = sqlite3.connect(dbFile)
165 query = "SELECT * FROM "+bookRemovedTable+";"
179 def getBookByID(bookid):
180 conn = sqlite3.connect(dbFile)
182 query = "SELECT * FROM "+bookTable+" WHERE id = "+str(bookid)+";"
195 # removes book from catalogue
196 def removeBook(bookid):
197 conn = sqlite3.connect(dbFile)
199 query = "DELETE FROM " +bookTable+ " WHERE id = "+str(bookid)+";"
201 query = "DELETE FROM " +bookCategoryTable+ " WHERE id = "+str(bookid)+";"
206 def removeBooks(books):
207 conn = sqlite3.connect(dbFile)
209 query1 = "DELETE FROM " +bookTable+ " WHERE id = :id;"
210 query2 = "DELETE FROM " +bookCategoryTable+ " WHERE id = :id;"
212 c.execute(query1, book)
213 c.execute(query2, book)
217 # restores trashed books
218 def restoreBooks(books):
219 conn = sqlite3.connect(dbFile)
221 query1 = "INSERT INTO "+bookTable+" ("+",".join(map(colify,columns))+") SELECT "+",".join(map(colify,columns))+" FROM "+bookRemovedTable+" WHERE id = :id;"
222 query2 = "INSERT INTO "+bookCategoryTable+" (id, cat_id) SELECT id,cat_id FROM "+bookRemovedCategoryTable+" WHERE id = :id;"
223 query3 = "DELETE FROM " +bookRemovedTable+ " WHERE id = :id;"
225 c.execute(query1,book)
226 c.execute(query2,book)
227 c.execute(query3,book)
231 # fully deletes book from removedBooks table
232 def deleteBook(bookid):
233 conn = sqlite3.connect(dbFile)
235 query = "DELETE FROM " +bookRemovedTable+ " WHERE id = "+str(bookid)+";"
240 def deleteBooks(books):
241 conn = sqlite3.connect(dbFile)
243 query = "DELETE FROM " +bookRemovedTable+ " WHERE id = :id;"
245 c.execute(query, book)
249 #########################################
250 # Category related functions
251 ########################################
252 def getBookCategories(book):
253 conn = sqlite3.connect(dbFile)
255 query = "SELECT id,cat_id,category FROM "+bookCategoryTable+" JOIN "+categoryTable+" USING (cat_id) WHERE id = :id ;"
256 c.execute(query,book)
258 for book_id,cat_id,cat_name in c:
259 cats.append({'id':book_id, 'cat_id':cat_id, 'category':cat_name})
263 def categorizeBook(book, cats):
264 conn = sqlite3.connect(dbFile)
266 query = "INSERT OR IGNORE INTO "+bookCategoryTable+" (id,cat_id) VALUES (?, ?);"
268 args = (book['id'],cat['id'])
269 c.execute(query,args)
273 def uncategorizeBook(book, cats):
274 conn = sqlite3.connect(dbFile)
276 query = "DELETE FROM "+bookCategoryTable+" WHERE (id = ? AND cat_id = ?);"
278 args = (book['id'],cat['id'])
279 c.execute(query,args)
284 conn = sqlite3.connect(dbFile)
286 query = "SELECT cat_id, category FROM "+categoryTable+";"
290 cats.append({'id':cat_id, 'category':cat})
294 def addCategory(cat):
295 conn = sqlite3.connect(dbFile)
297 query = "INSERT OR IGNORE INTO "+categoryTable+" (category) VALUES ("+stringify(cat)+");"
302 def deleteCategories(cats):
303 conn = sqlite3.connect(dbFile)
305 query1 = "DELETE FROM " +categoryTable+ " WHERE cat_id = :id;"
307 c.execute(query1, cat)
311 #########################################
312 # Database initialization
313 #########################################
314 def createBooksTable():
315 conn = sqlite3.connect(dbFile)
317 c.executescript(bookTableCreation)
321 def createTriggers():
322 conn = sqlite3.connect(dbFile)
324 c.executescript(bookTriggerCreation)