74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
|
// Copyright 2022 The Gitea Authors. All rights reserved.
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
package dbfs
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"os"
|
||
|
|
||
|
"code.gitea.io/gitea/models/db"
|
||
|
)
|
||
|
|
||
|
type dbfsMeta struct {
|
||
|
ID int64 `xorm:"pk autoincr"`
|
||
|
FullPath string `xorm:"VARCHAR(500) UNIQUE NOT NULL"`
|
||
|
BlockSize int64 `xorm:"BIGINT NOT NULL"`
|
||
|
FileSize int64 `xorm:"BIGINT NOT NULL"`
|
||
|
CreateTimestamp int64 `xorm:"BIGINT NOT NULL"`
|
||
|
ModifyTimestamp int64 `xorm:"BIGINT NOT NULL"`
|
||
|
}
|
||
|
|
||
|
type dbfsData struct {
|
||
|
ID int64 `xorm:"pk autoincr"`
|
||
|
Revision int64 `xorm:"BIGINT NOT NULL"`
|
||
|
MetaID int64 `xorm:"BIGINT index(meta_offset) NOT NULL"`
|
||
|
BlobOffset int64 `xorm:"BIGINT index(meta_offset) NOT NULL"`
|
||
|
BlobSize int64 `xorm:"BIGINT NOT NULL"`
|
||
|
BlobData []byte `xorm:"BLOB NOT NULL"`
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
db.RegisterModel(new(dbfsMeta))
|
||
|
db.RegisterModel(new(dbfsData))
|
||
|
}
|
||
|
|
||
|
func OpenFile(ctx context.Context, name string, flag int) (File, error) {
|
||
|
f, err := newDbFile(ctx, name)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
err = f.open(flag)
|
||
|
if err != nil {
|
||
|
_ = f.Close()
|
||
|
return nil, err
|
||
|
}
|
||
|
return f, nil
|
||
|
}
|
||
|
|
||
|
func Open(ctx context.Context, name string) (File, error) {
|
||
|
return OpenFile(ctx, name, os.O_RDONLY)
|
||
|
}
|
||
|
|
||
|
func Create(ctx context.Context, name string) (File, error) {
|
||
|
return OpenFile(ctx, name, os.O_RDWR|os.O_CREATE|os.O_TRUNC)
|
||
|
}
|
||
|
|
||
|
func Rename(ctx context.Context, oldPath, newPath string) error {
|
||
|
f, err := newDbFile(ctx, oldPath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer f.Close()
|
||
|
return f.renameTo(newPath)
|
||
|
}
|
||
|
|
||
|
func Remove(ctx context.Context, name string) error {
|
||
|
f, err := newDbFile(ctx, name)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer f.Close()
|
||
|
return f.delete()
|
||
|
}
|