/
settings.go
103 lines (87 loc) · 2.44 KB
/
settings.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Copyright 2021 FerretDB Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package metadata
import (
"database/sql"
"database/sql/driver"
"encoding/json"
"slices"
"github.com/FerretDB/FerretDB/internal/util/lazyerrors"
)
// Settings represents collection settings.
type Settings struct {
UUID string `json:"uuid"`
Indexes []IndexInfo `json:"indexes"`
CappedSize int64 `json:"cappedSize"`
CappedDocuments int64 `json:"cappedDocuments"`
}
// IndexInfo represents information about a single index.
type IndexInfo struct {
Name string `json:"name"`
Key []IndexKeyPair `json:"key"`
Unique bool `json:"unique"`
}
// IndexKeyPair consists of a field name and a sort order that are part of the index.
type IndexKeyPair struct {
Field string `json:"field"`
Descending bool `json:"descending"`
}
// deepCopy returns a deep copy.
func (s Settings) deepCopy() Settings {
indexes := make([]IndexInfo, len(s.Indexes))
for i, index := range s.Indexes {
indexes[i] = IndexInfo{
Name: index.Name,
Key: slices.Clone(index.Key),
Unique: index.Unique,
}
}
return Settings{
UUID: s.UUID,
Indexes: indexes,
CappedSize: s.CappedSize,
CappedDocuments: s.CappedDocuments,
}
}
// Value implements driver.Valuer interface.
func (s Settings) Value() (driver.Value, error) {
res, err := json.Marshal(s)
if err != nil {
return nil, lazyerrors.Error(err)
}
return string(res), nil
}
// Scan implements sql.Scanner interface.
func (s *Settings) Scan(src any) error {
var err error
switch src := src.(type) {
case nil:
*s = Settings{}
case []byte:
err = json.Unmarshal(src, s)
case string:
err = json.Unmarshal([]byte(src), s)
default:
panic("can't scan collection settings")
}
if err != nil {
return lazyerrors.Error(err)
}
return nil
}
// check interfaces
var (
_ driver.Valuer = Settings{}
_ sql.Scanner = (*Settings)(nil)
)