working commit
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
package maindb
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"mstore/app/descr"
|
||||
)
|
||||
|
||||
func (db *Database) InsertBlob(ctx context.Context, layer *descr.Blob) error {
|
||||
var err error
|
||||
request := `
|
||||
INSERT INTO blobs(id, name, reference, mediaType, digest, size, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`
|
||||
_, err = db.db.Exec(request,
|
||||
layer.ID, layer.Name, layer.Reference, layer.MediaType,
|
||||
layer.Digest, layer.Size, layer.CreatedAt, layer.UpdatedAt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (db *Database) ListAllBlobs(ctx context.Context) ([]descr.Blob, error) {
|
||||
var err error
|
||||
blobs := make([]descr.Blob, 0)
|
||||
request := `SELECT * FROM blobs`
|
||||
err = db.db.Select(&blobs, request)
|
||||
if err != nil {
|
||||
return blobs, err
|
||||
}
|
||||
return blobs, err
|
||||
}
|
||||
|
||||
func (db *Database) BlobExists(ctx context.Context, name, reference, digest string) (bool, error) {
|
||||
var err error
|
||||
blobs := make([]descr.Blob, 0)
|
||||
request := `
|
||||
SELECT * FROM blobs WHERE name = $1 AND reference = $2 AND digest = $3 LIMIT 1`
|
||||
err = db.db.Select(&blobs, request, name, reference, digest)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if len(blobs) > 0 {
|
||||
return true, err
|
||||
}
|
||||
return false, err
|
||||
}
|
||||
|
||||
func (db *Database) GetBlobsByReferense(ctx context.Context, name, reference string) ([]descr.Blob, error) {
|
||||
var err error
|
||||
blobs := make([]descr.Blob, 0)
|
||||
request := `
|
||||
SELECT * FROM blobs WHERE name = $1 AND reference = $2`
|
||||
err = db.db.Select(&blobs, request, name, reference)
|
||||
if err != nil {
|
||||
return blobs, err
|
||||
}
|
||||
return blobs, err
|
||||
}
|
||||
|
||||
func (db *Database) GetBlobByDigest(ctx context.Context, digest string) (bool, descr.Blob, error) {
|
||||
var err error
|
||||
blobs := make([]descr.Blob, 0)
|
||||
res := descr.Blob{}
|
||||
exists := false
|
||||
request := `SELECT * FROM blobs WHERE digest = $1 LIMIT 1`
|
||||
err = db.db.Select(&blobs, request, digest)
|
||||
if err != nil {
|
||||
return exists, res, err
|
||||
}
|
||||
if len(blobs) > 0 {
|
||||
res = blobs[0]
|
||||
exists = true
|
||||
}
|
||||
return exists, res, err
|
||||
}
|
||||
|
||||
func (db *Database) GetBlobUsage(ctx context.Context, digest string) (int64, error) {
|
||||
var err error
|
||||
var usage int64
|
||||
count := make([]int64, 0)
|
||||
request := `
|
||||
SELECT count(id) AS count FROM blobs WHERE digest = $1`
|
||||
err = db.db.Select(&count, request, digest)
|
||||
if err != nil {
|
||||
return usage, err
|
||||
}
|
||||
usage = count[0]
|
||||
return usage, err
|
||||
}
|
||||
|
||||
func (db *Database) DeleteBlobByDigest(ctx context.Context, digest string) error {
|
||||
var err error
|
||||
request := `DELETE FROM blobs WHERE digest = $1;`
|
||||
_, err = db.db.Exec(request, digest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -0,0 +1,272 @@
|
||||
package maindb
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"mstore/app/descr"
|
||||
)
|
||||
|
||||
func (db *Database) InsertManifest(ctx context.Context, manifest *descr.Manifest) error {
|
||||
var err error
|
||||
var request string
|
||||
request = `
|
||||
INSERT INTO manifests(id, name, reference, contentType, payload, digest, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8);`
|
||||
_, err = db.db.Exec(request, manifest.ID, manifest.Name, manifest.Reference,
|
||||
manifest.ContentType, manifest.Payload, manifest.Digest,
|
||||
manifest.CreatedAt, manifest.UpdatedAt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (db *Database) UpdateManifest(ctx context.Context, manifest *descr.Manifest) error {
|
||||
var err error
|
||||
var request string
|
||||
// Manifest
|
||||
request = `
|
||||
UPDATE manifests
|
||||
SET contentType = $1, payload = $2, digest = $3, updated_at = $4
|
||||
WHERE name = $5 AND reference = $6`
|
||||
_, err = db.db.Exec(request, manifest.ContentType, manifest.Payload, manifest.Digest,
|
||||
manifest.UpdatedAt, manifest.Name, manifest.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (db *Database) InsertManifestWithBlobs(ctx context.Context, manifest *descr.Manifest, config *descr.Blob, layers []descr.Blob) error {
|
||||
var err error
|
||||
var request string
|
||||
|
||||
// Begin Tx
|
||||
tx, err := db.db.BeginTx(ctx, nil)
|
||||
// Manifest
|
||||
request = `
|
||||
INSERT INTO manifests(id, name, reference, contentType, payload, digest, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8);`
|
||||
_, err = tx.Exec(request, manifest.ID, manifest.Name, manifest.Reference,
|
||||
manifest.ContentType, manifest.Payload, manifest.Digest,
|
||||
manifest.CreatedAt, manifest.UpdatedAt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Config
|
||||
request = `
|
||||
INSERT INTO blobs(id, name, reference, mediaType, digest, size, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`
|
||||
_, err = tx.Exec(request, config.ID, config.Name, config.Reference, config.MediaType,
|
||||
config.Digest, config.Size, config.CreatedAt, config.UpdatedAt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Layers
|
||||
for _, layer := range layers {
|
||||
request = `
|
||||
INSERT INTO blobs(id, name, reference, mediaType, digest, size, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`
|
||||
_, err = tx.Exec(request,
|
||||
layer.ID, layer.Name, layer.Reference, layer.MediaType,
|
||||
layer.Digest, layer.Size, layer.CreatedAt, layer.UpdatedAt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
// Commit
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO: tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
func (db *Database) UpdateManifestWithBlobs(ctx context.Context, manifest *descr.Manifest, newLayers []descr.Blob, oldLayers []descr.Blob) error {
|
||||
var err error
|
||||
var request string
|
||||
|
||||
// Begin Tx
|
||||
tx, err := db.db.BeginTx(ctx, nil)
|
||||
// TODO: tx.Rollback()
|
||||
|
||||
// Manifest
|
||||
request = `
|
||||
UPDATE manifests
|
||||
SET contentType = $1, payload = $2, digest = $3, updated_at = $4
|
||||
WHERE name = $5 AND reference = $6`
|
||||
_, err = tx.Exec(request, manifest.ContentType, manifest.Payload, manifest.Digest,
|
||||
manifest.UpdatedAt, manifest.Name, manifest.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// New layers
|
||||
for _, layer := range newLayers {
|
||||
request = `
|
||||
INSERT INTO blobs(id, name, reference, mediaType, digest, size, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`
|
||||
_, err = tx.Exec(request, layer.ID, layer.Name, layer.Reference, layer.MediaType,
|
||||
layer.Digest, layer.Size, layer.CreatedAt, layer.UpdatedAt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
// Old layers
|
||||
for _, layer := range oldLayers {
|
||||
request = `
|
||||
DELETE FROM blobs
|
||||
WHERE name == $1
|
||||
AND reference == $2
|
||||
AND digest == $3`
|
||||
_, err = tx.Exec(request, layer.Name, layer.Reference, layer.Digest)
|
||||
}
|
||||
// Commit
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (db *Database) ManifestExistsByReference(ctx context.Context, name, reference string) (bool, error) {
|
||||
var err error
|
||||
var count int
|
||||
var exists bool
|
||||
request := `
|
||||
SELECT count(id) AS count FROM manifests
|
||||
WHERE name = $1
|
||||
AND reference = $2
|
||||
LIMIT 1`
|
||||
err = db.db.Get(&count, request, name, reference)
|
||||
if err != nil {
|
||||
return exists, err
|
||||
}
|
||||
if count > 0 {
|
||||
exists = true
|
||||
}
|
||||
return exists, err
|
||||
}
|
||||
|
||||
func (db *Database) ManifestExistsByDigest(ctx context.Context, name, digest string) (bool, error) {
|
||||
var err error
|
||||
var count int
|
||||
var exists bool
|
||||
request := `
|
||||
SELECT count(id) AS count FROM manifests
|
||||
WHERE name = $1 AND digest = $2 LIMIT 1`
|
||||
err = db.db.Get(&count, request, name, digest)
|
||||
if err != nil {
|
||||
return exists, err
|
||||
}
|
||||
if count > 0 {
|
||||
exists = true
|
||||
}
|
||||
return exists, err
|
||||
}
|
||||
|
||||
func (db *Database) GetManifestByDigest(ctx context.Context, name, digest string) (bool, descr.Manifest, error) {
|
||||
var err error
|
||||
manifest := descr.Manifest{}
|
||||
manifests := make([]descr.Manifest, 0)
|
||||
exists := false
|
||||
request := `
|
||||
SELECT * FROM manifests
|
||||
WHERE name = $1 AND digest = $2
|
||||
LIMIT 1`
|
||||
err = db.db.Select(&manifests, request, name, digest)
|
||||
if err != nil {
|
||||
return exists, manifest, err
|
||||
}
|
||||
if len(manifests) > 0 {
|
||||
exists = true
|
||||
manifest = manifests[0]
|
||||
}
|
||||
return exists, manifest, err
|
||||
}
|
||||
|
||||
func (db *Database) GetManifestByReference(ctx context.Context, name, reference string) (bool, descr.Manifest, error) {
|
||||
var err error
|
||||
manifest := descr.Manifest{}
|
||||
exists := false
|
||||
manifests := make([]descr.Manifest, 0)
|
||||
request := `
|
||||
SELECT * FROM manifests
|
||||
WHERE name = $1 AND reference = $2
|
||||
LIMIT 1`
|
||||
err = db.db.Select(&manifests, request, name, reference)
|
||||
if err != nil {
|
||||
return exists, manifest, err
|
||||
}
|
||||
|
||||
if len(manifests) > 0 {
|
||||
exists = true
|
||||
manifest = manifests[0]
|
||||
}
|
||||
return exists, manifest, err
|
||||
}
|
||||
|
||||
func (db *Database) ListManifestsByName(ctx context.Context, name string) ([]descr.Manifest, error) {
|
||||
var err error
|
||||
manifests := make([]descr.Manifest, 0)
|
||||
request := `
|
||||
SELECT id, name, reference, contentType, payload FROM manifests
|
||||
WHERE name = $1`
|
||||
err = db.db.Select(&manifests, request, name)
|
||||
if err != nil {
|
||||
return manifests, err
|
||||
}
|
||||
return manifests, err
|
||||
}
|
||||
|
||||
func (db *Database) ListAllManifests(ctx context.Context) ([]descr.Manifest, error) {
|
||||
var err error
|
||||
manifests := make([]descr.Manifest, 0)
|
||||
request := `SELECT * FROM manifests`
|
||||
err = db.db.Select(&manifests, request)
|
||||
if err != nil {
|
||||
return manifests, err
|
||||
}
|
||||
return manifests, err
|
||||
}
|
||||
|
||||
func (db *Database) GetReferer(ctx context.Context, name, digest string) ([]descr.Manifest, error) {
|
||||
var err error
|
||||
manifests := make([]descr.Manifest, 0)
|
||||
request := `SELECT * FROM manifests WHERE name = $1, digest = $2`
|
||||
err = db.db.Select(&manifests, request, name, digest)
|
||||
if err != nil {
|
||||
return manifests, err
|
||||
}
|
||||
return manifests, err
|
||||
}
|
||||
|
||||
func (db *Database) DeleteManifest(ctx context.Context, name, reference string) error {
|
||||
var err error
|
||||
var request string
|
||||
|
||||
// Begin Tx
|
||||
tx, err := db.db.BeginTx(ctx, nil)
|
||||
// TODO: tx.Rollback()
|
||||
|
||||
// Blobs
|
||||
request = `
|
||||
DELETE FROM blobs
|
||||
WHERE name = $1 AND reference = $2`
|
||||
_, err = tx.Exec(request, name, reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Manifest
|
||||
request = `DELETE FROM manifests WHERE name = $1 AND reference = $2`
|
||||
_, err = tx.Exec(request, name, reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Commit
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user