openlp/openlp/plugins/bibles/lib/bibleDBimpl.py

185 lines
7.2 KiB
Python

"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
Portions copyright (c) 2008 - 2009 Martin Thompson, Tim Bentley
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
import os
import os.path
import logging
from sqlalchemy import *
from sqlalchemy.sql import select
from sqlalchemy.orm import sessionmaker, mapper, scoped_session
from common import BibleCommon
from openlp.core.utils import ConfigHelper
from openlp.plugins.bibles.lib.tables import *
from openlp.plugins.bibles.lib.classes import *
class BibleDBImpl(BibleCommon):
global log
log=logging.getLogger(u'BibleDBImpl')
log.info(u'BibleDBimpl loaded')
def __init__(self, biblepath , biblename, config):
# Connect to database
self.config = config
self.biblefile = os.path.join(biblepath, biblename+u'.sqlite')
log.debug(u'Load bible %s on path %s', biblename, self.biblefile)
db_type = self.config.get_config(u'db type', u'sqlite')
if db_type == u'sqlite':
self.db = create_engine(u'sqlite:///' + self.biblefile)
else:
self.db_url = u'%s://%s:%s@%s/%s' % \
(db_type, self.config.get_config(u'db username'),
self.config.get_config(u'db password'),
self.config.get_config(u'db hostname'),
self.config.get_config(u'db database'))
self.db.echo = False
metadata.bind = self.db
metadata.bind.echo = False
self.session = scoped_session(sessionmaker(autoflush=True, autocommit=False))
self.session.configure(bind=self.db)
metadata.create_all(self.db)
def create_tables(self):
log.debug( u'createTables')
self.save_meta(u'dbversion', u'2')
self._load_testament(u'Old Testament')
self._load_testament(u'New Testament')
self._load_testament(u'Apocrypha')
def add_verse(self, bookid, chap, vse, text):
#log.debug(u'add_verse %s,%s,%s", bookid, chap, vse)
metadata.bind.echo = False
session = self.session()
verse = Verse()
verse.book_id = bookid
verse.chapter = chap
verse.verse = vse
verse.text = text
session.add(verse)
session.commit()
def create_chapter(self, bookid, chap, textlist):
log.debug(u'create_chapter %s,%s', bookid, chap)
#log.debug(u'Text %s ", textlist)
metadata.bind.echo = False
session = self.session()
#text list has book and chapter as first to elements of the array
for v , t in textlist.iteritems():
verse = Verse()
verse.book_id = bookid
verse.chapter = chap
verse.verse = v
verse.text = t
session.add(verse)
session.commit()
def create_book(self, bookname, bookabbrev, testament = 1):
log.debug(u'create_book %s,%s', bookname, bookabbrev)
metadata.bind.echo = False
session = self.session()
book = Book()
book.testament_id = testament
book.name = bookname
book.abbreviation = bookabbrev
session.add(book)
session.commit()
return book
def save_meta(self, key, value):
log.debug(u'save_meta %s/%s', key, value)
metadata.bind.echo = False
session = self.session()
bmeta= BibleMeta()
bmeta.key = key
bmeta.value = value
session.add(bmeta)
session.commit()
def get_meta(self, metakey):
log.debug(u'get meta %s', metakey)
return self.session.query(BibleMeta).filter_by(key = metakey).first()
def delete_meta(self, metakey):
biblemeta = self.get_meta(metakey)
try:
session.delete(biblemeta)
session.commit()
return True
except:
return False
def _load_testament(self, testament):
log.debug(u'load_testaments %s', testament)
metadata.bind.echo = False
session = self.session()
test = ONTestament()
test.name = testament
session.add(test)
session.commit()
def get_bible_books(self):
log.debug(u'get_bible_books ')
return self.session.query(Book).order_by(Book.id).all()
def get_max_bible_book_verses(self, bookname, chapter):
log.debug(u'get_max_bible_book_verses %s,%s', bookname , chapter)
metadata.bind.echo = False
s = text (u'select max(verse.verse) from verse,book where chapter = :c and book_id = book.id and book.name = :b ')
return self.db.execute(s, c=chapter, b=bookname).fetchone()
def get_max_bible_book_chapter(self, bookname):
log.debug(u'get_max_bible_book_chapter %s', bookname )
metadata.bind.echo = False
s = text (u'select max(verse.chapter) from verse,book where book_id = book.id and book.name = :b')
return self.db.execute(s, b=bookname).fetchone()
def get_bible_book(self, bookname):
log.debug(u'get_bible_book %s', bookname)
bk = self.session.query(Book).filter(Book.name.like(bookname + u'%')).first()
if bk == None:
bk = self.session.query(Book).filter(Book.abbreviation.like(bookname+u'%')).first()
return bk
def get_bible_chapter(self, id, chapter):
log.debug(u'get_bible_chapter %s,%s', id, chapter )
metadata.bind.echo = False
return self.session.query(Verse).filter_by(chapter = chapter ).filter_by(book_id = id).first()
def get_bible_text(self, bookname, chapter, sverse, everse):
log.debug(u'get_bible_text %s,%s,%s,%s', bookname, chapter, sverse, everse)
metadata.bind.echo = False
bookname = bookname + u"%"
s = text (u'select name,chapter,verse.verse, verse.text FROM verse , book where verse.book_id == book.id AND verse.chapter == :c AND (verse.verse between :v1 and :v2) and (book.name like :b)')
return self.db.execute(s, c=chapter, v1=sverse , v2=everse, b=bookname).fetchall()
def get_verses_from_text(self,versetext):
log.debug(u'get_verses_from_text %s',versetext)
metadata.bind.echo = False
versetext = "%"+versetext+"%"
s = text (u'select book.name, verse.chapter, verse.verse, verse.text FROM verse , book where verse.book_id == book.id and verse.text like :t')
return self.db.execute(s, t=versetext).fetchall()
def dump_bible(self):
log.debug( u'.........Dumping Bible Database')
log.debug( '...............................Books ')
s = text (u'select * FROM book ')
log.debug( self.db.execute(s).fetchall())
log.debug( u'...............................Verses ')
s = text (u'select * FROM verse ')
log.debug( self.db.execute(s).fetchall())