Documentation ¶
Index ¶
- Constants
- Variables
- func GetDB(c ...interface{}) (*sql.DB, error)
- func HasInflight() (b bool)
- func InitBucketDB(c Ctx, bktID int64) error
- func InitDB() error
- type AccessCtrlMgr
- type Admin
- type AsyncHandle
- type BucketInfo
- type BucketMetadataAdapter
- type Ctx
- type DataAdapter
- type DataInfo
- type DataMetadataAdapter
- type DefaultAccessCtrlMgr
- type DefaultDataAdapter
- func (dda *DefaultDataAdapter) Close()
- func (dda *DefaultDataAdapter) Read(c Ctx, bktID, dataID int64, sn int) ([]byte, error)
- func (dda *DefaultDataAdapter) ReadBytes(c Ctx, bktID, dataID int64, sn, offset, size int) ([]byte, error)
- func (dda *DefaultDataAdapter) SetOptions(opt Options)
- func (dda *DefaultDataAdapter) Write(c Ctx, bktID, dataID int64, sn int, buf []byte) error
- type DefaultMetadataAdapter
- func (dma *DefaultMetadataAdapter) Close()
- func (dma *DefaultMetadataAdapter) GetBkt(c Ctx, ids []int64) (o []*BucketInfo, err error)
- func (dma *DefaultMetadataAdapter) GetData(c Ctx, bktID, id int64) (d *DataInfo, err error)
- func (dma *DefaultMetadataAdapter) GetObj(c Ctx, bktID int64, ids []int64) (o []*ObjectInfo, err error)
- func (dma *DefaultMetadataAdapter) GetUsr(c Ctx, ids []int64) (o []*UserInfo, err error)
- func (dma *DefaultMetadataAdapter) GetUsr2(c Ctx, usr string) (o *UserInfo, err error)
- func (dma *DefaultMetadataAdapter) ListBkt(c Ctx, uid int64) (o []*BucketInfo, err error)
- func (dma *DefaultMetadataAdapter) ListObj(c Ctx, bktID, pid int64, wd, delim, order string, count int) (o []*ObjectInfo, cnt int64, d string, err error)
- func (dma *DefaultMetadataAdapter) PutBkt(c Ctx, o []*BucketInfo) error
- func (dma *DefaultMetadataAdapter) PutData(c Ctx, bktID int64, d []*DataInfo) error
- func (dma *DefaultMetadataAdapter) PutObj(c Ctx, bktID int64, o []*ObjectInfo) (ids []int64, err error)
- func (dma *DefaultMetadataAdapter) PutUsr(c Ctx, u *UserInfo) error
- func (dma *DefaultMetadataAdapter) RefData(c Ctx, bktID int64, d []*DataInfo) ([]int64, error)
- func (dma *DefaultMetadataAdapter) SetObj(c Ctx, bktID int64, fields []string, o *ObjectInfo) error
- func (dma *DefaultMetadataAdapter) SetUsr(c Ctx, fields []string, u *UserInfo) error
- type Error
- type Handler
- type ListOptions
- type LocalAdmin
- type LocalHandler
- func (lh *LocalHandler) Close()
- func (lh *LocalHandler) Delete(c Ctx, bktID, id int64) error
- func (lh *LocalHandler) Get(c Ctx, bktID int64, ids []int64) ([]*ObjectInfo, error)
- func (lh *LocalHandler) GetData(c Ctx, bktID, id int64, sn int, offset []int) ([]byte, error)
- func (lh *LocalHandler) GetDataInfo(c Ctx, bktID, id int64) (*DataInfo, error)
- func (lh *LocalHandler) List(c Ctx, bktID, pid int64, opt ListOptions) ([]*ObjectInfo, int64, string, error)
- func (lh *LocalHandler) Login(c Ctx, usr, pwd string) (Ctx, *UserInfo, []*BucketInfo, error)
- func (lh *LocalHandler) MoveTo(c Ctx, bktID, id, pid int64) error
- func (lh *LocalHandler) New(Handler) Handler
- func (lh *LocalHandler) NewID() int64
- func (lh *LocalHandler) Put(c Ctx, bktID int64, o []*ObjectInfo) ([]int64, error)
- func (lh *LocalHandler) PutData(c Ctx, bktID, dataID int64, sn int, buf []byte) (int64, error)
- func (lh *LocalHandler) PutDataInfo(c Ctx, bktID int64, d []*DataInfo) (ids []int64, err error)
- func (lh *LocalHandler) Recycle(c Ctx, bktID, id int64) error
- func (lh *LocalHandler) Ref(c Ctx, bktID int64, d []*DataInfo) ([]int64, error)
- func (lh *LocalHandler) Rename(c Ctx, bktID, id int64, name string) error
- func (lh *LocalHandler) SetAdapter(ma MetadataAdapter, da DataAdapter)
- func (lh *LocalHandler) SetOptions(opt Options)
- type MetadataAdapter
- type ObjectInfo
- type ObjectMetadataAdapter
- type Options
- type UserInfo
- type UserMetadataAdapter
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 HasInflight ¶
func HasInflight() (b bool)
func InitBucketDB ¶
Types ¶
type AccessCtrlMgr ¶
type Admin ¶
type Admin interface { // 传入underlying,返回当前的,构成链式调用 New(a Admin) Admin Close() PutBkt(c Ctx, o []*BucketInfo) error }
func NewLocalAdmin ¶
func NewLocalAdmin() Admin
type AsyncHandle ¶
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 DataAdapter ¶
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 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) SetOptions ¶
func (dda *DefaultDataAdapter) SetOptions(opt Options)
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) SetObj ¶
func (dma *DefaultMetadataAdapter) SetObj(c Ctx, bktID int64, fields []string, o *ObjectInfo) error
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) 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) Get ¶
func (lh *LocalHandler) Get(c Ctx, bktID int64, ids []int64) ([]*ObjectInfo, error)
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) 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) PutDataInfo ¶
上传完数据以后,再创建元数据
func (*LocalHandler) Ref ¶
只有文件长度、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 MetadataAdapter ¶
type MetadataAdapter interface { Close() BucketMetadataAdapter UserMetadataAdapter DataMetadataAdapter ObjectMetadataAdapter }
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 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"` // 头像 }
Click to show internal directories.
Click to hide internal directories.