Files
amsterdam/database/imagestore.go
T

126 lines
3.5 KiB
Go

/*
* Amsterdam Web Communities System
* Copyright (c) 2025-2026 Erbosoft Metaverse Design Solutions, All Rights Reserved
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
*/
// The database package contains database management and storage logic.
package database
import (
"context"
"database/sql"
)
// ImageStore is the structure for the image store table.
type ImageStore struct {
ImgId int32 `db:"imgid"`
TypeCode int16 `db:"typecode"`
OwnerID *int32 `db:"ownerid"`
MimeType string `db:"mimetype"`
Length int32 `db:"length"`
Data []byte `db:"data"`
}
// Values for the TypeCode field of ImageStore.
const (
ImageTypeUserPhoto = int16(1)
ImageTypeCommunityLogo = int16(2)
)
// Save persists the ImageStore record to the database.
func (img *ImageStore) Save(ctx context.Context) error {
var err error
if img.ImgId > 0 {
_, err = amdb.NamedExecContext(ctx, `UPDATE imagestore SET typecode = :typecode, ownerid = :ownerid, mimetype = :mimetype,
length = :length, data = :data WHERE imgid = :imgid`, img)
} else {
var rs sql.Result
rs, err = amdb.NamedExecContext(ctx, `INSERT INTO imagestore (typecode, ownerid, mimetype, length, data)
VALUES (:typecode, :ownerid, :mimetype, :length, :data)`, img)
if err == nil {
var lii int64
lii, err = rs.LastInsertId()
if err == nil {
img.ImgId = int32(lii)
}
}
}
return err
}
/* AmLoadImage loads an image from the database.
* Parameters:
* ctx - Standard Go context value.
* id - The ID of the image to be loaded.
* Returns:
* Pointer to ImageStore, or nil.
* Standard Go error status.
*/
func AmLoadImage(ctx context.Context, id int32) (*ImageStore, error) {
imgdata := new(ImageStore)
if err := amdb.GetContext(ctx, imgdata, "SELECT * FROM imagestore WHERE imgid = ?", id); err != nil {
return nil, err
}
return imgdata, nil
}
/* AmStoreImage stores an image in the database, overwriting one with the same type code and owner if it exists.
* Parameters:
* ctx - Standard Go context value.
* typecode - Type code for the image.
* owner - Owner Id for the image (UID or community ID)
* mimetype - MIME type of the image.
* data - Bytes of the actual image.
* Returns:
* Pointer to ImageStore, or nil.
* Standard Go error status.
*/
func AmStoreImage(ctx context.Context, typecode int16, owner int32, mimetype string, data []byte) (*ImageStore, error) {
var img *ImageStore
var id int32
err := amdb.GetContext(ctx, &id, "SELECT imgid FROM imagestore WHERE typecode = ? AND ownerid = ?", typecode, owner)
switch err {
case nil:
img, err = AmLoadImage(ctx, id)
if err != nil {
return nil, err
}
img.MimeType = mimetype
img.Length = int32(len(data))
img.Data = data
case sql.ErrNoRows:
img = &ImageStore{
ImgId: -1,
TypeCode: typecode,
OwnerID: &owner,
MimeType: mimetype,
Length: int32(len(data)),
Data: data,
}
default:
return nil, err
}
err = img.Save(ctx)
if err != nil {
return nil, err
}
return img, nil
}
/* AmDeleteImage erases an image from the database.
* Parameters:
* ctx - Standard Go context value.
* id - The ID of the image to be deleted.
* Returns:
* Standard Go error status.
*/
func AmDeleteImage(ctx context.Context, id int32) error {
_, err := amdb.ExecContext(ctx, "DELETE FROM imagestore WHERE imgid = ?", id)
return err
}