2012-03-24 21:30:41 -04:00
import sys
2012-03-17 02:01:02 -04:00
import sqlite3
dbFile = ' sqLibrary.db '
bookTable = ' books '
2012-03-22 16:02:26 -04:00
bookRemovedTable = ' books_deleted '
bookCategoryTable = ' book_categories '
2012-04-01 13:27:46 -04:00
bookRemovedCategoryTable = ' books_deleted_categories '
2012-03-22 16:26:57 -04:00
categoryTable = ' categories '
2012-03-17 02:01:02 -04:00
2012-04-01 13:27:46 -04:00
2012-03-17 02:01:02 -04:00
bookTableCreation = '''
CREATE TABLE IF NOT EXISTS books
2012-04-01 13:27:46 -04:00
( id INTEGER PRIMARY KEY AUTOINCREMENT ,
2012-03-17 02:01:02 -04:00
isbn , lccn , title , subtitle , authors , edition ,
publisher , publish_year , publish_month , publish_location ,
2012-03-19 18:18:24 -04:00
pages , pagination , weight , last_updated ) ;
CREATE TABLE IF NOT EXISTS books_deleted
( id INTEGER PRIMARY KEY ,
isbn , lccn , title , subtitle , authors , edition ,
publisher , publish_year , publish_month , publish_location ,
pages , pagination , weight , last_updated ) ;
2012-03-22 16:02:26 -04:00
CREATE TABLE IF NOT EXISTS categories
2012-04-01 13:27:46 -04:00
( cat_id INTEGER PRIMARY KEY , category STRING UNIQUE ON CONFLICT IGNORE ) ;
2012-03-22 16:02:26 -04:00
CREATE TABLE IF NOT EXISTS book_categories
( id INTEGER , cat_id INTEGER ) ;
2012-04-01 13:27:46 -04:00
CREATE TABLE IF NOT EXISTS books_deleted_categories
( id INTEGER , cat_id INTEGER ) ;
2012-03-19 18:18:24 -04:00
'''
columns = [ ' id ' , ' isbn ' , ' lccn ' ,
' title ' , ' subtitle ' , ' authors ' , ' edition ' ,
' publisher ' , ' publish year ' , ' publish month ' , ' publish location ' ,
' pages ' , ' pagination ' , ' weight ' , ' last updated ' ]
bookTriggerCreation = '''
CREATE TRIGGER IF NOT EXISTS insert_books_time AFTER INSERT ON books
BEGIN
UPDATE books SET last_updated = DATETIME ( ' NOW ' ) WHERE rowid = new . rowid ;
END ;
CREATE TRIGGER IF NOT EXISTS update_books_time AFTER UPDATE ON books
BEGIN
UPDATE books SET last_updated = DATETIME ( ' NOW ' ) WHERE rowid = new . rowid ;
END ;
CREATE TRIGGER IF NOT EXISTS delete_books_backup BEFORE DELETE ON books
BEGIN
2012-04-01 13:27:46 -04:00
INSERT INTO books_deleted ( id , isbn , lccn ,
2012-03-19 18:18:24 -04:00
title , subtitle , authors , edition ,
publisher , publish_year , publish_month , publish_location ,
pages , pagination , weight , last_updated )
2012-04-01 13:27:46 -04:00
SELECT id , isbn , lccn ,
2012-03-19 18:18:24 -04:00
title , subtitle , authors , edition ,
publisher , publish_year , publish_month , publish_location ,
pages , pagination , weight , last_updated
FROM books
WHERE rowid = old . rowid ;
2012-04-01 13:27:46 -04:00
INSERT INTO books_deleted_categories ( id , cat_id )
SELECT id , cat_id FROM book_categories WHERE id = old . rowid ;
DELETE FROM book_categories WHERE id = old . rowid ;
END ;
CREATE TRIGGER IF NOT EXISTS delete_backup AFTER DELETE ON books_deleted
BEGIN
DELETE FROM books_deleted_categories WHERE id = old . rowid ;
END ;
CREATE TRIGGER IF NOT EXISTS delete_category AFTER DELETE ON categories
BEGIN
DELETE FROM book_categories WHERE cat_id = old . cat_id ;
DELETE FROM books_deleted_categories WHERE cat_id = old . cat_id ;
2012-03-19 18:18:24 -04:00
END ;
2012-03-22 16:02:26 -04:00
CREATE TRIGGER IF NOT EXISTS insert_book_category_time AFTER INSERT ON book_categories
BEGIN
UPDATE books SET last_updated = DATETIME ( ' NOW ' ) WHERE id = new . id ;
END ;
CREATE TRIGGER IF NOT EXISTS delete_book_category_time AFTER DELETE ON book_categories
BEGIN
UPDATE books SET last_updated = DATETIME ( ' NOW ' ) WHERE id = old . id ;
END ;
2012-03-17 02:01:02 -04:00
'''
2012-03-22 16:32:19 -04:00
################################3
# character escaping, etc for sql queries
#################################
2012-03-17 02:01:02 -04:00
def colify ( s ) :
return s . replace ( " " , " _ " ) . lower ( )
def stringify ( v ) :
2012-03-17 02:39:58 -04:00
return ' " ' + str ( v ) . strip ( ) . replace ( ' " ' , ' " " ' ) + ' " '
2012-03-17 02:01:02 -04:00
2012-03-22 16:32:19 -04:00
###################################
# book functions
##################################
2012-03-17 02:01:02 -04:00
def addBook ( book ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
cols = [ ]
vals = [ ]
for k , v in book . items ( ) :
if v != " " :
cols . append ( colify ( k ) )
vals . append ( stringify ( v ) )
query = " INSERT INTO " + bookTable + " ( " + " , " . join ( cols ) + " ) VALUES ( " + " , " . join ( vals ) + " ); "
c . execute ( query )
conn . commit ( )
c . close ( )
2012-03-19 18:18:24 -04:00
def updateBook ( book , bookID ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-20 15:27:34 -04:00
updates = [ ]
2012-03-19 18:18:24 -04:00
for k , v in book . items ( ) :
2012-03-20 15:27:34 -04:00
updates . append ( colify ( k ) + " = " + stringify ( v ) )
query = " UPDATE " + bookTable + " SET " + " , " . join ( updates ) + " WHERE id = " + str ( bookID ) + " ; "
2012-03-19 18:18:24 -04:00
c . execute ( query )
conn . commit ( )
c . close ( )
def getBooks ( ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
query = " SELECT * FROM " + bookTable + " ; "
c . execute ( query )
books = [ ]
for b in c :
book = { }
i = 0
for k in columns :
if b [ i ] != None :
book [ k ] = b [ i ]
i + = 1
books . append ( book )
c . close ( )
return books
2012-03-30 20:09:22 -04:00
def getBooksByCategory ( cat ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-04-01 13:45:51 -04:00
query = " SELECT " + " , " . join ( map ( colify , columns ) ) + " FROM " + bookTable + " JOIN " + bookCategoryTable + " USING (id) WHERE cat_id = :id; "
2012-03-30 20:09:22 -04:00
c . execute ( query , cat )
books = [ ]
for b in c :
book = { }
i = 0
for k in columns :
if b [ i ] != None :
book [ k ] = b [ i ]
i + = 1
books . append ( book )
c . close ( )
return books
2012-03-22 16:02:26 -04:00
def getRemovedBooks ( ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
query = " SELECT * FROM " + bookRemovedTable + " ; "
c . execute ( query )
books = [ ]
for b in c :
book = { }
i = 0
for k in columns :
if b [ i ] != None :
book [ k ] = b [ i ]
i + = 1
books . append ( book )
c . close ( )
return books
2012-03-20 15:27:34 -04:00
def getBookByID ( bookid ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
query = " SELECT * FROM " + bookTable + " WHERE id = " + str ( bookid ) + " ; "
c . execute ( query )
b = c . fetchone ( )
book = { }
i = 0
for k in columns :
if b [ i ] != None :
book [ k ] = b [ i ]
i + = 1
c . close ( )
return book
2012-03-22 16:26:57 -04:00
2012-03-22 16:02:26 -04:00
# removes book from catalogue
2012-03-20 15:27:34 -04:00
def removeBook ( bookid ) :
2012-03-19 18:18:24 -04:00
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-20 15:27:34 -04:00
query = " DELETE FROM " + bookTable + " WHERE id = " + str ( bookid ) + " ; "
2012-03-19 18:18:24 -04:00
c . execute ( query )
2012-03-22 16:02:26 -04:00
query = " DELETE FROM " + bookCategoryTable + " WHERE id = " + str ( bookid ) + " ; "
c . execute ( query )
conn . commit ( )
c . close ( )
2012-03-27 16:02:01 -04:00
def removeBooks ( books ) :
2012-03-27 15:08:03 -04:00
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-27 16:02:01 -04:00
query1 = " DELETE FROM " + bookTable + " WHERE id = :id; "
query2 = " DELETE FROM " + bookCategoryTable + " WHERE id = :id; "
for book in books :
c . execute ( query1 , book )
c . execute ( query2 , book )
2012-03-27 15:08:03 -04:00
conn . commit ( )
c . close ( )
2012-03-30 20:41:00 -04:00
# restores trashed books
def restoreBooks ( books ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-04-01 13:27:46 -04:00
query1 = " INSERT INTO " + bookTable + " ( " + " , " . join ( map ( colify , columns ) ) + " ) SELECT " + " , " . join ( map ( colify , columns ) ) + " FROM " + bookRemovedTable + " WHERE id = :id; "
query2 = " INSERT INTO " + bookCategoryTable + " (id, cat_id) SELECT id,cat_id FROM " + bookRemovedCategoryTable + " WHERE id = :id; "
query3 = " DELETE FROM " + bookRemovedTable + " WHERE id = :id; "
2012-03-30 20:41:00 -04:00
for book in books :
c . execute ( query1 , book )
c . execute ( query2 , book )
2012-04-01 13:27:46 -04:00
c . execute ( query3 , book )
2012-03-30 20:41:00 -04:00
conn . commit ( )
c . close ( )
2012-03-22 16:02:26 -04:00
# fully deletes book from removedBooks table
def deleteBook ( bookid ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
query = " DELETE FROM " + bookRemovedTable + " WHERE id = " + str ( bookid ) + " ; "
c . execute ( query )
2012-03-19 18:18:24 -04:00
conn . commit ( )
c . close ( )
2012-03-27 16:02:01 -04:00
def deleteBooks ( books ) :
2012-03-27 15:08:03 -04:00
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-27 16:02:01 -04:00
query = " DELETE FROM " + bookRemovedTable + " WHERE id = :id; "
for book in books :
c . execute ( query , book )
2012-03-27 15:08:03 -04:00
conn . commit ( )
c . close ( )
2012-03-22 16:26:57 -04:00
#########################################
# Category related functions
########################################
2012-03-27 22:06:42 -04:00
def getBookCategories ( book ) :
2012-03-24 21:30:41 -04:00
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-27 22:06:42 -04:00
query = " SELECT id,cat_id,category FROM " + bookCategoryTable + " JOIN " + categoryTable + " USING (cat_id) WHERE id = :id ; "
c . execute ( query , book )
cats = [ ]
for book_id , cat_id , cat_name in c :
cats . append ( { ' id ' : book_id , ' cat_id ' : cat_id , ' category ' : cat_name } )
c . close ( )
return cats
def categorizeBook ( book , cats ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
query = " INSERT OR IGNORE INTO " + bookCategoryTable + " (id,cat_id) VALUES (?, ?); "
for cat in cats :
args = ( book [ ' id ' ] , cat [ ' id ' ] )
c . execute ( query , args )
conn . commit ( )
c . close ( )
def uncategorizeBook ( book , cats ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
query = " DELETE FROM " + bookCategoryTable + " WHERE (id = ? AND cat_id = ?); "
for cat in cats :
args = ( book [ ' id ' ] , cat [ ' id ' ] )
c . execute ( query , args )
2012-03-24 21:30:41 -04:00
conn . commit ( )
c . close ( )
2012-03-22 16:26:57 -04:00
def getCategories ( ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-26 22:03:13 -04:00
query = " SELECT cat_id, category FROM " + categoryTable + " ; "
2012-03-22 16:26:57 -04:00
c . execute ( query )
cats = [ ]
2012-03-26 22:03:13 -04:00
for cat_id , cat in c :
cats . append ( { ' id ' : cat_id , ' category ' : cat } )
2012-03-22 16:26:57 -04:00
c . close ( )
return cats
def addCategory ( cat ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-22 16:32:19 -04:00
query = " INSERT OR IGNORE INTO " + categoryTable + " (category) VALUES ( " + stringify ( cat ) + " ); "
2012-03-24 21:30:41 -04:00
c . execute ( query )
conn . commit ( )
2012-03-22 16:26:57 -04:00
c . close ( )
2012-03-22 16:02:26 -04:00
2012-03-27 15:53:42 -04:00
def deleteCategories ( cats ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
query1 = " DELETE FROM " + categoryTable + " WHERE cat_id = :id; "
for cat in cats :
c . execute ( query1 , cat )
conn . commit ( )
c . close ( )
2012-03-22 16:26:57 -04:00
#########################################
# Database initialization
#########################################
2012-03-17 02:01:02 -04:00
def createBooksTable ( ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
2012-03-19 18:18:24 -04:00
c . executescript ( bookTableCreation )
conn . commit ( )
c . close ( )
def createTriggers ( ) :
conn = sqlite3 . connect ( dbFile )
c = conn . cursor ( )
c . executescript ( bookTriggerCreation )
2012-03-17 02:01:02 -04:00
conn . commit ( )
c . close ( )
2012-03-22 16:26:57 -04:00
2012-03-17 02:01:02 -04:00
createBooksTable ( )
2012-03-19 18:18:24 -04:00
createTriggers ( )