git-importer/lib/db.py

98 lines
2.7 KiB
Python
Raw Normal View History

2022-10-17 16:31:48 +02:00
import psycopg2
2022-10-17 20:39:03 +02:00
from lib.config import config
2022-10-17 16:31:48 +02:00
class DB:
2022-10-17 20:52:05 +02:00
def __init__(self, section="production"):
self.config_section = section
2022-10-17 16:31:48 +02:00
self.connect()
2022-10-17 20:39:03 +02:00
self.create_tables()
2022-10-17 16:31:48 +02:00
def connect(self):
try:
# read the connection parameters
2022-10-17 20:52:05 +02:00
params = config(section=self.config_section)
2022-10-17 16:31:48 +02:00
# connect to the PostgreSQL server
self.conn = psycopg2.connect(**params)
except (Exception, psycopg2.DatabaseError) as error:
print(error)
raise error
def schema_version(self):
# create a cursor
cur = self.conn.cursor()
# execute a statement
try:
cur.execute("SELECT MAX(version) from scheme")
except psycopg2.errors.UndefinedTable as error:
cur.close()
self.close()
self.connect()
return 0
db_version = cur.fetchone()
cur.close()
return db_version[0]
def close(self):
if self.conn is not None:
self.conn.close()
self.conn = None
def create_tables(self):
"""Create the tables if not existing - assumes connected"""
commands = (
"""
CREATE TABLE scheme (
id SERIAL PRIMARY KEY,
version SMALLINT NOT NULL
2022-10-18 12:17:43 +02:00
)
""",
2022-10-17 16:31:48 +02:00
"INSERT INTO scheme (version) VALUES(1)",
2022-10-18 12:17:43 +02:00
""" DROP TABLE IF EXISTS revisions""",
2022-10-17 16:31:48 +02:00
""" CREATE TABLE revisions (
id SERIAL PRIMARY KEY,
project VARCHAR(255) NOT NULL,
package VARCHAR(255) NOT NULL,
2022-10-18 12:17:43 +02:00
rev INTEGER NOT NULL,
unexpanded_srcmd5 VARCHAR(255) NOT NULL,
commit_time timestamp NOT NULL,
userid VARCHAR(255) NOT NULL,
2022-10-17 20:39:03 +02:00
comment TEXT,
requestid INTEGER
2022-10-17 16:31:48 +02:00
)
2022-10-18 12:17:43 +02:00
""",
"""
CREATE UNIQUE INDEX ppr ON revisions (project, package, rev);
2022-10-18 13:13:52 +02:00
""",
2022-10-17 16:31:48 +02:00
)
if self.schema_version() > 0:
return
try:
cur = self.conn.cursor()
# create table one by one
for command in commands:
cur.execute(command)
# close communication with the PostgreSQL database server
cur.close()
# commit the changes
self.conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
self.close()
raise error
2022-10-18 12:17:43 +02:00
def cursor(self):
return self.conn.cursor()
2022-10-17 16:31:48 +02:00
if __name__ == "__main__":
db = DB()
db.create_tables()