Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/planemo/database/postgres.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
| author | shellac |
|---|---|
| date | Mon, 22 Mar 2021 18:12:50 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4f3585e2f14b |
|---|---|
| 1 """Module describes a :class:`DatabaseSource` for local postgres databases.""" | |
| 2 | |
| 3 import subprocess | |
| 4 | |
| 5 from galaxy.util import unicodify | |
| 6 | |
| 7 from planemo.io import communicate | |
| 8 from .interface import DatabaseSource | |
| 9 | |
| 10 | |
| 11 class ExecutesPostgresSqlMixin: | |
| 12 | |
| 13 def list_databases(self): | |
| 14 """Use `psql --list` to generate a list of identifiers.""" | |
| 15 command_builder = self._psql_command_builder("--list") | |
| 16 stdout = unicodify(self._communicate(command_builder)) | |
| 17 output_lines = stdout.splitlines() | |
| 18 identifiers = [] | |
| 19 for line in output_lines: | |
| 20 identifiers.append(line.split("|")[0].strip()) | |
| 21 return [i for i in identifiers if i] | |
| 22 | |
| 23 def create_database(self, identifier): | |
| 24 """Use `psql -c "create database"` to create a database.""" | |
| 25 sql = "create database %s;" % identifier | |
| 26 self._run_sql_command(sql) | |
| 27 | |
| 28 def delete_database(self, identifier): | |
| 29 """Use `psql -c "drop database"` to delete a database.""" | |
| 30 sql = "drop database %s;" % identifier | |
| 31 self._run_sql_command(sql) | |
| 32 | |
| 33 def _run_sql_command(self, sql): | |
| 34 # communicate is just joining commands so we need to modify the | |
| 35 # sql as an argument - it shouldn't do this. | |
| 36 sql_arg = '%s' % sql | |
| 37 command_builder = self._psql_command_builder("--command", sql_arg) | |
| 38 self._communicate(command_builder) | |
| 39 | |
| 40 def _communicate(self, command_builder): | |
| 41 stdout, _ = communicate( | |
| 42 command_builder.command, | |
| 43 stdout=subprocess.PIPE, | |
| 44 stderr=subprocess.PIPE, | |
| 45 ) | |
| 46 return stdout | |
| 47 | |
| 48 | |
| 49 class LocalPostgresDatabaseSource(ExecutesPostgresSqlMixin, DatabaseSource): | |
| 50 """Local postgres database source managed through psql application.""" | |
| 51 | |
| 52 def __init__(self, **kwds): | |
| 53 """Construct a postgres database source from planemo configuration.""" | |
| 54 self.psql_path = kwds.get("postgres_psql_path", None) or 'psql' | |
| 55 self.database_user = kwds.get("postgres_database_user", None) | |
| 56 self.database_host = kwds.get("postgres_database_host", None) | |
| 57 self.database_port = kwds.get("postgres_database_port", None) | |
| 58 self._kwds = kwds | |
| 59 | |
| 60 def sqlalchemy_url(self, identifier): | |
| 61 """Return URL or form postgresql://username:password@localhost/mydatabase.""" | |
| 62 hostname = self.database_host or "localhost" | |
| 63 if self.database_port: | |
| 64 hostname += ":%s" % self.database_port | |
| 65 return "postgresql://%s@%s/%s" % ( | |
| 66 self.database_user, | |
| 67 hostname, | |
| 68 identifier | |
| 69 ) | |
| 70 | |
| 71 def _psql_command_builder(self, *args): | |
| 72 command_builder = _CommandBuilder(self.psql_path) | |
| 73 # Print only tuples so output is easier to parse | |
| 74 command_builder.append_command("--tuples-only") | |
| 75 | |
| 76 # Specify connection information | |
| 77 if self.database_user: | |
| 78 command_builder.append_command("--username", self.database_user) | |
| 79 if self.database_host: | |
| 80 command_builder.append_command("--host", self.database_host) | |
| 81 if self.database_port: | |
| 82 command_builder.append_command("--port", self.database_port) | |
| 83 command_builder.append_command("-P", "pager=off") | |
| 84 command_builder.extend_command(args) | |
| 85 return command_builder | |
| 86 | |
| 87 | |
| 88 class _CommandBuilder(object): | |
| 89 | |
| 90 def __init__(self, *args): | |
| 91 self.command = list(args) | |
| 92 | |
| 93 def append_command(self, *args_or_none): | |
| 94 args_or_none = args_or_none or [] | |
| 95 for arg_or_none in args_or_none: | |
| 96 if arg_or_none is not None: | |
| 97 self.command.append(arg_or_none) | |
| 98 | |
| 99 def extend_command(self, args): | |
| 100 for arg in (args or []): | |
| 101 self.append_command(arg) | |
| 102 | |
| 103 | |
| 104 __all__ = ( | |
| 105 "LocalPostgresDatabaseSource", | |
| 106 ) |
