forked from openlp/openlp
Fix Database with previous version and add extra API's
bzr-revno: 115
This commit is contained in:
parent
dec6feb03c
commit
4afceb8377
@ -45,7 +45,7 @@ class BibleInvalidDatabaseError(Exception):
|
|||||||
|
|
||||||
metadata = MetaData()
|
metadata = MetaData()
|
||||||
#Define the tables and indexes
|
#Define the tables and indexes
|
||||||
meta_table = Table('meta', metadata,
|
meta_table = Table('metadata', metadata,
|
||||||
Column('key', String(255), primary_key=True),
|
Column('key', String(255), primary_key=True),
|
||||||
Column('value', String(255)),
|
Column('value', String(255)),
|
||||||
)
|
)
|
||||||
@ -57,21 +57,23 @@ testament_table = Table('testament', metadata,
|
|||||||
|
|
||||||
book_table = Table('book', metadata,
|
book_table = Table('book', metadata,
|
||||||
Column('id', Integer, primary_key=True),
|
Column('id', Integer, primary_key=True),
|
||||||
Column('testament_id', None , ForeignKey('testament.id')),
|
Column('testament_id', Integer),
|
||||||
Column('name', String(30)),
|
Column('name', String(30)),
|
||||||
Column('abbrev', String(30)),
|
Column('abbrev', String(5)),
|
||||||
)
|
)
|
||||||
Index('idx_name', book_table.c.name, book_table.c.id)
|
Index('idx_name', book_table.c.name, book_table.c.id)
|
||||||
Index('idx_abbrev', book_table.c.abbrev, book_table.c.id)
|
Index('idx_abbrev', book_table.c.abbrev, book_table.c.id)
|
||||||
|
|
||||||
|
#Column('book_id', None, ForeignKey('book.id')),
|
||||||
verse_table = Table('verse', metadata,
|
verse_table = Table('verse', metadata,
|
||||||
Column('id', Integer, primary_key=True),
|
Column('id', Integer, primary_key=True),
|
||||||
Column('book_id', None, ForeignKey('book.id')),
|
Column('book_id' ),
|
||||||
Column('chapter', Integer),
|
Column('chapter', Integer),
|
||||||
Column('verse', Integer),
|
Column('verse', Integer),
|
||||||
Column('text', Text),
|
Column('text', Text),
|
||||||
)
|
)
|
||||||
Index('idx_chapter_verse_book', verse_table.c.chapter, verse_table.c.verse, verse_table.c.book_id, verse_table.c.id)
|
Index('idx_chapter_verse_book', verse_table.c.chapter, verse_table.c.verse, verse_table.c.book_id, verse_table.c.id)
|
||||||
|
Index('idx_chapter_verse_text', verse_table.c.text, verse_table.c.verse, verse_table.c.book_id, verse_table.c.id)
|
||||||
|
|
||||||
class BibleMeta(object):
|
class BibleMeta(object):
|
||||||
def __init__(self, key, value):
|
def __init__(self, key, value):
|
||||||
@ -121,7 +123,7 @@ class BibleDBImpl(BibleCommon):
|
|||||||
path = ConfigHelper.getBiblePath()
|
path = ConfigHelper.getBiblePath()
|
||||||
#log.debug( path
|
#log.debug( path
|
||||||
#log.debug( biblename
|
#log.debug( biblename
|
||||||
self.biblefile = os.path.join(path, biblename+".bible")
|
self.biblefile = os.path.join(path, biblename+".bible3")
|
||||||
#log.debug( self.biblefile
|
#log.debug( self.biblefile
|
||||||
#log.debug( btype
|
#log.debug( btype
|
||||||
if btype == 'sqlite':
|
if btype == 'sqlite':
|
||||||
@ -145,7 +147,7 @@ class BibleDBImpl(BibleCommon):
|
|||||||
testament_table.create()
|
testament_table.create()
|
||||||
book_table.create()
|
book_table.create()
|
||||||
verse_table.create()
|
verse_table.create()
|
||||||
self.saveMeta("dbversion", "0.1")
|
self.saveMeta("dbversion", "2")
|
||||||
self._loadTestaments()
|
self._loadTestaments()
|
||||||
|
|
||||||
def addVerse(self, bookid, chap, verse, text):
|
def addVerse(self, bookid, chap, verse, text):
|
||||||
@ -156,26 +158,26 @@ class BibleDBImpl(BibleCommon):
|
|||||||
session.add(versemeta)
|
session.add(versemeta)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
def createChapter(self, bookname, chap, textlist):
|
def createChapter(self, bookid, chap, textlist):
|
||||||
log.debug( "createChapter %s,%s,%s", bookname, chap, textlist)
|
log.debug( "createChapter %s,%s,%s", bookid, chap, textlist)
|
||||||
metadata.bind.echo = False
|
metadata.bind.echo = False
|
||||||
session = self.Session()
|
session = self.Session()
|
||||||
s = text (""" select id FROM book where book.name == :b """)
|
#s = text (""" select id FROM book where book.name == :b """)
|
||||||
data = self.db.execute(s, b=bookname).fetchone()
|
#data = self.db.execute(s, b=bookname).fetchone()
|
||||||
id = data[0] # id is first record in list.
|
#id = data[0] # id is first record in list.
|
||||||
#log.debug( "id = " , id
|
#log.debug( "id = " , id
|
||||||
for v , t in textlist.iteritems():
|
for v , t in textlist.iteritems():
|
||||||
versemeta = Verse(book_id=id, chapter=int(chap), verse=int(v), text=(t))
|
versemeta = Verse(book_id=bookid, chapter=int(chap), verse=int(v), text=(t))
|
||||||
session.add(versemeta)
|
session.add(versemeta)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
def createBook(self, bookid, bookname, bookabbrev):
|
# def createBook(self, bookid, bookname, bookabbrev):
|
||||||
log.debug( "createBook %s,%s,%s", bookid, bookname, bookabbrev)
|
# log.debug( "createBook %s,%s,%s", bookid, bookname, bookabbrev)
|
||||||
metadata.bind.echo = False
|
# metadata.bind.echo = False
|
||||||
session = self.Session()
|
# session = self.Session()
|
||||||
bookmeta = Book(int(5), bookname, bookabbrev)
|
# bookmeta = Book(int(5), bookname, bookabbrev)
|
||||||
session.add(bookmeta)
|
# session.add(bookmeta)
|
||||||
session.commit()
|
# session.commit()
|
||||||
|
|
||||||
def saveMeta(self, key, value):
|
def saveMeta(self, key, value):
|
||||||
metadata.bind.echo = False
|
metadata.bind.echo = False
|
||||||
@ -185,7 +187,7 @@ class BibleDBImpl(BibleCommon):
|
|||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
def getMeta(self, key):
|
def getMeta(self, key):
|
||||||
s = text (""" select value FROM meta where key == :k """)
|
s = text (""" select value FROM metadata where key == :k """)
|
||||||
return self.db.execute(s, k=key).fetchone()
|
return self.db.execute(s, k=key).fetchone()
|
||||||
|
|
||||||
def deleteMeta(self, key):
|
def deleteMeta(self, key):
|
||||||
@ -193,18 +195,35 @@ class BibleDBImpl(BibleCommon):
|
|||||||
s = text (""" delete FROM meta where key == :k """)
|
s = text (""" delete FROM meta where key == :k """)
|
||||||
self.db.execute(s, k=key)
|
self.db.execute(s, k=key)
|
||||||
|
|
||||||
def _loadTestaments(self):
|
# def _loadTestaments(self):
|
||||||
log.debug("loadTestaments")
|
# log.debug("loadTestaments")
|
||||||
metadata.bind.echo = False
|
# metadata.bind.echo = False
|
||||||
session = self.Session()
|
# session = self.Session()
|
||||||
testmeta = ONTestament(name="Old Testament")
|
# testmeta = ONTestament(name="Old Testament")
|
||||||
session.add(testmeta)
|
# session.add(testmeta)
|
||||||
testmeta = ONTestament(name="New Testament")
|
# testmeta = ONTestament(name="New Testament")
|
||||||
session.add(testmeta)
|
# session.add(testmeta)
|
||||||
testmeta = ONTestament(name="Apocrypha")
|
# testmeta = ONTestament(name="Apocrypha")
|
||||||
session.add(testmeta)
|
# session.add(testmeta)
|
||||||
session.commit()
|
# session.commit()
|
||||||
|
def getBibleBooks(self):
|
||||||
|
log.debug( "getBibleBook ")
|
||||||
|
metadata.bind.echo = False
|
||||||
|
s = text (""" select name FROM book order by id """)
|
||||||
|
return self.db.execute(s).fetchall()
|
||||||
|
|
||||||
|
def getMaxBibleBookVerses(self, bookname, chapter):
|
||||||
|
log.debug( "getMaxBibleBookVerses %s,%s ", bookname , chapter)
|
||||||
|
metadata.bind.echo = False
|
||||||
|
s = text (""" 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 getMaxBibleBookChapters(self, bookname):
|
||||||
|
log.debug( "getMaxBibleBookChapters %s ", bookname )
|
||||||
|
metadata.bind.echo = False
|
||||||
|
s = text (""" 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 getBibleBook(self, bookname):
|
def getBibleBook(self, bookname):
|
||||||
log.debug( "getBibleBook %s", bookname)
|
log.debug( "getBibleBook %s", bookname)
|
||||||
metadata.bind.echo = False
|
metadata.bind.echo = False
|
||||||
@ -224,11 +243,18 @@ class BibleDBImpl(BibleCommon):
|
|||||||
return self.db.execute(s, c=chapter, b=bookname).fetchone()
|
return self.db.execute(s, c=chapter, b=bookname).fetchone()
|
||||||
|
|
||||||
def getBibleText(self, bookname, chapter, sverse, everse):
|
def getBibleText(self, bookname, chapter, sverse, everse):
|
||||||
log.debug( "getBibleText %s,%s,%s,%s", bookname, chapter, sverse, everse)
|
log.debug( "getBibleText %s,%s,%s,%s ", bookname, chapter, sverse, everse)
|
||||||
metadata.bind.echo = False
|
metadata.bind.echo = False
|
||||||
s = text (""" select 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 == :b """)
|
s = text (""" select 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 == :b """)
|
||||||
return self.db.execute(s, c=chapter, v1=sverse , v2=everse, b=bookname).fetchall()
|
return self.db.execute(s, c=chapter, v1=sverse , v2=everse, b=bookname).fetchall()
|
||||||
|
|
||||||
|
def getVersesFromText(self,versetext):
|
||||||
|
log.debug( "getBibleText %s",versetext)
|
||||||
|
metadata.bind.echo = False
|
||||||
|
versetext = "%"+versetext+"%"
|
||||||
|
s = text (""" 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 dumpBible(self):
|
def dumpBible(self):
|
||||||
log.debug( ".........Dumping Bible Database")
|
log.debug( ".........Dumping Bible Database")
|
||||||
log.debug( "...............................Books ")
|
log.debug( "...............................Books ")
|
||||||
|
@ -22,10 +22,11 @@ mypath=os.path.split(os.path.abspath(__file__))[0]
|
|||||||
sys.path.insert(0,(os.path.join(mypath, '..', '..', '..')))
|
sys.path.insert(0,(os.path.join(mypath, '..', '..', '..')))
|
||||||
|
|
||||||
from openlp.utils import ConfigHelper
|
from openlp.utils import ConfigHelper
|
||||||
|
from openlp.plugins.biblemanager.BibleOSISImpl import BibleOSISImpl
|
||||||
|
from openlp.plugins.biblemanager.BibleCSVImpl import BibleCSVImpl
|
||||||
from openlp.plugins.biblemanager.BibleDBImpl import BibleDBImpl
|
from openlp.plugins.biblemanager.BibleDBImpl import BibleDBImpl
|
||||||
from openlp.plugins.biblemanager.BibleHTTPImpl import BibleHTTPImpl
|
from openlp.plugins.biblemanager.BibleHTTPImpl import BibleHTTPImpl
|
||||||
from openlp.plugins.biblemanager.BibleCSVImpl import BibleCSVImpl
|
from openlp.plugins.biblemanager.BibleLibrary import BibleLibrary
|
||||||
from openlp.plugins.biblemanager.BibleOSISImpl import BibleOSISImpl
|
|
||||||
from openlp.plugins.plugin import Plugin
|
from openlp.plugins.plugin import Plugin
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -50,17 +51,10 @@ class BibleManager(Plugin):
|
|||||||
log.debug( "Bible Initialising")
|
log.debug( "Bible Initialising")
|
||||||
self.bibleDBCache = {} # dict of bible database classes
|
self.bibleDBCache = {} # dict of bible database classes
|
||||||
self.bibleHTTPCache = {} # dict of bible http readers
|
self.bibleHTTPCache = {} # dict of bible http readers
|
||||||
self.booksOfBible = {} # books of the bible linked to bibleid
|
|
||||||
self.listOfBooks = [] # list of books for display
|
|
||||||
self.booksChapters = {} # number of chapters for each bible id
|
|
||||||
self.BGids = {} # BibleGateway IDs id for bibleid
|
|
||||||
#self.verses = {} # number of verses for each book
|
|
||||||
self.verseData = {} # number of versers in each chapter by bookid
|
|
||||||
self.biblePath = ConfigHelper.getBiblePath()
|
self.biblePath = ConfigHelper.getBiblePath()
|
||||||
|
self.bibleLibrary = BibleLibrary()
|
||||||
#log.debug( self.biblePath )
|
#log.debug( self.biblePath )
|
||||||
files = os.listdir(self.biblePath)
|
files = os.listdir(self.biblePath)
|
||||||
fbibles=open("../resources/bibles_en.txt", 'r')
|
|
||||||
fbibledata=open("../resources/bible_books.txt", 'r')
|
|
||||||
for f in files:
|
for f in files:
|
||||||
b = f.split('.')[0]
|
b = f.split('.')[0]
|
||||||
self.bibleDBCache[b] = BibleDBImpl(b)
|
self.bibleDBCache[b] = BibleDBImpl(b)
|
||||||
@ -72,24 +66,7 @@ class BibleManager(Plugin):
|
|||||||
proxy = self.bibleDBCache[b].getMeta("proxy") # look to see if lazy load bible exists and get create getter.
|
proxy = self.bibleDBCache[b].getMeta("proxy") # look to see if lazy load bible exists and get create getter.
|
||||||
nhttp.setProxy(proxy) # tell The Server where to get the verses from.
|
nhttp.setProxy(proxy) # tell The Server where to get the verses from.
|
||||||
#
|
#
|
||||||
#Load in memory objects
|
|
||||||
for line in fbibles:
|
|
||||||
p = line.split(",")
|
|
||||||
self.booksOfBible[p[0]] = p[1].replace('\n', '')
|
|
||||||
self.listOfBooks.insert(int(p[1].replace('\n', '')), p[0])
|
|
||||||
for line in fbibledata:
|
|
||||||
p = line.split(",")
|
|
||||||
self.booksChapters[p[0]]=p[1]
|
|
||||||
self.BGids[p[0]]=p[2].replace('\n', '')
|
|
||||||
v = p[3].replace('\n', '')
|
|
||||||
self.verseData[p[0]] = v
|
|
||||||
#log.debug( "\nbooks of the Bible", self.booksOfBible)
|
|
||||||
#log.debug( "\n", self.booksChapters)
|
|
||||||
#log.debug( "\n", self.CWids)
|
|
||||||
#log.debug( "\n", self.verseData)
|
|
||||||
|
|
||||||
#log.debug( self.bibleDBCache)
|
|
||||||
#log.debug( self.bibleHTTPCache )
|
|
||||||
log.debug( "Bible Initialised")
|
log.debug( "Bible Initialised")
|
||||||
|
|
||||||
def registerHTTPBible(self, biblename, biblesource, proxyurl=None, proxyid=None, proxypass=None):
|
def registerHTTPBible(self, biblename, biblesource, proxyurl=None, proxyid=None, proxypass=None):
|
||||||
@ -173,51 +150,53 @@ class BibleManager(Plugin):
|
|||||||
|
|
||||||
def getBibleBooks(self,bible):
|
def getBibleBooks(self,bible):
|
||||||
"""
|
"""
|
||||||
Returns a list of the books of the bible
|
Returns a list of the books of the bible from the database
|
||||||
"""
|
"""
|
||||||
return self.listOfBooks
|
return self.bibleDBCache[bible].getBibleBooks()
|
||||||
|
|
||||||
def getBookChapterCount(self, book):
|
def getBookChapterCount(self,bible, book):
|
||||||
"""
|
"""
|
||||||
Returns all the number of Chapters for a given
|
Returns the number of Chapters for a given book
|
||||||
book
|
|
||||||
"""
|
"""
|
||||||
log.debug( "getBookChapterCount %s", book)
|
log.debug( "getBookChapterCount %s,%s", bible, book)
|
||||||
bookid = self.booksOfBible[book]
|
return self.bibleDBCache[bible].getMaxBibleBookChapters(book)
|
||||||
return self.booksChapters[bookid]
|
|
||||||
|
|
||||||
def getBookVerseCount(self, book, chapter):
|
def getBookVerseCount(self, bible, book, chapter):
|
||||||
"""
|
"""
|
||||||
Returns all the number of verses for a given
|
Returns all the number of verses for a given
|
||||||
book and chapter
|
book and chapterMaxBibleBookVerses
|
||||||
"""
|
"""
|
||||||
log.debug( "getBookVerseCount %s,%s", book, chapter)
|
log.debug( "getBookVerseCount %s,%s,%s", bible, book, chapter)
|
||||||
bookid = self.booksOfBible[book]
|
return self.bibleDBCache[bible].getMaxBibleBookVerses(book, chapter)
|
||||||
v = self.verseData[bookid].split(":")
|
|
||||||
log.debug( v)
|
|
||||||
return v[chapter-1] # sub 1 for zero indexing
|
|
||||||
|
|
||||||
def getVerseText(self, bible, bookname, chapter, sverse, everse = 0 ):
|
def getVersesFromText(self, bible, versetext):
|
||||||
|
"""
|
||||||
|
Returns all the number of verses for a given
|
||||||
|
book and chapterMaxBibleBookVerses
|
||||||
|
"""
|
||||||
|
log.debug( "getVersesFromText %s,%s", bible, versetext)
|
||||||
|
return self.bibleDBCache[bible].getVersesFromText(versetext)
|
||||||
|
|
||||||
|
def getVerseText(self, bible, bookname, chapter, sverse, everse = 0 ):
|
||||||
"""
|
"""
|
||||||
Returns a list of verses for a given Book, Chapter and ranges of verses.
|
Returns a list of verses for a given Book, Chapter and ranges of verses.
|
||||||
If the end verse(everse) is less then the start verse(sverse)
|
If the end verse(everse) is less then the start verse(sverse)
|
||||||
then only one verse is returned
|
then only one verse is returned
|
||||||
bible - Which bible to use.
|
bible - Which bible to use.
|
||||||
bookname - full text description so needs to be converted.
|
|
||||||
Rest can be guessed at !
|
Rest can be guessed at !
|
||||||
"""
|
"""
|
||||||
#log.debug( self.bibleDBCache)
|
#log.debug( self.bibleDBCache)
|
||||||
#log.debug( self.bibleHTTPCache)
|
#log.debug( self.bibleHTTPCache)
|
||||||
log.debug( "getVerseText %s,%s,%s,%s,%s", bible, bookname, chapter, sverse, everse)
|
log.debug( "getVerseText %s,%s,%s,%s,%s", bible,bookname, chapter, sverse, everse)
|
||||||
bookid = self.booksOfBible[bookname] # convert to id ie Genesis --> 1 Revelation --> 73
|
# bookid = self.booksOfBible[bookname] # convert to id ie Genesis --> 1 Revelation --> 73
|
||||||
# SORT OUT BOOKNAME BOOK ID.
|
# # SORT OUT BOOKNAME BOOK ID.
|
||||||
# NAME COMES IN TO ID AND BACK TO NAME ?
|
# # NAME COMES IN TO ID AND BACK TO NAME ?
|
||||||
c = self.bibleDBCache[bible].getBibleChapter(bookname, chapter) # check to see if book/chapter exists
|
# c = self.bibleDBCache[bible].getBibleChapter(bookname, chapter) # check to see if book/chapter exists
|
||||||
bookabbrev = ""
|
# bookabbrev = ""
|
||||||
log.debug( "Bible Chapter %s", c )
|
# log.debug( "Bible Chapter %s", c )
|
||||||
if not c:
|
# if not c:
|
||||||
self._loadBook(bible,bookid, bookname, bookabbrev)
|
# self._loadBook(bible,bookid, bookname, bookabbrev)
|
||||||
self._loadChapter(bible, bookid,bookname, chapter)
|
# self._loadChapter(bible, bookid,bookname, chapter)
|
||||||
if everse < sverse:
|
if everse < sverse:
|
||||||
everse = sverse
|
everse = sverse
|
||||||
text = self.bibleDBCache[bible].getBibleText(bookname, chapter, sverse, everse)
|
text = self.bibleDBCache[bible].getBibleText(bookname, chapter, sverse, everse)
|
||||||
@ -232,7 +211,7 @@ class BibleManager(Plugin):
|
|||||||
if not cl :
|
if not cl :
|
||||||
self.bibleDBCache[bible].createBook(bookid, bookname, bookabbrev)
|
self.bibleDBCache[bible].createBook(bookid, bookname, bookabbrev)
|
||||||
|
|
||||||
def _loadChapter(self, bible, bookid,bookname, chapter):
|
def _loadChapter(self, bible, bookid, bookname, chapter):
|
||||||
log.debug( "loadChapter %s,%s,%s,%s", bible, bookid,bookname, chapter)
|
log.debug( "loadChapter %s,%s,%s,%s", bible, bookid,bookname, chapter)
|
||||||
try :
|
try :
|
||||||
chaptlist = self.bibleHTTPCache[bible].getBibleChapter(bible, bookid,bookname, chapter)
|
chaptlist = self.bibleHTTPCache[bible].getBibleChapter(bible, bookid,bookname, chapter)
|
||||||
|
Loading…
Reference in New Issue
Block a user