import mimetypes
import os
import shutil
+import sqlalchemy
+import sqlmodel
import stat
-import sqlalchemy
-from sqlalchemy import Column, Computed, ForeignKey
-from sqlalchemy import ARRAY, BigInteger, Boolean, DateTime, Integer, LargeBinary, Text, UUID
+# Import types
+from uuid import UUID
from sqlalchemy.dialects.postgresql import TSVECTOR
import pakfire
return await self.db.fetch_as_list(stmt)
-class Package(database.Base, database.BackendMixin, database.SoftDeleteMixin):
+class Package(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True):
__tablename__ = "packages"
def __repr__(self):
# ID
- id = Column(Integer, primary_key=True)
+ id : int = sqlmodel.Field(primary_key=True, exclude=True)
# UUID
- uuid = Column(UUID, nullable=False)
+ uuid: UUID
# Link
# Created At
- created_at = Column(
- DateTime(timezone=False), nullable=False, server_default=sqlalchemy.func.current_timestamp(),
+ created_at : datetime.datetime = sqlmodel.Field(
+ sa_column_kwargs = {"server_default" : sqlalchemy.text("CURRENT_TIMESTAMP")}
)
async def delete(self, deleted_by=None):
# Name
- name = Column(Text, nullable=False)
+ name: str
# EVR
- evr = Column(Text, nullable=False)
+ evr: str
# Arch
- arch = Column(Text, nullable=False)
+ arch: str
# Source?
# Groups
- groups = Column(ARRAY(Text), nullable=False, default=[])
+ groups: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
# Packager
- packager = Column(Text, nullable=False, default="")
+ packager: str = sqlmodel.Field(default="")
# License
- license = Column(Text, nullable=False)
+ license: str
# URL
- url = Column(Text, nullable=False)
+ url: str
# Summary
- summary = Column(Text, nullable=False)
+ summary: str
# Description
- description = Column(Text, nullable=False)
+ description: str
# Build Arches
- build_arches = Column(ARRAY(Text), nullable=False)
+ build_arches: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)),
+ )
# Size
- size = Column(BigInteger, nullable=False)
+ size: int
# Dependencies
- prerequires = Column(ARRAY(Text), nullable=False, default=[])
+ prerequires: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
- requires = Column(ARRAY(Text), nullable=False, default=[])
+ requires: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
- provides = Column(ARRAY(Text), nullable=False, default=[])
+ provides: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
- conflicts = Column(ARRAY(Text), nullable=False, default=[])
+ conflicts: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
- obsoletes = Column(ARRAY(Text), nullable=False, default=[])
+ obsoletes: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
- suggests = Column(ARRAY(Text), nullable=False, default=[])
+ suggests: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
- recommends = Column(ARRAY(Text), nullable=False, default=[])
+ recommends: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)), default=[],
+ )
# Commit
# Distro ID
- distro_id = Column(Integer, ForeignKey("distributions.id"), nullable=False)
+ distro_id: int = sqlmodel.Field(foreign_key="distributions.id")
# Distro
- distro = sqlalchemy.orm.relationship("Distro",
- foreign_keys=[distro_id], lazy="selectin")
+ distro: "Distro" = sqlmodel.Relationship()
# Build ID
- build_id = Column(UUID)
+ build_id: UUID
# Build Host
- build_host = Column(Text, nullable=False)
+ build_host: str
# Build Time
- build_time = Column(DateTime(timezone=False), nullable=False)
+ build_time: datetime.datetime
# Path
- path = Column(Text)
+ path: str | None
# Download URL
# Digest Type
- digest_type = Column(Text, nullable=False)
+ digest_type: str
# Digest
- digest = Column(LargeBinary, nullable=False)
+ digest: bytes = sqlmodel.Field(sa_column=sqlalchemy.Column(sqlalchemy.LargeBinary, nullable=False))
# File Size
- filesize = Column(BigInteger, nullable=False)
+ filesize: int
async def _import_archive(self, archive):
"""
# Search
- search = Column(
- TSVECTOR, Computed(
- """
- (
- setweight(
- to_tsvector('simple'::regconfig, name),
- 'A'::"char"
+ search: str = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(
+ TSVECTOR,
+ sqlmodel.Computed(
+ """
+ (
+ setweight(
+ to_tsvector('simple'::regconfig, name),
+ 'A'::"char"
+ )
+ ||
+ setweight(
+ to_tsvector('english'::regconfig, summary),
+ 'B'::"char"
+ )
+ ||
+ setweight(
+ to_tsvector('english'::regconfig, description),
+ 'C'::"char"
+ )
)
- ||
- setweight(
- to_tsvector('english'::regconfig, summary),
- 'B'::"char"
- )
- ||
- setweight(
- to_tsvector('english'::regconfig, description),
- 'C'::"char"
- )
- )
- """,
- persisted=True,
- )
+ """,
+ persisted=True,
+ ),
+ )
)
-class File(database.Base):
+class File(sqlmodel.SQLModel, table=True):
__tablename__ = "package_files"
def __str__(self):
# Package ID
- pkg_id = Column(Integer, ForeignKey("packages.id"), primary_key=True, nullable=False)
+ pkg_id : int = sqlmodel.Field(primary_key=True, foreign_key="packages.id", exclude=True)
# Package
- package = sqlalchemy.orm.relationship("Package", foreign_keys=[pkg_id], lazy="selectin")
+ package: "Package" = sqlmodel.Relationship()
# Path
- path = Column(Text, primary_key=True, nullable=False)
+ path: str = sqlmodel.Field(primary_key=True)
# Size
- size = Column(BigInteger, nullable=False)
+ size: int
# Config
- config = Column(Boolean, nullable=False, default=False)
+ config: bool = sqlmodel.Field(default=False)
# Mode
- mode = Column(Integer, nullable=False)
+ mode: int
# Type
# uname
- uname = Column(Text, nullable=False)
+ uname: str
# gname
- gname = Column(Text, nullable=False)
+ gname: str
# Creation Time
- ctime = Column(DateTime(timezone=False), nullable=False)
+ ctime: datetime.datetime
# Modification Time
- mtime = Column(DateTime(timezone=False), nullable=False)
+ mtime: datetime.datetime
# MIME Type
- mimetype = Column(Text)
+ mimetype: str | None
# Capabilities
- capabilities = Column(ARRAY(Text))
+ capabilities: list[str] = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.ARRAY(sqlalchemy.Text)),
+ )
# Digest SHA-2 512
- digest_sha2_512 = Column(LargeBinary)
+ digest_sha2_512: bytes = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.LargeBinary, nullable=False),
+ )
# Digest SHA-2 256
- digest_sha2_256 = Column(LargeBinary)
+ digest_sha2_256: bytes = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.LargeBinary, nullable=False),
+ )
# Digest Blake2b512
- digest_blake2b512 = Column(LargeBinary)
+ digest_blake2b512: bytes = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.LargeBinary, nullable=False),
+ )
# Digest Blake2s256
- digest_blake2s256 = Column(LargeBinary)
+ digest_blake2s256: bytes = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.LargeBinary, nullable=False),
+ )
# Digest SHA-3 512
- digest_sha3_512 = Column(LargeBinary)
+ digest_sha3_512: bytes = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.LargeBinary, nullable=False),
+ )
# Digest SHA-3 256
- digest_sha3_256 = Column(LargeBinary)
+ digest_sha3_256: bytes = sqlmodel.Field(
+ sa_column=sqlalchemy.Column(sqlalchemy.LargeBinary, nullable=False),
+ )
# Downloadable?