4 dbFile = 'sqLibrary.db'
6 bookCategoryTable='book_categories'
7 categoryTable = 'categories'
10 bookTableCreation = '''
11 CREATE TABLE IF NOT EXISTS books
12 (id INTEGER PRIMARY KEY AUTOINCREMENT,
13 isbn, lccn, title, subtitle, authors, edition,
14 publisher, publish_year, publish_month, publish_location,
15 pages, pagination, weight, last_updated DATETIME DEFAULT current_timestamp, deleted BOOLEAN DEFAULT 0);
17 CREATE TABLE IF NOT EXISTS categories
18 (cat_id INTEGER PRIMARY KEY, category STRING UNIQUE ON CONFLICT IGNORE);
20 CREATE TABLE IF NOT EXISTS book_categories
21 (id INTEGER, cat_id INTEGER);
24 columns = ['id', 'isbn', 'lccn',
25 'title', 'subtitle', 'authors', 'edition',
26 'publisher', 'publish year', 'publish month', 'publish location',
27 'pages', 'pagination', 'weight', 'last updated', 'deleted']
29 bookTriggerCreation = '''
31 CREATE TRIGGER IF NOT EXISTS update_books_time AFTER UPDATE ON books
33 UPDATE books SET last_updated = DATETIME('NOW') WHERE rowid = new.rowid;
36 CREATE TRIGGER IF NOT EXISTS delete_book AFTER DELETE ON books
38 DELETE FROM book_categories WHERE id = old.rowid;
41 CREATE TRIGGER IF NOT EXISTS delete_category AFTER DELETE ON categories
43 DELETE FROM book_categories WHERE cat_id = old.cat_id;
46 CREATE TRIGGER IF NOT EXISTS insert_book_category_time AFTER INSERT ON book_categories
48 UPDATE books SET last_updated = DATETIME('NOW') WHERE id = new.id;
52 ################################3
53 # character escaping, etc for sql queries
54 #################################
56 return s.replace(" ","_").lower()
59 return '"' + str(v).strip().replace('"','""') + '"'
61 ###################################
63 ##################################
65 conn = sqlite3.connect(dbFile)
69 for k,v in book.items():
71 cols.append(colify(k))
72 vals.append(stringify(v))
74 query = "INSERT INTO "+bookTable+" ("+", ".join(cols)+") VALUES ("+", ".join(vals)+");"
79 def updateBook(book, bookID):
80 conn = sqlite3.connect(dbFile)
83 for k,v in book.items():
84 updates.append(colify(k)+"="+stringify(v))
85 query = "UPDATE "+bookTable+" SET " + ", ".join(updates)+" WHERE id = " +str(bookID)+";"
91 conn = sqlite3.connect(dbFile)
93 query = "SELECT * FROM "+bookTable+" WHERE deleted=0;"
107 def getBooksByCategory(cat):
108 conn = sqlite3.connect(dbFile)
110 query = "SELECT "+",".join(map(colify,columns))+" FROM "+bookTable+" JOIN "+bookCategoryTable+" USING (id) WHERE cat_id = :id AND deleted=0;"
124 def getRemovedBooks():
125 conn = sqlite3.connect(dbFile)
127 query = "SELECT * FROM "+bookTable+" WHERE DELETED=1;"
141 def getBookByID(bookid):
142 conn = sqlite3.connect(dbFile)
144 query = "SELECT * FROM "+bookTable+" WHERE id = "+str(bookid)+";"
157 # removes book from catalogue
158 def removeBook(bookid):
159 conn = sqlite3.connect(dbFile)
161 query = "UPDATE " +bookTable+ " SET deleted=1 WHERE id = "+str(bookid)+";"
166 def removeBooks(books):
167 conn = sqlite3.connect(dbFile)
169 query1 = "UPDATE " +bookTable+ " SET deleted=1 WHERE id = :id;"
171 c.execute(query1, book)
175 # restores trashed books
176 def restoreBooks(books):
177 conn = sqlite3.connect(dbFile)
179 query1 = "UPDATE " +bookTable+ " SET deleted=0 WHERE id = :id;"
181 c.execute(query1,book)
185 # fully deletes book from removedBooks table
186 def deleteBook(bookid):
187 conn = sqlite3.connect(dbFile)
189 query = "DELETE FROM " +bookTable+ " WHERE id = "+str(bookid)+";"
194 def deleteBooks(books):
195 conn = sqlite3.connect(dbFile)
197 query = "DELETE FROM " +bookTable+ " WHERE id = :id;"
199 c.execute(query, book)
203 #########################################
204 # Category related functions
205 ########################################
206 def getBookCategories(book):
207 conn = sqlite3.connect(dbFile)
209 query = "SELECT id,cat_id,category FROM "+bookCategoryTable+" JOIN "+categoryTable+" USING (cat_id) WHERE id = :id ;"
210 c.execute(query,book)
212 for book_id,cat_id,cat_name in c:
213 cats.append({'id':book_id, 'cat_id':cat_id, 'category':cat_name})
217 def categorizeBook(book, cats):
218 conn = sqlite3.connect(dbFile)
220 query = "INSERT OR IGNORE INTO "+bookCategoryTable+" (id,cat_id) VALUES (?, ?);"
222 args = (book['id'],cat['id'])
223 c.execute(query,args)
227 def uncategorizeBook(book, cats):
228 conn = sqlite3.connect(dbFile)
230 query = "DELETE FROM "+bookCategoryTable+" WHERE (id = ? AND cat_id = ?);"
232 args = (book['id'],cat['id'])
233 c.execute(query,args)
238 conn = sqlite3.connect(dbFile)
240 query = "SELECT cat_id, category FROM "+categoryTable+";"
244 cats.append({'id':cat_id, 'category':cat})
248 def addCategory(cat):
249 conn = sqlite3.connect(dbFile)
251 query = "INSERT OR IGNORE INTO "+categoryTable+" (category) VALUES ("+stringify(cat)+");"
256 def deleteCategories(cats):
257 conn = sqlite3.connect(dbFile)
259 query1 = "DELETE FROM " +categoryTable+ " WHERE cat_id = :id;"
261 c.execute(query1, cat)
265 #########################################
266 # Database initialization
267 #########################################
268 def createBooksTable():
269 conn = sqlite3.connect(dbFile)
271 c.executescript(bookTableCreation)
275 def createTriggers():
276 conn = sqlite3.connect(dbFile)
278 c.executescript(bookTriggerCreation)