Init V4 community edition (#2265)
* Init V4 community edition * Init V4 community edition
This commit is contained in:
124
inventory/common.go
Normal file
124
inventory/common.go
Normal file
@@ -0,0 +1,124 @@
|
||||
package inventory
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"fmt"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/conf"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
|
||||
"time"
|
||||
)
|
||||
|
||||
type (
|
||||
OrderDirection string
|
||||
PaginationArgs struct {
|
||||
UseCursorPagination bool
|
||||
Page int
|
||||
PageToken string
|
||||
PageSize int
|
||||
OrderBy string
|
||||
Order OrderDirection
|
||||
}
|
||||
|
||||
PaginationResults struct {
|
||||
Page int `json:"page"`
|
||||
PageSize int `json:"page_size"`
|
||||
TotalItems int `json:"total_items,omitempty"`
|
||||
NextPageToken string `json:"next_token,omitempty"`
|
||||
IsCursor bool `json:"is_cursor,omitempty"`
|
||||
}
|
||||
|
||||
PageToken struct {
|
||||
Time *time.Time `json:"time,omitempty"`
|
||||
ID int `json:"-"`
|
||||
IDHash string `json:"id,omitempty"`
|
||||
String string `json:"string,omitempty"`
|
||||
Int int `json:"int,omitempty"`
|
||||
StartWithFile bool `json:"start_with_file,omitempty"`
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
OrderDirectionAsc = OrderDirection("asc")
|
||||
OrderDirectionDesc = OrderDirection("desc")
|
||||
)
|
||||
|
||||
var (
|
||||
ErrTooManyArguments = fmt.Errorf("too many arguments")
|
||||
)
|
||||
|
||||
func pageTokenFromString(s string, hasher hashid.Encoder, idType int) (*PageToken, error) {
|
||||
sB64Decoded, err := base64.StdEncoding.DecodeString(s)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to decode base64 for page token: %w", err)
|
||||
}
|
||||
|
||||
token := &PageToken{}
|
||||
if err := json.Unmarshal(sB64Decoded, token); err != nil {
|
||||
return nil, fmt.Errorf("failed to unmarshal page token: %w", err)
|
||||
}
|
||||
|
||||
id, err := hasher.Decode(token.IDHash, idType)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to decode id: %w", err)
|
||||
}
|
||||
|
||||
if token.Time == nil {
|
||||
token.Time = &time.Time{}
|
||||
}
|
||||
|
||||
token.ID = id
|
||||
return token, nil
|
||||
}
|
||||
|
||||
func (p *PageToken) Encode(hasher hashid.Encoder, encodeFunc hashid.EncodeFunc) (string, error) {
|
||||
p.IDHash = encodeFunc(hasher, p.ID)
|
||||
res, err := json.Marshal(p)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to marshal page token: %w", err)
|
||||
}
|
||||
|
||||
return base64.StdEncoding.EncodeToString(res), nil
|
||||
}
|
||||
|
||||
// sqlParamLimit returns the max number of sql parameters.
|
||||
func sqlParamLimit(dbType conf.DBType) int {
|
||||
switch dbType {
|
||||
case conf.PostgresDB:
|
||||
return 34464
|
||||
case conf.SQLiteDB, conf.SQLite3DB:
|
||||
// https://www.sqlite.org/limits.html
|
||||
return 32766
|
||||
default:
|
||||
return 32766
|
||||
}
|
||||
}
|
||||
|
||||
// getOrderTerm returns the order term for ent.
|
||||
func getOrderTerm(d OrderDirection) sql.OrderTermOption {
|
||||
switch d {
|
||||
case OrderDirectionDesc:
|
||||
return sql.OrderDesc()
|
||||
default:
|
||||
return sql.OrderAsc()
|
||||
}
|
||||
}
|
||||
|
||||
func capPageSize(maxSQlParam, preferredSize, margin int) int {
|
||||
// Page size should not be bigger than max SQL parameter
|
||||
pageSize := preferredSize
|
||||
if maxSQlParam > 0 && pageSize > maxSQlParam-margin || pageSize == 0 {
|
||||
pageSize = maxSQlParam - margin
|
||||
}
|
||||
|
||||
return pageSize
|
||||
}
|
||||
|
||||
type StorageDiff map[int]int64
|
||||
|
||||
func (s *StorageDiff) Merge(diff StorageDiff) {
|
||||
for k, v := range diff {
|
||||
(*s)[k] += v
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user