# This file has parts from Buildbot and is modifyed by Gentoo Authors. # Buildbot is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, version 2. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., 51 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Copyright Buildbot Team Members # Origins: buildbot.db.* # Modifyed by Gentoo Authors. # Copyright 2021 Gentoo Authors import uuid import sqlalchemy as sa from twisted.internet import defer from buildbot.db import base class PackagesConnectorComponent(base.DBConnectorComponent): @defer.inlineCallbacks def getPackageByName(self, name, c_uuid, repo_uuid): def thd(conn): tbl = self.db.model.packages q = tbl.select() q = q.where(tbl.c.name == name) q = q.where(tbl.c.category_uuid == c_uuid) q = q.where(tbl.c.repository_uuid == repo_uuid) res = conn.execute(q) row = res.fetchone() if not row: return None return self._row2dict(conn, row) res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def getPackageByUuid(self, uuid): def thd(conn): tbl = self.db.model.packages q = tbl.select() q = q.where(tbl.c.uuid == uuid) res = conn.execute(q) row = res.fetchone() if not row: return None return self._row2dict(conn, row) res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def addPackage(self, name, repository_uuid, category_uuid): def thd(conn, no_recurse=False): try: tbl = self.db.model.packages q = tbl.insert() r = conn.execute(q, dict(name=name, repository_uuid=repository_uuid, category_uuid=category_uuid)) except Exception as e: print(type(e)) print(e.args) print(e) uuid = None else: uuid = r.inserted_primary_key[0] return uuid res = yield self.db.pool.do(thd) return res def _row2dict(self, conn, row): return dict( uuid=row.uuid, name=row.name, repository_uuid=row.repository_uuid, category_uuid=row.category_uuid ) @defer.inlineCallbacks def getPackageMetadataByPackageUuid(self, package_uuid): def thd(conn): tbl = self.db.model.packages_metadata q = tbl.select() q = q.where(tbl.c.package_uuid == package_uuid) res = conn.execute(q) row = res.fetchone() if not row: return None return self._row2dict_metadata(conn, row) res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def addMetadata(self, package_uuid, sha256): def thd(conn, no_recurse=False): try: tbl = self.db.model.packages_metadata q = tbl.insert() r = conn.execute(q, dict(package_uuid=package_uuid, sha256=sha256 )) except Exception as e: print(type(e)) print(e.args) print(e) res = None else: res = r.inserted_primary_key[0] return res res = yield self.db.pool.do(thd) return res def _row2dict_metadata(self, conn, row): return dict( id=row.id, package_uuid=row.package_uuid, sha256=row.sha256, ) @defer.inlineCallbacks def addEmail(self, email): def thd(conn, no_recurse=False): try: tbl = self.db.model.emails q = tbl.insert() r = conn.execute(q, dict(email=email)) except Exception as e: print(type(e)) print(e.args) print(e) res = None else: res = r.inserted_primary_key[0] return res res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def addPackageEmail(self, email_id, package_uuid, mail_type, proxied): def thd(conn, no_recurse=False): try: tbl = self.db.model.packages_emails q = tbl.insert() r = conn.execute(q, dict(email_id=email_id, package_uuid=package_uuid, mail_type=mail_type, proxied=proxied )) except Exception as e: print(type(e)) print(e.args) print(e) res = None else: res = r.inserted_primary_key[0] return res res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def getEmailIdByEmail(self, email): def thd(conn): tbl = self.db.model.emails q = tbl.select() q = q.where(tbl.c.email == email) res = conn.execute(q) row = res.fetchone() if not row: return None return self._row2dict_email(conn, row) res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def getEmailByEmailId(self, email_id): def thd(conn): tbl = self.db.model.emails q = tbl.select() q = q.where(tbl.c.id == email_id) res = conn.execute(q) row = res.fetchone() if not row: return None return self._row2dict_email(conn, row) res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def getEmailsIdsByPackageUuid(self, package_uuid): def thd(conn): tbl = self.db.model.packages_emails q = tbl.select() q = q.where(tbl.c.package_uuid == package_uuid) return [self._row2dict_package_email(conn, row) for row in conn.execute(q).fetchall()] res = yield self.db.pool.do(thd) return res @defer.inlineCallbacks def delPackageEmail(self, package_uuid): def thd(conn, no_recurse=False): tbl = self.db.model.packages_emails conn.execute(tbl.delete( whereclause=((tbl.c.package_uuid == package_uuid)))) res = yield self.db.pool.do(thd) return res def _row2dict_email(self, conn, row): return dict( id=row.id, email=row.email, ) def _row2dict_package_email(self, conn, row): return dict( id=row.id, email_id=row.email_id, package_uuid=row.package_uuid, mail_type=row.mail_type, proxied=row.proxied, )