From fbb7c0349e46cd0e4f7aec70af38afb7d7bc4a7e Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sun, 18 Oct 2009 16:19:57 +0100 Subject: [PATCH 1/2] Windows/Linux sqlite2 -> sqlite3 migration in one step --- openlp/migration/migratesongs.py | 12 ++--- openlpcnv.pyw | 77 ++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/openlp/migration/migratesongs.py b/openlp/migration/migratesongs.py index 51695b9cb..8fced1650 100644 --- a/openlp/migration/migratesongs.py +++ b/openlp/migration/migratesongs.py @@ -170,12 +170,12 @@ class MigrateSongs(): else: author = self.session.query(Author).get(bb[0]) song.authors.append(author) - try: - self.session.add(song) - self.session.commit() - except: - self.session.rollback() - print u'Errow thrown = ', sys.exc_info()[1] + try: + self.session.add(song) + self.session.commit() + except: + self.session.rollback() + print u'Error thrown = ', sys.exc_info()[1] def _v1_9_0_cleanup(self, database): self.display.sub_output(u'Update Internal Data ' + database) diff --git a/openlpcnv.pyw b/openlpcnv.pyw index 98e391f81..3aaf6dfee 100755 --- a/openlpcnv.pyw +++ b/openlpcnv.pyw @@ -26,12 +26,26 @@ import os import logging import time +import subprocess +import codecs +import sys +from datetime import date +if os.name == u'nt': + import win32api + import win32con + from win32com.client import Dispatch from openlp.migration.display import * from openlp.migration.migratefiles import * from openlp.migration.migratebibles import * from openlp.migration.migratesongs import * +############################################################################### +# For Windows, requires SQLite ODBC Driver to be installed +# (uses sqlite.exe and sqlite3.exe) +# http://www.ch-werner.de/sqliteodbc/ +############################################################################### + logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', @@ -69,8 +83,71 @@ class Migration(object): self.display.output(u'Migration Utility Finished ') os.rename(fname, b) + def convert_file(self, inname, outname): + """ + Convert a file from another encoding into UTF-8. + + ``inname`` + The name of the file to be opened and converted. + + ``outname`` + The output file name. + """ + infile = codecs.open(inname, 'r', encoding='CP1252') + writefile = codecs.open(outname, 'w', encoding='utf-8') + for line in infile: + #replace the quotes with quotes + #TODO fix double quotes + #line = line.replace(u'\'\'', u'@') + writefile.write(line) + infile.close() + writefile.close() + + def convert_sqlite2_to_3(self, olddb, newdb): + if os.name == u'nt': + hKey = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, u'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\SQLite ODBC Driver') + value, type = win32api.RegQueryValueEx (hKey, "UninstallString") + sqlitepath, temp = os.path.split(value) + sqliteexe = os.path.join(sqlitepath, u'sqlite.exe') + else: + sqliteexe = u'sqlite' + cmd = sqliteexe + u' "' + olddb + u'" .dump' + if os.name == u'nt': + subprocess.call(cmd, stdout=open(u'./sqlite.dmp', 'w')) + else: + subprocess.call(cmd, stdout=open(u'./sqlite.dmp', 'w'), shell=True) + self.convert_file(u'sqlite.dmp', u'sqlite3.dmp') + if os.name == u'nt': + sqlite3exe = os.path.join(sqlitepath, u'sqlite3.exe') + else: + sqlite3exe = u'sqlite3' + if os.path.isfile(newdb): + saveddb = newdb + self.stime + os.rename(newdb, saveddb) + cmd = sqlite3exe + ' "' + newdb + '"' + if os.name == u'nt': + subprocess.call(cmd, stdin=open('sqlite3.dmp', 'r')) + else: + subprocess.call(cmd, stdin=open('sqlite3.dmp', 'r'), shell=True) + os.remove(u'sqlite.dmp') + os.remove(u'sqlite3.dmp') + if __name__ == '__main__': mig = Migration() + config = PluginConfig(u'Songs') + newpath = config.get_data_path() + if os.name == u'nt': + if not os.path.isdir(newpath): + os.makedirs(newpath) + ALL_USERS_APPLICATION_DATA = 35 + shell = Dispatch("Shell.Application") + folder = shell.Namespace(ALL_USERS_APPLICATION_DATA) + folderitem = folder.Self + olddb = os.path.join(folderitem.path, u'openlp.org', u'Data', u'songs.olp') + else: + olddb = os.path.join(newpath, u'songs.olp') + newdb = os.path.join(newpath, u'songs.sqlite') + mig.convert_sqlite2_to_3(olddb, newdb) mig.process() #mig.move_log_file() From d6fada90e2c6f46043f74bd0de9708c733d28395 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sun, 18 Oct 2009 22:07:57 +0100 Subject: [PATCH 2/2] Fix code standard issues. Remove redundant modules --- cnvdb.py | 61 --------------------------------------------------- openlpcnv.pyw | 38 ++++++++++++++------------------ songcnv.sh | 5 ----- 3 files changed, 17 insertions(+), 87 deletions(-) delete mode 100755 cnvdb.py delete mode 100755 songcnv.sh diff --git a/cnvdb.py b/cnvdb.py deleted file mode 100755 index 1e1acdd32..000000000 --- a/cnvdb.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2009 Raoul Snyman # -# Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, Carsten # -# Tinggaard, Jon Tibble, Jonathan Corwin, Maikel Stuivenberg, Scott Guerrieri # -# --------------------------------------------------------------------------- # -# 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 codecs -import sys - -def convert_file(inname, outname): - """ - Convert a file from another encoding into UTF-8. - - ``inname`` - The name of the file to be opened and converted. - - ``outname`` - The output file name. - """ - infile = codecs.open(inname, 'r', encoding='CP1252') - writefile = codecs.open(outname, 'w', encoding='utf-8') - for line in infile: - #replace the quotes with quotes - #TODO fix double quotes - #line = line.replace(u'\'\'', u'@') - writefile.write(line) - infile.close() - writefile.close() - -if __name__ == '__main__': - """ - Run the conversion script. - """ - if len(sys.argv) < 2: - print 'No action specified.' - sys.exit() - print 'Uncode conversion:' - print 'Input file = ', sys.argv[1] - print 'Output file = ', sys.argv[2] - print 'Converting...' - convert_file(sys.argv[1], sys.argv[2]) - print 'Done.' diff --git a/openlpcnv.pyw b/openlpcnv.pyw index 3aaf6dfee..d76f0d76b 100755 --- a/openlpcnv.pyw +++ b/openlpcnv.pyw @@ -47,10 +47,10 @@ from openlp.migration.migratesongs import * ############################################################################### logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', - datefmt='%m-%d %H:%M', - filename='openlp-migration.log', - filemode='w') + format=u'%(asctime)s %(name)-12s %(levelname)-8s %(message)s', + datefmt=u'%m-%d %H:%M', + filename=u'openlp-migration.log', + filemode=u'w') class Migration(object): """ @@ -76,10 +76,10 @@ class Migration(object): """ Move the log file to a new location. """ - fname = 'openlp-migration.log' + fname = u'openlp-migration.log' c = os.path.splitext(fname) b = (c[0]+'-'+ unicode(self.stime) + c[1]) - self.display.output(u'Logfile " +b + " generated') + self.display.output(u'Logfile ' + b + u' generated') self.display.output(u'Migration Utility Finished ') os.rename(fname, b) @@ -93,12 +93,9 @@ class Migration(object): ``outname`` The output file name. """ - infile = codecs.open(inname, 'r', encoding='CP1252') - writefile = codecs.open(outname, 'w', encoding='utf-8') + infile = codecs.open(inname, u'r', encoding=u'CP1252') + writefile = codecs.open(outname, u'w', encoding=u'utf-8') for line in infile: - #replace the quotes with quotes - #TODO fix double quotes - #line = line.replace(u'\'\'', u'@') writefile.write(line) infile.close() writefile.close() @@ -106,16 +103,16 @@ class Migration(object): def convert_sqlite2_to_3(self, olddb, newdb): if os.name == u'nt': hKey = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, u'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\SQLite ODBC Driver') - value, type = win32api.RegQueryValueEx (hKey, "UninstallString") + value, type = win32api.RegQueryValueEx (hKey, u'UninstallString') sqlitepath, temp = os.path.split(value) sqliteexe = os.path.join(sqlitepath, u'sqlite.exe') else: sqliteexe = u'sqlite' - cmd = sqliteexe + u' "' + olddb + u'" .dump' + cmd = u'%s "%s" .dump' % (sqliteexe, olddb) if os.name == u'nt': - subprocess.call(cmd, stdout=open(u'./sqlite.dmp', 'w')) + subprocess.call(cmd, stdout=open(u'./sqlite.dmp', u'w')) else: - subprocess.call(cmd, stdout=open(u'./sqlite.dmp', 'w'), shell=True) + subprocess.call(cmd, stdout=open(u'./sqlite.dmp', u'w'), shell=True) self.convert_file(u'sqlite.dmp', u'sqlite3.dmp') if os.name == u'nt': sqlite3exe = os.path.join(sqlitepath, u'sqlite3.exe') @@ -124,16 +121,15 @@ class Migration(object): if os.path.isfile(newdb): saveddb = newdb + self.stime os.rename(newdb, saveddb) - cmd = sqlite3exe + ' "' + newdb + '"' + cmd = '%s "%s"' % (sqlite3exe, newdb) if os.name == u'nt': - subprocess.call(cmd, stdin=open('sqlite3.dmp', 'r')) + subprocess.call(cmd, stdin=open(u'sqlite3.dmp', u'r')) else: - subprocess.call(cmd, stdin=open('sqlite3.dmp', 'r'), shell=True) + subprocess.call(cmd, stdin=open(u'sqlite3.dmp', u'r'), shell=True) os.remove(u'sqlite.dmp') os.remove(u'sqlite3.dmp') - -if __name__ == '__main__': +if __name__ == u'__main__': mig = Migration() config = PluginConfig(u'Songs') newpath = config.get_data_path() @@ -141,7 +137,7 @@ if __name__ == '__main__': if not os.path.isdir(newpath): os.makedirs(newpath) ALL_USERS_APPLICATION_DATA = 35 - shell = Dispatch("Shell.Application") + shell = Dispatch(u'Shell.Application') folder = shell.Namespace(ALL_USERS_APPLICATION_DATA) folderitem = folder.Self olddb = os.path.join(folderitem.path, u'openlp.org', u'Data', u'songs.olp') diff --git a/songcnv.sh b/songcnv.sh deleted file mode 100755 index b7ef2a173..000000000 --- a/songcnv.sh +++ /dev/null @@ -1,5 +0,0 @@ -/usr/bin/sqlite ~/.local/share/openlp/songs/songs.olp .dump > ~/.local/share/openlp/songs/songs.dmp -./cnvdb.py ~/.local/share/openlp/songs/songs.dmp ~/.local/share/openlp/songs/songs.dmp2 -rm ~/.local/share/openlp/songs/songs.sqlite -sqlite3 ~/.local/share/openlp/songs/songs.sqlite < ~/.local/share/openlp/songs/songs.dmp2 -./openlpcnv.pyw