def _datasources_db2url(self, dir_version, release): """Move data source config from userdb to datasources.cfg.""" # Upgrade to 0.4.0: Data source are no longer stored in userdb. # TODO: Remove this hook in some upcoming major version. import cPickle from cf.db import Datasource from cf.db.url import URL from cf.ui import dialogs manager = DatasourceManager(self) x = self.userdb.get_table_version("datasource") if x is None: # already dropped return sql = "select name, description, backend, options, password " "from datasource" attribs = ["database", "host", "port", "user"] try: self.userdb.cursor.execute(sql) attribs.append("password") except sqlite3.OperationalError: # password column is already gone sql = "select name, description, backend, options " "from datasource" self.userdb.cursor.execute(sql) ldap_found = False for item in self.userdb.cursor.fetchall(): old_backend = item[2].split(".")[-1] opts = cPickle.loads(str(item[3])) if old_backend in ("mssql", "oracle", "mysql", "postgres"): url = URL(old_backend) for name in attribs: if name in opts: setattr(url, name, opts[name]) if len(item) == 5: url.password = item[4] ds = Datasource(manager) ds.url = url ds.name = item[0] ds.decription = item[1] ds.ask_for_password = opts.get("ask_for_password", False) manager.save(ds) elif old_backend == "sqlite": url = URL(old_backend) url.database = opts.get("filename", None) ds = Datasource(manager) ds.url = url ds.name = item[0] ds.description = item[1] ds.ask_for_password = opts.get("ask_for_password", False) manager.save(ds) elif old_backend == "ldap": ldap_found = True if ldap_found: dialogs.warning("Warning", "Sorry, LDAP server are no longer supported.") self.userdb.drop_table("datasource")
def create_url(cls, options): """Create an URL from options. :param options: A dictionary mapping :class:`GUIOption` keys with values from UI. :returns: An :class:`URL` instance. """ url = URL(cls.drivername) attr_names = ('username', 'password', 'host', 'port', 'database') backend_keys = [opt.key for opt in cls.get_options()] for key in options: if key not in backend_keys: continue elif key in attr_names and options.get(key, None) is not None: setattr(url, key, options[key]) elif options.get(key, None) is not None: url.query[key] = options[key] return url
def _datasources_db2url(self, dir_version, release): """Move data source config from userdb to datasources.cfg.""" # Upgrade to 0.4.0: Data source are no longer stored in userdb. # TODO: Remove this hook in some upcoming major version. import cPickle from cf.db import Datasource from cf.db.url import URL from cf.ui import dialogs manager = DatasourceManager(self) x = self.userdb.get_table_version('datasource') if x is None: # already dropped return sql = ('select name, description, backend, options, password ' 'from datasource') attribs = ['database', 'host', 'port', 'user'] try: self.userdb.cursor.execute(sql) attribs.append('password') except sqlite3.OperationalError: # password column is already gone sql = ('select name, description, backend, options ' 'from datasource') self.userdb.cursor.execute(sql) ldap_found = False for item in self.userdb.cursor.fetchall(): old_backend = item[2].split('.')[-1] opts = cPickle.loads(str(item[3])) if old_backend in ('mssql', 'oracle', 'mysql', 'postgres'): url = URL(old_backend) for name in attribs: if name in opts: setattr(url, name, opts[name]) if len(item) == 5: url.password = item[4] ds = Datasource(manager) ds.url = url ds.name = item[0] ds.decription = item[1] ds.ask_for_password = opts.get('ask_for_password', False) manager.save(ds) elif old_backend == 'sqlite': url = URL(old_backend) url.database = opts.get('filename', None) ds = Datasource(manager) ds.url = url ds.name = item[0] ds.description = item[1] ds.ask_for_password = opts.get('ask_for_password', False) manager.save(ds) elif old_backend == 'ldap': ldap_found = True if ldap_found: dialogs.warning('Warning', 'Sorry, LDAP server are no longer supported.') self.userdb.drop_table('datasource')
def test_clean_port(self): url = URL('foo', port=None) self.assertEqual(url.port, None) url = URL('foo', port=123) self.assertEqual(url.port, 123) url = URL('foo', port='123') self.assertEqual(url.port, 123) url = URL('foo', port=' 123') self.assertEqual(url.port, 123) url = URL('foo', port='123 ') self.assertEqual(url.port, 123) url = URL('foo', port='123a') self.assertEqual(url.port, None) url = URL('foo', port='abc') self.assertEqual(url.port, None)
def setUp(self): super(DbTest, self).setUp() self.ds = Datasource(self.app.datasources) self.ds.url = URL('sqlite', database=':memory:')