##### ##### This file is part of Mail-in-a-Box-LDAP which is released under the ##### terms of the GNU Affero General Public License as published by the ##### Free Software Foundation, either version 3 of the License, or (at ##### your option) any later version. See file LICENSE or go to ##### https://github.com/downtownallday/mailinabox-ldap for full license ##### details. ##### import os, stat import sqlite3 import logging import threading from .DatabaseConnectionFactory import DatabaseConnectionFactory log = logging.getLogger(__name__) class SqliteConnFactory(DatabaseConnectionFactory): def __init__(self, db_path): super(SqliteConnFactory, self).__init__() log.debug('factory for %s', db_path) self.db_path = db_path self.db_basename = os.path.basename(db_path) self.ensure_exists() def ensure_exists(self): # create the parent directory and set its permissions parent = os.path.dirname(self.db_path) if parent != '' and not os.path.exists(parent): os.makedirs(parent) os.chmod(parent, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH ) # if the database is new, create an empty file and set file # permissions if not os.path.exists(self.db_path): log.debug('creating empty database: %s', self.db_basename) with open(self.db_path, 'w') as fp: pass os.chmod(self.db_path, stat.S_IRUSR | stat.S_IWUSR ) def connect(self): log.debug('opening database %s', self.db_basename) conn = sqlite3.connect(self.db_path) conn.row_factory = sqlite3.Row return conn def close(self, conn): log.debug('closing database %s', self.db_basename) conn.close()