You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

package_blob.go 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package packages
  4. import (
  5. "context"
  6. "time"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/modules/timeutil"
  9. "code.gitea.io/gitea/modules/util"
  10. )
  11. // ErrPackageBlobNotExist indicates a package blob not exist error
  12. var ErrPackageBlobNotExist = util.NewNotExistErrorf("package blob does not exist")
  13. func init() {
  14. db.RegisterModel(new(PackageBlob))
  15. }
  16. // PackageBlob represents a package blob
  17. type PackageBlob struct {
  18. ID int64 `xorm:"pk autoincr"`
  19. Size int64 `xorm:"NOT NULL DEFAULT 0"`
  20. HashMD5 string `xorm:"hash_md5 char(32) UNIQUE(md5) INDEX NOT NULL"`
  21. HashSHA1 string `xorm:"hash_sha1 char(40) UNIQUE(sha1) INDEX NOT NULL"`
  22. HashSHA256 string `xorm:"hash_sha256 char(64) UNIQUE(sha256) INDEX NOT NULL"`
  23. HashSHA512 string `xorm:"hash_sha512 char(128) UNIQUE(sha512) INDEX NOT NULL"`
  24. CreatedUnix timeutil.TimeStamp `xorm:"created INDEX NOT NULL"`
  25. }
  26. // GetOrInsertBlob inserts a blob. If the blob exists already the existing blob is returned
  27. func GetOrInsertBlob(ctx context.Context, pb *PackageBlob) (*PackageBlob, bool, error) {
  28. e := db.GetEngine(ctx)
  29. has, err := e.Get(pb)
  30. if err != nil {
  31. return nil, false, err
  32. }
  33. if has {
  34. return pb, true, nil
  35. }
  36. if _, err = e.Insert(pb); err != nil {
  37. return nil, false, err
  38. }
  39. return pb, false, nil
  40. }
  41. // GetBlobByID gets a blob by id
  42. func GetBlobByID(ctx context.Context, blobID int64) (*PackageBlob, error) {
  43. pb := &PackageBlob{}
  44. has, err := db.GetEngine(ctx).ID(blobID).Get(pb)
  45. if err != nil {
  46. return nil, err
  47. }
  48. if !has {
  49. return nil, ErrPackageBlobNotExist
  50. }
  51. return pb, nil
  52. }
  53. // ExistPackageBlobWithSHA returns if a package blob exists with the provided sha
  54. func ExistPackageBlobWithSHA(ctx context.Context, blobSha256 string) (bool, error) {
  55. return db.GetEngine(ctx).Exist(&PackageBlob{
  56. HashSHA256: blobSha256,
  57. })
  58. }
  59. // FindExpiredUnreferencedBlobs gets all blobs without associated files older than the specific duration
  60. func FindExpiredUnreferencedBlobs(ctx context.Context, olderThan time.Duration) ([]*PackageBlob, error) {
  61. pbs := make([]*PackageBlob, 0, 10)
  62. return pbs, db.GetEngine(ctx).
  63. Table("package_blob").
  64. Join("LEFT", "package_file", "package_file.blob_id = package_blob.id").
  65. Where("package_file.id IS NULL AND package_blob.created_unix < ?", time.Now().Add(-olderThan).Unix()).
  66. Find(&pbs)
  67. }
  68. // DeleteBlobByID deletes a blob by id
  69. func DeleteBlobByID(ctx context.Context, blobID int64) error {
  70. _, err := db.GetEngine(ctx).ID(blobID).Delete(&PackageBlob{})
  71. return err
  72. }
  73. // GetTotalBlobSize returns the total blobs size in bytes
  74. func GetTotalBlobSize(ctx context.Context) (int64, error) {
  75. return db.GetEngine(ctx).
  76. SumInt(&PackageBlob{}, "size")
  77. }
  78. // GetTotalUnreferencedBlobSize returns the total size of all unreferenced blobs in bytes
  79. func GetTotalUnreferencedBlobSize(ctx context.Context) (int64, error) {
  80. return db.GetEngine(ctx).
  81. Table("package_blob").
  82. Join("LEFT", "package_file", "package_file.blob_id = package_blob.id").
  83. Where("package_file.id IS NULL").
  84. SumInt(&PackageBlob{}, "size")
  85. }