Mercurial > p > roundup > code
diff roundup/backends/back_postgresql.py @ 6935:b5062cb5c2a2
flake8 fixes
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Thu, 08 Sep 2022 13:41:26 -0400 |
| parents | b0dbc13a835a |
| children | 5b41018617f2 |
line wrap: on
line diff
--- a/roundup/backends/back_postgresql.py Thu Sep 08 09:33:42 2022 -0400 +++ b/roundup/backends/back_postgresql.py Thu Sep 08 13:41:26 2022 -0400 @@ -7,33 +7,36 @@ '''Postgresql backend via psycopg2 for Roundup.''' __docformat__ = 'restructuredtext' -import os, shutil, time +import logging +import os +import shutil +import time + ISOLATION_LEVEL_READ_UNCOMMITTED = None ISOLATION_LEVEL_READ_COMMITTED = None ISOLATION_LEVEL_REPEATABLE_READ = None ISOLATION_LEVEL_SERIALIZABLE = None -import psycopg2 -from psycopg2.extensions import QuotedString -from psycopg2.extensions import ISOLATION_LEVEL_READ_UNCOMMITTED -from psycopg2.extensions import ISOLATION_LEVEL_READ_COMMITTED -from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ -from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE -from psycopg2 import ProgrammingError -from psycopg2.extensions import TransactionRollbackError - -import logging +import psycopg2 # noqa: E402 +from psycopg2 import ProgrammingError # noqa: E402 +from psycopg2.extensions import QuotedString # noqa: E402 +from psycopg2.extensions import ISOLATION_LEVEL_READ_UNCOMMITTED # noqa: F401 E402 +from psycopg2.extensions import ISOLATION_LEVEL_READ_COMMITTED # noqa: E402 +from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ # noqa: E402 +from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE # noqa: E402 +from psycopg2.extensions import TransactionRollbackError # noqa: F401 E402 -from roundup import hyperdb, date -from roundup.backends import rdbms_common -from roundup.backends import sessions_rdbms +from roundup import hyperdb # noqa: E402 +from roundup.backends import rdbms_common # noqa: E402 +from roundup.backends import sessions_rdbms # noqa: E402 -isolation_levels = \ - { 'read uncommitted': ISOLATION_LEVEL_READ_COMMITTED - , 'read committed': ISOLATION_LEVEL_READ_COMMITTED - , 'repeatable read': ISOLATION_LEVEL_REPEATABLE_READ - , 'serializable': ISOLATION_LEVEL_SERIALIZABLE - } +isolation_levels = { + 'read uncommitted': ISOLATION_LEVEL_READ_COMMITTED, + 'read committed': ISOLATION_LEVEL_READ_COMMITTED, + 'repeatable read': ISOLATION_LEVEL_REPEATABLE_READ, + 'serializable': ISOLATION_LEVEL_SERIALIZABLE +} + def connection_dict(config, dbnamestr=None): ''' read_default_group is MySQL-specific, ignore it ''' @@ -44,29 +47,32 @@ del d['read_default_file'] return d + def db_create(config): """Clear all database contents and drop database itself""" - command = "CREATE DATABASE \"%s\" WITH ENCODING='UNICODE'"%config.RDBMS_NAME + command = "CREATE DATABASE \"%s\" WITH ENCODING='UNICODE'" % config.RDBMS_NAME if config.RDBMS_TEMPLATE: command = command + " TEMPLATE=%s" % config.RDBMS_TEMPLATE logging.getLogger('roundup.hyperdb').info(command) db_command(config, command) + def db_nuke(config): """Clear all database contents and drop database itself""" - command = 'DROP DATABASE "%s"'% config.RDBMS_NAME + command = 'DROP DATABASE "%s"' % config.RDBMS_NAME logging.getLogger('roundup.hyperdb').info(command) db_command(config, command) if os.path.exists(config.DATABASE): shutil.rmtree(config.DATABASE) + def db_command(config, command, database='postgres'): '''Perform some sort of database-level command. Retry 10 times if we fail by conflicting with another user. Since PostgreSQL version 8.1 there is a database "postgres", - before "template1" seems to have been used, so we fall back to it. + before "template1" seems to have been used, so we fall back to it. Compare to issue2550543. ''' template1 = connection_dict(config) @@ -82,13 +88,14 @@ conn.set_isolation_level(0) cursor = conn.cursor() try: - for n in range(10): + for _n in range(10): if pg_command(cursor, command): return finally: conn.close() raise RuntimeError('10 attempts to create database failed') + def pg_command(cursor, command): '''Execute the postgresql command, which may be blocked by some other user connecting to the database, and return a true value if it succeeds. @@ -108,9 +115,10 @@ if msg in response: time.sleep(0.1) return 0 - raise RuntimeError (response) + raise RuntimeError(response) return 1 + def db_exists(config): """Check if database already exists""" db = connection_dict(config, 'database') @@ -118,9 +126,10 @@ conn = psycopg2.connect(**db) conn.close() return 1 - except: + except Exception: return 0 + class Sessions(sessions_rdbms.Sessions): def set(self, *args, **kwargs): try: @@ -134,6 +143,7 @@ # see http://www.postgresql.org/docs/7.4/interactive/transaction-iso.html self.db.rollback() + class Database(rdbms_common.Database): """Postgres DB backend implementation @@ -154,7 +164,7 @@ def sql_open_connection(self): db = connection_dict(self.config, 'database') logging.getLogger('roundup.hyperdb').info( - 'open database %r'%db['database']) + 'open database %r' % db['database']) try: conn = psycopg2.connect(**db) except psycopg2.OperationalError as message: @@ -162,7 +172,7 @@ cursor = conn.cursor() if ISOLATION_LEVEL_REPEATABLE_READ is not None: - lvl = isolation_levels [self.config.RDBMS_ISOLATION_LEVEL] + lvl = isolation_levels[self.config.RDBMS_ISOLATION_LEVEL] conn.set_isolation_level(lvl) return (conn, cursor) @@ -265,13 +275,13 @@ # convert session / OTK *_time columns to REAL for name in ('otk', 'session'): - self.sql('drop index %ss_key_idx'%name) - self.sql('drop table %ss'%name) + self.sql('drop index %ss_key_idx' % name) + self.sql('drop table %ss' % name) self.sql('''CREATE TABLE %ss (%s_key VARCHAR(255), - %s_value VARCHAR(255), %s_time REAL)'''%(name, name, name, - name)) - self.sql('CREATE INDEX %ss_key_idx ON %ss(%s_key)'%(name, name, - name)) + %s_value VARCHAR(255), %s_time REAL)''' % (name, name, + name, name)) + self.sql('CREATE INDEX %ss_key_idx ON %ss(%s_key)' % (name, name, + name)) def fix_version_3_tables(self): rdbms_common.Database.fix_version_3_tables(self) @@ -279,8 +289,9 @@ USING btree (_word, _textid)''') def _add_fts_table(self): - self.sql('CREATE TABLE __fts (_class VARCHAR(255), ' - '_itemid VARCHAR(255), _prop VARCHAR(255), _tsv tsvector)' + self.sql( + 'CREATE TABLE __fts (_class VARCHAR(255), ' + '_itemid VARCHAR(255), _prop VARCHAR(255), _tsv tsvector)' ) self.sql('CREATE INDEX __fts_idx ON __fts USING GIN (_tsv)') @@ -308,7 +319,7 @@ # update existing tables to have the new actor column tables = self.database_schema['tables'] for name in tables: - self.sql('ALTER TABLE _%s add __actor VARCHAR(255)'%name) + self.sql('ALTER TABLE _%s add __actor VARCHAR(255)' % name) def __repr__(self): return '<roundpsycopgsql 0x%x>' % id(self) @@ -320,31 +331,32 @@ def sql_index_exists(self, table_name, index_name): sql = 'select count(*) from pg_indexes where ' \ - 'tablename=%s and indexname=%s'%(self.arg, self.arg) + 'tablename=%s and indexname=%s' % (self.arg, self.arg) self.sql(sql, (table_name, index_name)) return self.cursor.fetchone()[0] def create_class_table(self, spec, create_sequence=1): if create_sequence: - sql = 'CREATE SEQUENCE _%s_ids'%spec.classname + sql = 'CREATE SEQUENCE _%s_ids' % spec.classname self.sql(sql) return rdbms_common.Database.create_class_table(self, spec) def drop_class_table(self, cn): - sql = 'drop table _%s'%cn + sql = 'drop table _%s' % cn self.sql(sql) - sql = 'drop sequence _%s_ids'%cn + sql = 'drop sequence _%s_ids' % cn self.sql(sql) def newid(self, classname): - sql = "select nextval('_%s_ids') from dual"%classname + sql = "select nextval('_%s_ids') from dual" % classname self.sql(sql) return str(self.cursor.fetchone()[0]) def setid(self, classname, setid): - sql = "select setval('_%s_ids', %s) from dual"%(classname, int(setid)) + sql = "select setval('_%s_ids', %s) from dual" % (classname, + int(setid)) self.sql(sql) def clear(self): @@ -352,17 +364,23 @@ # reset the sequences for cn in self.classes: - self.cursor.execute('DROP SEQUENCE _%s_ids'%cn) - self.cursor.execute('CREATE SEQUENCE _%s_ids'%cn) + self.cursor.execute('DROP SEQUENCE _%s_ids' % cn) + self.cursor.execute('CREATE SEQUENCE _%s_ids' % cn) + class PostgresqlClass: order_by_null_values = '(%s is not NULL)' case_insensitive_like = 'ILIKE' + class Class(PostgresqlClass, rdbms_common.Class): pass + + class IssueClass(PostgresqlClass, rdbms_common.IssueClass): pass + + class FileClass(PostgresqlClass, rdbms_common.FileClass): pass
