diff --git a/controller/Database.py b/controller/Database.py index f360b6c..bde59c7 100644 --- a/controller/Database.py +++ b/controller/Database.py @@ -1,5 +1,7 @@ import re import os +import os.path +import sys import sha import cherrypy import random @@ -23,7 +25,7 @@ class Database( object ): # caching Notebooks causes problems because different users have different read_write/owner values CLASSES_NOT_TO_CACHE = ( Notebook, ) - def __init__( self, connection = None, cache = None, host = None, ssl_mode = None ): + def __init__( self, connection = None, cache = None, host = None, ssl_mode = None, data_dir = None ): """ Create a new database and return it. @@ -33,9 +35,12 @@ class Database( object ): @param cache: existing memory cache to use (optional, defaults to making a cache) @type host: unicode or NoneType @param host: hostname of PostgreSQL database, or None to use a local SQLite database - @type ssl_mode: unicode + @type ssl_mode: unicode or NoneType @param ssl_mode: SSL mode for the database connection, one of "disallow", "allow", "prefer", or "require". ignored if host is None + @type data_dir: unicode or NoneType + @param data_dir: directory in which to store data (defaults to a reasonable directory). ignored + if host is not None @rtype: Database @return: newly constructed Database """ @@ -65,8 +70,30 @@ class Database( object ): sqlite.register_converter( "boolean", lambda value: value in ( "t", "True", "true" ) and True or False ) sqlite.register_converter( "timestamp", convert_timestamp ) - self.__connection = connection or \ - Connection_wrapper( sqlite.connect( "luminotes.db", detect_types = sqlite.PARSE_DECLTYPES, check_same_thread = False ) ) + if connection: + self.__connection = connection + else: + if data_dir is None: + if sys.platform.startswith( "win" ): + data_dir = os.path.join( os.environ.get( "APPDATA" ), "Luminotes" ) + else: + data_dir = os.path.join( os.environ.get( "HOME", "" ), ".luminotes" ) + + data_filename = os.path.join( data_dir, "luminotes.db" ) + + # if the user doesn't yet have their own luminotes.db file, make them an initial copy + if os.path.exists( "luminotes.db" ): + if not os.path.exists( data_dir ): + import stat + os.makedirs( data_dir, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR ) + + if not os.path.exists( data_filename ): + import shutil + shutil.copyfile( "luminotes.db", data_filename ) + + self.__connection = \ + Connection_wrapper( sqlite.connect( data_filename, detect_types = sqlite.PARSE_DECLTYPES, check_same_thread = False ) ) + self.__pool = None self.__backend = Persistent.SQLITE_BACKEND else: diff --git a/setup.py b/setup.py index f6abab7..b69eaba 100755 --- a/setup.py +++ b/setup.py @@ -115,10 +115,6 @@ class InnoScript: (self.name, path) print >> ofi - print >> ofi, r"[Messages]" - print >> ofi, r"ConfirmUninstall=Are you sure you want to completely remove %1, including all of your notebooks and notes?" - print >> ofi - print >> ofi, r"[Run]" print >> ofi, r'Filename: "{app}\luminotes.exe"; Description: "Run Luminotes now"; Flags: nowait postinstall skipifsilent' print >> ofi diff --git a/tools/initdb.py b/tools/initdb.py index fc5195a..a3fd48c 100644 --- a/tools/initdb.py +++ b/tools/initdb.py @@ -133,6 +133,7 @@ def main( args = None ): database = Database( host = host, ssl_mode = cherrypy.config.configMap[ u"global" ].get( u"luminotes.db_ssl_mode" ), + data_dir = ".", ) initializer = Initializer( database, host, cherrypy.config.configMap, desktop, nuke ) diff --git a/tools/updatedb.py b/tools/updatedb.py index 9571e1d..ba601fc 100755 --- a/tools/updatedb.py +++ b/tools/updatedb.py @@ -92,6 +92,7 @@ def main( args ): database = Database( host = cherrypy.config.configMap[ u"global" ].get( u"luminotes.db_host" ), ssl_mode = cherrypy.config.configMap[ u"global" ].get( u"luminotes.db_ssl_mode" ), + data_dir = ".", ) initializer = Updater( database, cherrypy.config.configMap )