core

package
v0.0.0-...-9834278 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 16, 2024 License: MIT Imports: 19 Imported by: 2

Documentation

Index

Constants

View Source
const (
	NA  = 1 << iota
	DR  // 数据读取
	DW  // 数据写入
	DD  // 数据删除
	MDR // 元数据读取
	MDW // 元数据写入
	MDD // 元数据删除

	DRW  = DR | DW               // 数据读写
	MDRW = MDR | MDW             // 元数据读写
	ALL  = DRW | DD | MDRW | MDD // 数据、元数据读写删
)
View Source
const (
	USER  = iota // 普通用户
	ADMIN        // 管理员
)
View Source
const (
	ERR_AUTH_FAILED   = Error("auth failed")
	ERR_NEED_LOGIN    = Error("need login")
	ERR_INCORRECT_PWD = Error("incorrect username or password")

	ERR_NO_PERM = Error("no permission")
	ERR_NO_ROLE = Error("role mismatch")

	ERR_OPEN_FILE = Error("open file failed")
	ERR_READ_FILE = Error("read file failed")

	ERR_OPEN_DB  = Error("open db failed")
	ERR_QUERY_DB = Error("query db failed")
	ERR_EXEC_DB  = Error("exec db failed")
	ERR_DUP_KEY  = Error("object with same name already exists")
)
View Source
const (
	OBJ_TYPE_MALFORMED = iota - 1
	OBJ_TYPE_NONE
	OBJ_TYPE_DIR
	OBJ_TYPE_FILE
	OBJ_TYPE_VERSION
	OBJ_TYPE_PREVIEW
)

对象类型

View Source
const (
	DATA_NORMAL         = uint32(1 << iota) // 正常
	DATA_ENDEC_AES256                       // 是否AES加密
	DATA_ENDEC_SM4                          // 是否SM4加密
	DATA_ENDEC_RESERVED                     // 是否保留的加密
	DATA_CMPR_SNAPPY                        // 是否snappy压缩
	DATA_CMPR_ZSTD                          // 是否zstd压缩
	DATA_CMPR_GZIP                          // 是否gzip压缩
	DATA_CMPR_BR                            // 是否brotli压缩
	DATA_KIND_IMG                           // 图片类型
	DATA_KIND_VIDEO                         // 视频类型
	DATA_KIND_AUDIO                         // 音频类型
	DATA_KIND_ARCHIVE                       // 归档类型
	DATA_KIND_DOCS                          // 文档类型
	DATA_KIND_FONT                          // 字体类型
	DATA_KIND_APP                           // 应用类型
	DATA_KIND_RESERVED                      // 未知类型

	DATA_MALFORMED  = 0 // 是否损坏
	DATA_ENDEC_MASK = DATA_ENDEC_AES256 | DATA_ENDEC_SM4 | DATA_ENDEC_RESERVED
	DATA_CMPR_MASK  = DATA_CMPR_SNAPPY | DATA_CMPR_ZSTD | DATA_CMPR_GZIP | DATA_CMPR_BR
	DATA_KIND_MASK  = DATA_KIND_IMG | DATA_KIND_VIDEO | DATA_KIND_AUDIO | DATA_KIND_ARCHIVE | DATA_KIND_DOCS | DATA_KIND_FONT | DATA_KIND_APP | DATA_KIND_RESERVED
)

数据状态

View Source
const (
	BKT_TBL = "bkt"
	USR_TBL = "usr"

	OBJ_TBL  = "obj"
	DATA_TBL = "data"
)
View Source
const EmptyDataID = 4708888888888
View Source
const ROOT_OID int64 = 0

Variables

View Source
var ORCAS_BASE = os.Getenv("ORCAS_BASE")
View Source
var ORCAS_DATA = os.Getenv("ORCAS_DATA")

Functions

func GetDB

func GetDB(c ...interface{}) (*sql.DB, error)

func HasInflight

func HasInflight() (b bool)

func InitBucketDB

func InitBucketDB(c Ctx, bktID int64) error

func InitDB

func InitDB() error

Types

type AccessCtrlMgr

type AccessCtrlMgr interface {
	SetAdapter(ma MetadataAdapter)

	CheckPermission(c Ctx, action int, bktID int64) error
	CheckRole(c Ctx, role uint32) error
}

type Admin

type Admin interface {
	// 传入underlying,返回当前的,构成链式调用
	New(a Admin) Admin
	Close()

	PutBkt(c Ctx, o []*BucketInfo) error
}

func NewLocalAdmin

func NewLocalAdmin() Admin

type AsyncHandle

type AsyncHandle struct {
	F *os.File
	B *bufio.Writer
}

func (AsyncHandle) Close

func (ah AsyncHandle) Close()

type BucketInfo

type BucketInfo struct {
	ID    int64  `borm:"id" json:"i,omitempty"`    // 桶ID
	Name  string `borm:"name" json:"n,omitempty"`  // 桶名称
	UID   int64  `borm:"uid" json:"u,omitempty"`   // 拥有者
	Type  int    `borm:"type" json:"t,omitempty"`  // 桶类型,0: none, 1: normal ...
	Quota int64  `borm:"quota" json:"q,omitempty"` // 配额
	Usage int64  `borm:"usage" json:"s,omitempty"` // 使用量,统计所有版本的原始大小

}

type BucketMetadataAdapter

type BucketMetadataAdapter interface {
	PutBkt(c Ctx, o []*BucketInfo) error
	GetBkt(c Ctx, ids []int64) ([]*BucketInfo, error)
	ListBkt(c Ctx, uid int64) ([]*BucketInfo, error)
}

type Ctx

type Ctx context.Context

func UserInfo2Ctx

func UserInfo2Ctx(c Ctx, u *UserInfo) Ctx

type DataAdapter

type DataAdapter interface {
	SetOptions(opt Options)
	Close()

	Write(c Ctx, bktID, dataID int64, sn int, buf []byte) error

	Read(c Ctx, bktID, dataID int64, sn int) ([]byte, error)
	ReadBytes(c Ctx, bktID, dataID int64, sn, offset, size int) ([]byte, error)
}

type DataInfo

type DataInfo struct {
	ID        int64  `borm:"id" json:"i,omitempty"`      // 数据ID(idgen随机生成的id)
	Size      int64  `borm:"size" json:"s,omitempty"`    // 数据的大小
	OrigSize  int64  `borm:"o_size" json:"r,omitempty"`  // 数据的原始大小
	HdrCRC32  uint32 `borm:"h_crc32" json:"h,omitempty"` // 头部100KB的CRC32校验值
	CRC32     uint32 `borm:"crc32" json:"c,omitempty"`   // 整个数据的CRC32校验值(最原始数据)
	MD5       int64  `borm:"md5" json:"m,omitempty"`     // 整个数据的MD5值(最原始数据)
	Cksum     uint32 `borm:"cksum" json:"u,omitempty"`   // 整个数据的CRC32校验值(最终数据,用于一致性审计)
	Kind      uint32 `borm:"kind" json:"k,omitempty"`    // 数据状态,正常、损坏、加密、压缩、类型(用于预览等)
	PkgID     int64  `borm:"pkg_id" json:"p,omitempty"`  // 打包数据的ID(也是idgen生成的id)
	PkgOffset uint32 `borm:"pkg_off" json:"g,omitempty"` // 打包数据的偏移位置

}

func EmptyDataInfo

func EmptyDataInfo() *DataInfo

type DataMetadataAdapter

type DataMetadataAdapter interface {
	RefData(c Ctx, bktID int64, d []*DataInfo) ([]int64, error)
	PutData(c Ctx, bktID int64, d []*DataInfo) error
	GetData(c Ctx, bktID, id int64) (*DataInfo, error)
}

type DefaultAccessCtrlMgr

type DefaultAccessCtrlMgr struct {
	// contains filtered or unexported fields
}

func (*DefaultAccessCtrlMgr) CheckPermission

func (dacm *DefaultAccessCtrlMgr) CheckPermission(c Ctx, action int, bktID int64) error

func (*DefaultAccessCtrlMgr) CheckRole

func (dacm *DefaultAccessCtrlMgr) CheckRole(c Ctx, role uint32) error

func (*DefaultAccessCtrlMgr) SetAdapter

func (dacm *DefaultAccessCtrlMgr) SetAdapter(ma MetadataAdapter)

type DefaultDataAdapter

type DefaultDataAdapter struct {
	// contains filtered or unexported fields
}

func (*DefaultDataAdapter) Close

func (dda *DefaultDataAdapter) Close()

func (*DefaultDataAdapter) Read

func (dda *DefaultDataAdapter) Read(c Ctx, bktID, dataID int64, sn int) ([]byte, error)

func (*DefaultDataAdapter) ReadBytes

func (dda *DefaultDataAdapter) ReadBytes(c Ctx, bktID, dataID int64, sn, offset, size int) ([]byte, error)

func (*DefaultDataAdapter) SetOptions

func (dda *DefaultDataAdapter) SetOptions(opt Options)

func (*DefaultDataAdapter) Write

func (dda *DefaultDataAdapter) Write(c Ctx, bktID, dataID int64, sn int, buf []byte) error

type DefaultMetadataAdapter

type DefaultMetadataAdapter struct {
}

func (*DefaultMetadataAdapter) Close

func (dma *DefaultMetadataAdapter) Close()

func (*DefaultMetadataAdapter) GetBkt

func (dma *DefaultMetadataAdapter) GetBkt(c Ctx, ids []int64) (o []*BucketInfo, err error)

func (*DefaultMetadataAdapter) GetData

func (dma *DefaultMetadataAdapter) GetData(c Ctx, bktID, id int64) (d *DataInfo, err error)

func (*DefaultMetadataAdapter) GetObj

func (dma *DefaultMetadataAdapter) GetObj(c Ctx, bktID int64, ids []int64) (o []*ObjectInfo, err error)

func (*DefaultMetadataAdapter) GetUsr

func (dma *DefaultMetadataAdapter) GetUsr(c Ctx, ids []int64) (o []*UserInfo, err error)

func (*DefaultMetadataAdapter) GetUsr2

func (dma *DefaultMetadataAdapter) GetUsr2(c Ctx, usr string) (o *UserInfo, err error)

func (*DefaultMetadataAdapter) ListBkt

func (dma *DefaultMetadataAdapter) ListBkt(c Ctx, uid int64) (o []*BucketInfo, err error)

func (*DefaultMetadataAdapter) ListObj

func (dma *DefaultMetadataAdapter) ListObj(c Ctx, bktID, pid int64,
	wd, delim, order string, count int) (o []*ObjectInfo,
	cnt int64, d string, err error)

func (*DefaultMetadataAdapter) PutBkt

func (dma *DefaultMetadataAdapter) PutBkt(c Ctx, o []*BucketInfo) error

func (*DefaultMetadataAdapter) PutData

func (dma *DefaultMetadataAdapter) PutData(c Ctx, bktID int64, d []*DataInfo) error

func (*DefaultMetadataAdapter) PutObj

func (dma *DefaultMetadataAdapter) PutObj(c Ctx, bktID int64, o []*ObjectInfo) (ids []int64, err error)

func (*DefaultMetadataAdapter) PutUsr

func (dma *DefaultMetadataAdapter) PutUsr(c Ctx, u *UserInfo) error

func (*DefaultMetadataAdapter) RefData

func (dma *DefaultMetadataAdapter) RefData(c Ctx, bktID int64, d []*DataInfo) ([]int64, error)

func (*DefaultMetadataAdapter) SetObj

func (dma *DefaultMetadataAdapter) SetObj(c Ctx, bktID int64, fields []string, o *ObjectInfo) error

func (*DefaultMetadataAdapter) SetUsr

func (dma *DefaultMetadataAdapter) SetUsr(c Ctx, fields []string, u *UserInfo) error

type Error

type Error string

func (Error) Error

func (e Error) Error() string

type Handler

type Handler interface {
	// 传入underlying,返回当前的,构成链式调用
	New(h Handler) Handler
	Close()

	SetOptions(opt Options)
	// 设置自定义的存储适配器
	SetAdapter(ma MetadataAdapter, da DataAdapter)

	// 登录用户
	Login(c Ctx, usr, pwd string) (Ctx, *UserInfo, []*BucketInfo, error)

	NewID() int64
	// 只有文件长度、HdrCRC32是预Ref,如果成功返回新DataID,失败返回0
	// 有文件长度、CRC32、MD5,成功返回引用的DataID,失败返回0,客户端发现DataID有变化,说明不需要上传数据
	// 如果非预Ref DataID传0,说明跳过了预Ref
	Ref(c Ctx, bktID int64, d []*DataInfo) ([]int64, error)
	// sn从0开始,DataID不传默认创建一个新的
	PutData(c Ctx, bktID, dataID int64, sn int, buf []byte) (int64, error)
	// 只传一个参数说明是sn,传两个参数说明是sn+offset,传三个参数说明是sn+offset+size
	GetData(c Ctx, bktID, id int64, sn int, offset []int) ([]byte, error)
	// 上传元数据
	PutDataInfo(c Ctx, bktID int64, d []*DataInfo) ([]int64, error)
	// 获取数据信息
	GetDataInfo(c Ctx, bktID, id int64) (*DataInfo, error)

	// Name不传默认用ID字符串化后的值作为Name
	Put(c Ctx, bktID int64, o []*ObjectInfo) ([]int64, error)
	Get(c Ctx, bktID int64, ids []int64) ([]*ObjectInfo, error)
	List(c Ctx, bktID, pid int64, opt ListOptions) (o []*ObjectInfo, cnt int64, delim string, err error)

	Rename(c Ctx, bktID, id int64, name string) error
	MoveTo(c Ctx, bktID, id, pid int64) error

	// 垃圾回收时有数据没有元数据引用的为脏数据(需要留出窗口时间),有元数据没有数据的为损坏数据
	Recycle(c Ctx, bktID, id int64) error
	Delete(c Ctx, bktID, id int64) error
}

func NewLocalHandler

func NewLocalHandler() Handler

type ListOptions

type ListOptions struct {
	Word  string `json:"w,omitempty"` // 过滤词,支持通配符*和?
	Delim string `json:"d,omitempty"` // 分隔符,每次请求后返回,原样回传即可
	Type  int    `json:"t,omitempty"` // 对象类型,-1: malformed, 0: 不过滤(default), 1: dir, 2: file, 3: version, 4: preview(thumb/m3u8/pdf)
	Count int    `json:"c,omitempty"` // 查询个数
	Order string `json:"o,omitempty"` // 排序方式,id/mtime/name/size/type 前缀 +: 升序(默认) -: 降序
	Brief int    `json:"e,omitempty"` // 显示更少内容(只在网络传输层,节省流量时有效),0: FULL(default), 1: without EXT, 2:only ID

}

type LocalAdmin

type LocalAdmin struct {
	// contains filtered or unexported fields
}

func (*LocalAdmin) Close

func (la *LocalAdmin) Close()

func (*LocalAdmin) New

func (la *LocalAdmin) New(Admin) Admin

传入underlying,返回当前的,构成链式调用

func (*LocalAdmin) PutBkt

func (la *LocalAdmin) PutBkt(c Ctx, o []*BucketInfo) error

type LocalHandler

type LocalHandler struct {
	// contains filtered or unexported fields
}

func (*LocalHandler) Close

func (lh *LocalHandler) Close()

func (*LocalHandler) Delete

func (lh *LocalHandler) Delete(c Ctx, bktID, id int64) error

func (*LocalHandler) Get

func (lh *LocalHandler) Get(c Ctx, bktID int64, ids []int64) ([]*ObjectInfo, error)

func (*LocalHandler) GetData

func (lh *LocalHandler) GetData(c Ctx, bktID, id int64, sn int, offset []int) ([]byte, error)

只传一个参数说明是sn,传两个参数说明是sn+offset,传三个参数说明是sn+offset+size

func (*LocalHandler) GetDataInfo

func (lh *LocalHandler) GetDataInfo(c Ctx, bktID, id int64) (*DataInfo, error)

func (*LocalHandler) List

func (lh *LocalHandler) List(c Ctx, bktID, pid int64, opt ListOptions) ([]*ObjectInfo, int64, string, error)

func (*LocalHandler) Login

func (lh *LocalHandler) Login(c Ctx, usr, pwd string) (Ctx, *UserInfo, []*BucketInfo, error)

func (*LocalHandler) MoveTo

func (lh *LocalHandler) MoveTo(c Ctx, bktID, id, pid int64) error

func (*LocalHandler) New

func (lh *LocalHandler) New(Handler) Handler

传入underlying,返回当前的,构成链式调用

func (*LocalHandler) NewID

func (lh *LocalHandler) NewID() int64

func (*LocalHandler) Put

func (lh *LocalHandler) Put(c Ctx, bktID int64, o []*ObjectInfo) ([]int64, error)

垃圾回收时有数据没有元数据引用的为脏数据(需要留出窗口时间),有元数据没有数据的为损坏数据 PID支持用补码来直接引用当次还未上传的对象的ID

func (*LocalHandler) PutData

func (lh *LocalHandler) PutData(c Ctx, bktID, dataID int64, sn int, buf []byte) (int64, error)

打包上传或者小文件,sn传-1,大文件sn从0开始,DataID不传默认创建一个新的

func (*LocalHandler) PutDataInfo

func (lh *LocalHandler) PutDataInfo(c Ctx, bktID int64, d []*DataInfo) (ids []int64, err error)

上传完数据以后,再创建元数据

func (*LocalHandler) Recycle

func (lh *LocalHandler) Recycle(c Ctx, bktID, id int64) error

func (*LocalHandler) Ref

func (lh *LocalHandler) Ref(c Ctx, bktID int64, d []*DataInfo) ([]int64, error)

只有文件长度、HdrCRC32是预Ref,如果成功返回新DataID,失败返回0 有文件长度、CRC32、MD5,成功返回引用的DataID,失败返回0,客户端发现DataID有变化,说明不需要上传数据 如果非预Ref DataID传0,说明跳过了预Ref

func (*LocalHandler) Rename

func (lh *LocalHandler) Rename(c Ctx, bktID, id int64, name string) error

func (*LocalHandler) SetAdapter

func (lh *LocalHandler) SetAdapter(ma MetadataAdapter, da DataAdapter)

func (*LocalHandler) SetOptions

func (lh *LocalHandler) SetOptions(opt Options)

type ObjectInfo

type ObjectInfo struct {
	ID     int64  `borm:"id" json:"i,omitempty"`    // 对象ID(idgen随机生成的id)
	PID    int64  `borm:"pid" json:"p,omitempty"`   // 父对象ID
	MTime  int64  `borm:"mtime" json:"m,omitempty"` // 更新时间,秒级时间戳
	DataID int64  `borm:"did" json:"d,omitempty"`   // 数据ID,如果为0,说明没有数据(新创建的文件,DataID就是对象ID,作为对象的首版本数据)
	Type   int    `borm:"type" json:"t,omitempty"`  // 对象类型,-1: malformed, 0: none, 1: dir, 2: file, 3: version, 4: preview(thumb/m3u8/pdf)
	Name   string `borm:"name" json:"n,omitempty"`  // 对象名称
	Size   int64  `borm:"size" json:"s,omitempty"`  // 对象的大小,目录的大小是子对象数,文件的大小是最新版本的字节数
	Extra  string `borm:"ext" json:"e,omitempty"`   // 对象的扩展信息

}

type ObjectMetadataAdapter

type ObjectMetadataAdapter interface {
	PutObj(c Ctx, bktID int64, o []*ObjectInfo) ([]int64, error)
	GetObj(c Ctx, bktID int64, ids []int64) ([]*ObjectInfo, error)
	SetObj(c Ctx, bktID int64, fields []string, o *ObjectInfo) error
	ListObj(c Ctx, bktID, pid int64, wd, delim, order string, count int) ([]*ObjectInfo, int64, string, error)
}

type Options

type Options struct {
	Sync bool
}

type UserInfo

type UserInfo struct {
	ID     int64  `borm:"id" json:"i,omitempty"`     // 用户ID
	Usr    string `borm:"usr" json:"u,omitempty"`    // 用户名
	Pwd    string `borm:"pwd" json:"p,omitempty"`    // 密码,加密方式PBKDF2-HMAC-SHA256
	Key    string `borm:"key" json:"k,omitempty"`    // 数据库key
	Role   uint32 `borm:"role" json:"r,omitempty"`   // 用户角色:普通用户 / 管理员
	Name   string `borm:"name" json:"n,omitempty"`   // 名称
	Avatar string `borm:"avatar" json:"a,omitempty"` // 头像
}

type UserMetadataAdapter

type UserMetadataAdapter interface {
	PutUsr(c Ctx, u *UserInfo) error
	GetUsr(c Ctx, ids []int64) ([]*UserInfo, error)
	GetUsr2(c Ctx, usr string) (*UserInfo, error)
	SetUsr(c Ctx, fields []string, u *UserInfo) error
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL