# HG changeset patch # User Adrien Di Mascio # Date 1417620556 -3600 # Node ID bc6461a7d2da80b328d7bfc265010596b3fc4dda # Parent 153c969b3a05e53c294f0c6b0ca9600205e201b2 [server] add a db-namespace option in source definition (closes #1631339) "namespace" is preferred to the postgresql term "schema" to try and avoid confusion with cubicweb's schema. cubicweb now depends on logilab-database >= 1.13.0 diff -r 153c969b3a05 -r bc6461a7d2da __pkginfo__.py --- a/__pkginfo__.py Fri Dec 19 12:08:01 2014 +0100 +++ b/__pkginfo__.py Wed Dec 03 16:29:16 2014 +0100 @@ -48,7 +48,7 @@ 'lxml': '', # XXX graphviz # server dependencies - 'logilab-database': '>= 1.12.1', + 'logilab-database': '>= 1.13.0', 'passlib': '', 'Markdown': '' } diff -r 153c969b3a05 -r bc6461a7d2da cubicweb.spec --- a/cubicweb.spec Fri Dec 19 12:08:01 2014 +0100 +++ b/cubicweb.spec Wed Dec 03 16:29:16 2014 +0100 @@ -24,7 +24,7 @@ Requires: %{python}-logilab-mtconverter >= 0.8.0 Requires: %{python}-rql >= 0.31.2 Requires: %{python}-yams >= 0.40.0 -Requires: %{python}-logilab-database >= 1.12.1 +Requires: %{python}-logilab-database >= 1.13.0 Requires: %{python}-passlib Requires: %{python}-lxml Requires: %{python}-twisted-web diff -r 153c969b3a05 -r bc6461a7d2da debian/control --- a/debian/control Fri Dec 19 12:08:01 2014 +0100 +++ b/debian/control Wed Dec 03 16:29:16 2014 +0100 @@ -52,7 +52,7 @@ ${python:Depends}, cubicweb-common (= ${source:Version}), cubicweb-ctl (= ${source:Version}), - python-logilab-database (>= 1.12.1), + python-logilab-database (>= 1.13.0), cubicweb-postgresql-support | cubicweb-mysql-support | python-pysqlite2, diff -r 153c969b3a05 -r bc6461a7d2da server/serverctl.py --- a/server/serverctl.py Fri Dec 19 12:08:01 2014 +0100 +++ b/server/serverctl.py Wed Dec 03 16:29:16 2014 +0100 @@ -88,6 +88,7 @@ extra = extra_args and {'extra_args': extra_args} or {} cnx = get_connection(driver, dbhost, dbname, user, password=password, port=source.get('db-port'), + schema=source.get('db-namespace'), **extra) try: cnx.logged_user = user @@ -242,6 +243,13 @@ cmdname = 'delete' cfgname = 'repository' + def _drop_namespace(self, source): + db_namespace = source.get('db-namespace') + with db_transaction(source, privilege='DROP SCHEMA') as cursor: + helper = get_db_helper(source['db-driver']) + helper.drop_schema(cursor, db_namespace) + print '-> database schema %s dropped' % db_namespace + def _drop_database(self, source): dbname = source['db-name'] if source['db-driver'] == 'sqlite': @@ -263,10 +271,15 @@ cursor.execute('DROP USER %s' % user) def _cleanup_steps(self, source): - # 1/ delete database + # 1/ delete namespace if used + db_namespace = source.get('db-namespace') + if db_namespace: + yield ('Delete database namespace "%s"' % db_namespace, + self._drop_namespace, True) + # 2/ delete database yield ('Delete database "%(db-name)s"' % source, self._drop_database, True) - # 2/ delete user + # 3/ delete user helper = get_db_helper(source['db-driver']) if source['db-user'] and helper.users_support: # XXX should check we are not connected as user @@ -402,10 +415,14 @@ except BaseException: dbcnx.rollback() raise - cnx = system_source_cnx(source, special_privs='CREATE LANGUAGE', + cnx = system_source_cnx(source, special_privs='CREATE LANGUAGE/SCHEMA', interactive=not automatic) cursor = cnx.cursor() helper.init_fti_extensions(cursor) + namespace = source.get('db-namespace') + if namespace and ASK.confirm('Create schema %s in database %s ?' + % (namespace, dbname)): + helper.create_schema(cursor, namespace) cnx.commit() # postgres specific stuff if driver == 'postgres': @@ -480,7 +497,7 @@ system['db-driver'], database=system['db-name'], host=system.get('db-host'), port=system.get('db-port'), user=system.get('db-user') or '', password=system.get('db-password') or '', - **extra) + schema=system.get('db-namespace'), **extra) except Exception as ex: raise ConfigurationError( 'You seem to have provided wrong connection information in '\ diff -r 153c969b3a05 -r bc6461a7d2da server/sources/native.py --- a/server/sources/native.py Fri Dec 19 12:08:01 2014 +0100 +++ b/server/sources/native.py Wed Dec 03 16:29:16 2014 +0100 @@ -293,6 +293,12 @@ 'help': 'database name', 'group': 'native-source', 'level': 0, }), + ('db-namespace', + {'type' : 'string', + 'default': '', + 'help': 'database namespace (schema) name', + 'group': 'native-source', 'level': 1, + }), ('db-user', {'type' : 'string', 'default': CubicWebNoAppConfiguration.mode == 'user' and getlogin() or 'cubicweb', diff -r 153c969b3a05 -r bc6461a7d2da server/sqlutils.py --- a/server/sqlutils.py Fri Dec 19 12:08:01 2014 +0100 +++ b/server/sqlutils.py Wed Dec 03 16:29:16 2014 +0100 @@ -312,10 +312,11 @@ dbpassword = source_config.get('db-password') dbencoding = source_config.get('db-encoding', 'UTF-8') dbextraargs = source_config.get('db-extra-arguments') + dbnamespace = source_config.get('db-namespace') self.dbhelper = db.get_db_helper(self.dbdriver) self.dbhelper.record_connection_info(dbname, dbhost, dbport, dbuser, dbpassword, dbextraargs, - dbencoding) + dbencoding, dbnamespace) self.sqlgen = SQLGenerator() # copy back some commonly accessed attributes dbapi_module = self.dbhelper.dbapi_module