diff --git a/openlp/database/BibleDBImpl.py b/openlp/database/BibleDBImpl.py index 6bb230e76..0c00e414f 100644 --- a/openlp/database/BibleDBImpl.py +++ b/openlp/database/BibleDBImpl.py @@ -24,9 +24,7 @@ import string from sqlalchemy import * from sqlalchemy.sql import select -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker - +from sqlalchemy.orm import sessionmaker, mapper mypath=os.path.split(os.path.abspath(__file__))[0] sys.path.insert(0,(os.path.join(mypath, '..', '..'))) @@ -34,12 +32,37 @@ from openlp.utils import ConfigHelper logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s') -Base = declarative_base() +metadata = MetaData() #Define the tables and indexes -class BibleMeta(Base): - __tablename__ = "meta" - key = Column(String(255), primary_key=True) - value = Column(String(255)) +meta_table = Table('meta', metadata, + Column('key', String(255), primary_key=True), + Column('value', String(255)), +) + +testament_table = Table('testament', metadata, + Column('id', Integer, primary_key=True), + Column('name', String(30)), +) + +book_table = Table('book', metadata, + Column('id', Integer, primary_key=True), + Column('testament_id', None , ForeignKey('testament.id')), + Column('name', String(30)), + Column('abbrev', String(30)), +) +Index('idx_name', book_table.c.name, book_table.c.id) +Index('idx_abbrev', book_table.c.abbrev, book_table.c.id) + +verse_table = Table('verse', metadata, + Column('id', Integer, primary_key=True), + Column('book_id', None, ForeignKey('book.id')), + Column('chapter', Integer), + Column('verse', Integer), + 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) + +class BibleMeta(object): def __init__(self, key, value): self.key = key self.value =value @@ -47,38 +70,23 @@ class BibleMeta(Base): def __repr__(self): return "" %(self.key, self.value) -class Testament(Base): - __tablename__ = "testament" - id = Column(Integer, primary_key=True) - name = Column(String(30)) +class Testament(object): def __init__(self, name): self.name = name def __repr__(self): return "" %(self.name) -class Books(Base): - __tablename__ = "books" - id = Column(Integer, primary_key=True) - testament_id = Column(Integer) - name = Column(String(30)) - abbrev = Column(String(30)) +class Book(object): def __init__(self, testament_id, name, abbrev): self.testament_id = testament_id self.name = name self.abbrev = abbrev def __repr__(self): - return "" %(self.testament_id, self.name, self.abbrev) + return "" %(self.id, self.testament_id, self.name, self.abbrev) -class Verses(Base): - __tablename__ = "verses" - id = Column(Integer, primary_key=True) - book_id = Column(Integer) - chapter = Column(Integer) - verse = Column(Integer) - text = Column(Text) - +class Verse(object): def __init__(self, book_id, chapter, verse, text): self.book_id = book_id self.chapter = chapter @@ -86,8 +94,12 @@ class Verses(Base): self.text = text def __repr__(self): - return "" %(self.book_id, self.chapter, self.verse, self.text) + return "" %(self.book_id, self.chapter, self.verse, self.text) +mapper(BibleMeta, meta_table) +mapper(Testament, testament_table) +mapper(Book, book_table) +mapper(Verse, verse_table) class BibleDBImpl: def __init__(self, biblename): @@ -99,17 +111,23 @@ class BibleDBImpl: #print self.biblefile self.db = create_engine("sqlite:///"+self.biblefile) self.db.echo = False - self.metadata = MetaData() - self.metadata = Base.metadata - self.metadata.bind = self.db - self.metadata.bind.echo = False + #self.metadata = metaData() + metadata.bind = self.db + metadata.bind.echo = False def createTables(self): if os.path.exists(self.biblefile): # delete bible file and set it up again os.remove(self.biblefile) - self.metadata.create_all(self.db) + meta_table.create() + testament_table.create() + book_table.create() + verse_table.create() self.Session = sessionmaker() self.Session.configure(bind=self.db) +# i1 = Index('idx_name', Books.c.name, Books.c.id) +# i1.create(bind=self.db) +# i2 = Index('idx_abbrev', Books.c.abbrev, Books.c.id) +# i2.create(bind=self.db) def loadData(self, booksfile, versesfile): session = self.Session() @@ -134,9 +152,9 @@ class BibleDBImpl: fverse=open(versesfile, 'r') for line in fbooks: - print line + #print line p = line.split(",") - bookmeta = Books(int(p[1]), p[2], p[3]) + bookmeta = Book(int(p[1]), p[2], p[3]) session.add(bookmeta) session.commit() @@ -146,24 +164,39 @@ class BibleDBImpl: book_ptr = "" for line in fverse: - print line + #print line p = line.split(",", 3) # split into 3 units and leave the rest as a single field if book_ptr is not p[0]: - query = session.query(Books).filter(Books.name==p[0]) - print query.first().id + query = session.query(Book).filter(Book.name==p[0]) + #print query.first().id book_ptr = p[0] - print p[3] - versemeta = Verses(book_id=query.first().id, chapter=int(p[1]), verse=int(p[2]), text=p[3]) + #print p[3] + versemeta = Verse(book_id=query.first().id, chapter=int(p[1]), verse=int(p[2]), text=p[3]) session.add(versemeta) session.commit() + def getBibleText(self, bookname, chapter, verse): + s = text (""" select text FROM verse,book where verse.book_id == book.id AND verse.chapter == :c and verse.verse == :v and book.name == :b """) + return self.db.execute(s, c=chapter, v=verse , b=bookname).fetchone() + def Run_Tests(self): + metadata.bind.echo = True print "test print" session = self.Session() - print session.query(Books).filter(Books.name=='"John"').all() - print session.query(Verses).filter(Verses.book_id==9).all() - #print b - #v = self.db.execute(verses.select(verses.c.chapter==1 and verses.c.verse==1 and verses.c.book_id == b[0])).fetchone() - #print v + print session.query(Book).filter(Book.name=='"John"').all() + q = session.query(Verse).filter(Verse.book_id==8) + print q.first().text + + q = session.query(Verse, Book).filter(Verse.chapter==1).filter(Verse.verse==1).filter(Book.name=='"Genesis"') + print "--" + print q.first()[0].text + print q.first()[1].name + print "----" + ch =1 + vs = 1 + bk = '"Genesis"' + s = text (""" select text FROM verse,book where verse.book_id == book.id AND verse.chapter == :c and verse.verse == :v and book.name == :b """) + print self.db.execute(s, c=ch, v=vs , b=bk).fetchall() + diff --git a/openlp/database/BibleManager.py b/openlp/database/BibleManager.py index 9f9b2b5f3..3b8ce7c6f 100644 --- a/openlp/database/BibleManager.py +++ b/openlp/database/BibleManager.py @@ -22,7 +22,8 @@ mypath=os.path.split(os.path.abspath(__file__))[0] sys.path.insert(0,(os.path.join(mypath, '..', '..'))) from openlp.utils import ConfigHelper -from openlp.database.BibleImpl import * +from openlp.database.BibleDBImpl import * +from openlp.database.BibleHTTPImpl import * class BibleManager: def __init__(self): @@ -42,11 +43,32 @@ class BibleManager: files = os.listdir(self.biblePath) for f in files: b = f.split('.')[0] - self.biblelist[b] = BibleImpl(b) + self.biblelist[b] = BibleDBImpl(b) #print self.biblelist - - + def registerBible(self, name, biblesource, proxy, proxyport, proxyid, proxypass): + """ + Return a list of bibles from a given URL. + The selected Bible can then be registered and LazyLoaded into a database + """ + def registerBible(self, name, booksfile, versefile): + """ + Method to load a bible from a set of files into a database. + If the database exists it is deleted and the database is reloaded + from scratch. + """ + newbible = True + for b , o in self.biblelist.iteritems(): + print b + if b == name : + newbible = False + print "bible already registered" + if newbible == True : + nbible = BibleDBImpl(name) # Create new Bible + nbible.createTables() # Create Database + nbible.loadData(booksfile, versefile) + self.biblelist[name] = nbible + def getBibles(self): """ Returns a list of Books of the bible @@ -75,8 +97,6 @@ class BibleManager: If the end verse(everse) is less then the start verse(sverse) then only one verse is returned """ - if everse < sverse: - print "adjusted end verse" - everse = sverse - return ["In the Beginning was the Word","God made the world as saw it was good"] + text = self.biblelist[bible].getBibleText(book, chapter, sverse) + return text diff --git a/openlp/database/test/testBibleLoader.py b/openlp/database/test/testBibleLoader.py index 92eec3eb3..a79ca81fc 100644 --- a/openlp/database/test/testBibleLoader.py +++ b/openlp/database/test/testBibleLoader.py @@ -1,17 +1,34 @@ +""" +OpenLP - Open Source Lyrics Projection +Copyright (c) 2008 Raoul Snyman +Portions copyright (c) 2008 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, os.path import sys mypath=os.path.split(os.path.abspath(__file__))[0] sys.path.insert(0,(os.path.join(mypath, '..', '..','..'))) -from openlp.database.BibleImpl import * +from openlp.database.BibleDBImpl import * if __name__ == "__main__": - bi = BibleImpl("TheMessage") + bi = BibleDBImpl("TheMessage") bi.createTables() bi.loadData('biblebooks_msg_short.csv','bibleverses_msg_short.csv') bi.Run_Tests() - b2 = BibleImpl("NIV") - b2.createTables() - b2.loadData('biblebooks_niv_short.csv','bibleverses_niv_short.csv') - b2.Run_Tests() +# b2 = BibleDBImpl("NIV") +# b2.createTables() +# b2.loadData('biblebooks_niv_short.csv','bibleverses_niv_short.csv') +# b2.Run_Tests() diff --git a/openlp/database/test/testBibleManager.py b/openlp/database/test/testBibleManager.py index 006e5cd2c..970c8fcfe 100644 --- a/openlp/database/test/testBibleManager.py +++ b/openlp/database/test/testBibleManager.py @@ -31,7 +31,18 @@ class TestBibleManager(unittest.TestCase): def setUp(self): self.bm = BibleManager() + def testRegisterBibleFiles(self): + # make sure the shuffled sequence does not lose any elements + print "testRegisterBibleFiles" + self.bm.registerBible("TheMessage",'biblebooks_msg_short.csv','bibleverses_msg_short.csv') + self.bm.registerBible("NIV",'biblebooks_niv_short.csv','bibleverses_niv_short.csv') + b = self.bm.getBibles() + for b1 in b: + print b1 + self.assert_(b1 in b) + def testGetBibles(self): + print "testGetBibles" # make sure the shuffled sequence does not lose any elements b = self.bm.getBibles() for b1 in b: @@ -39,19 +50,22 @@ class TestBibleManager(unittest.TestCase): self.assert_(b1 in b) def testGetBooks(self): + print "testGetBooks" c = self.bm.getBibleBooks("NIV") for c1 in c: print c1 self.assert_(c1 in c) - def testGetBooks(self): + def testGetVerseCount(self): + print "testGetVerseCount" self.failUnless(self.bm.getBookVerseCount("NIV", "GEN", 1) == 28, "Wrong Book Count") def testGetVerseText(self): - c = self.bm.getVerseText("NIV","GEN",1,2,1) - for c1 in c: - print c1 - self.assert_(c1 in c) + print "testGetVerseText" + c = self.bm.getVerseText("TheMessage",'"Genesis"',1,2,1) + print c + c = self.bm.getVerseText("NIV",'"Genesis"',1,2,1) + print c if __name__ == '__main__': unittest.main()