Skip to content

Commit e2dc1c4

Browse files
authored
Merge pull request #1 from v8platform/develop
v0.2.0
2 parents 6350c10 + 4ee72ef commit e2dc1c4

File tree

5 files changed

+148
-26
lines changed

5 files changed

+148
-26
lines changed

bracket.go

Lines changed: 97 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,44 @@ import (
2020
type Node interface {
2121

2222
// GetNode получение вложенных нов по их адресу в массиве норд
23-
GetNode(address ...int) (Node, error)
23+
GetNode(address ...int) Node
24+
GetNodeE(address ...int) (Node, error)
25+
26+
// Get получение значение ноды по адресу
27+
Get(address ...int) string
2428

2529
// String получение строкового значение ноды
2630
// Для нод без вложенных нод выводиться их значение
2731
// Для всех остальных выводиться строковое представление ноды
2832
String() string
2933

30-
// Int получение числового значение ноды
31-
Int() int
34+
// Int64 получение числового значение ноды
35+
Int64(address ...int) int64
3236
// Bool получение булевного значение ноды
33-
Bool() bool
37+
Bool(address ...int) bool
3438
// Int получение числового с запятой значение ноды
35-
Float64() float64
39+
Float64(address ...int) float64
40+
41+
value() bool
3642
}
3743

3844
var ErrNodeAddress = errors.New("address node is broken")
45+
var emptyNode = bracketsNode{}
46+
47+
func EmptyNode(n Node) bool {
48+
49+
bNode, ok := n.(bracketsNode)
50+
51+
if !ok {
52+
return false
53+
}
54+
55+
if len(bNode.Text) > 0 || len(bNode.Nodes) > 0 {
56+
return true
57+
}
58+
59+
return false
60+
}
3961

4062
// Nodes Массив Node с функцией String()
4163
type Nodes []Node
@@ -54,28 +76,57 @@ func (b Nodes) String() string {
5476
}
5577

5678
type bracketsNode struct {
57-
Text string
58-
79+
Text string
5980
Nodes Nodes
60-
//Count int
6181

6282
valueNode bool
6383
}
6484

65-
func (b bracketsNode) GetNode(address ...int) (Node, error) {
85+
func (b bracketsNode) value() bool {
86+
return b.valueNode
87+
}
88+
89+
func (b bracketsNode) Get(address ...int) string {
90+
91+
if len(address) == 0 && b.value() {
92+
return b.Text
93+
}
94+
95+
node, _ := b.getNode(address)
96+
if node.value() {
97+
return node.Text
98+
}
99+
100+
return ""
101+
102+
}
103+
104+
func (b bracketsNode) getNode(address []int) (bracketsNode, error) {
66105

67106
currentNode := b
68107

69108
for i, _ := range address {
70109

71110
if len(currentNode.Nodes) <= address[i] {
72-
return nil, ErrNodeAddress
111+
return emptyNode, ErrNodeAddress
73112
}
74113

75114
currentNode = currentNode.Nodes[address[i]].(bracketsNode)
76115
}
77116

78117
return currentNode, nil
118+
119+
}
120+
121+
func (b bracketsNode) GetNode(address ...int) Node {
122+
123+
node, _ := b.getNode(address)
124+
return node
125+
}
126+
127+
func (b bracketsNode) GetNodeE(address ...int) (Node, error) {
128+
129+
return b.getNode(address)
79130
}
80131

81132
func (b bracketsNode) String() string {
@@ -95,27 +146,55 @@ func (b bracketsNode) String() string {
95146
return fmt.Sprintf("{%s}", val)
96147
}
97148

98-
func (b bracketsNode) Int() int {
99-
i, _ := strconv.ParseInt(b.Text, 10, 64)
100-
return int(i)
149+
func (b bracketsNode) Int64(address ...int) int64 {
150+
151+
n, err := b.getNode(address)
152+
if err != nil ||
153+
!b.value() ||
154+
len(b.Text) == 0 {
155+
return 0
156+
}
157+
158+
i, _ := strconv.ParseInt(n.Text, 10, 64)
159+
return i
101160
}
102161

103-
func (b bracketsNode) Bool() bool {
162+
func (b bracketsNode) Bool(address ...int) bool {
104163

105-
val, _ := strconv.ParseBool(b.Text)
164+
n, err := b.getNode(address)
165+
if err != nil ||
166+
!b.value() ||
167+
len(b.Text) == 0 {
168+
return false
169+
}
170+
val, _ := strconv.ParseBool(n.Text)
106171
return val
107172
}
108173

109-
func (b bracketsNode) Float64() float64 {
174+
func (b bracketsNode) Float64(address ...int) float64 {
175+
176+
n, err := b.getNode(address)
177+
if err != nil ||
178+
!b.value() ||
179+
len(b.Text) == 0 {
180+
return 0
181+
}
110182

111-
f, _ := strconv.ParseFloat(b.Text, 64)
183+
f, _ := strconv.ParseFloat(n.Text, 64)
112184
return f
113185
}
114186

115187
func newValueNode(value string) bracketsNode {
116-
188+
addQuotesIfNeed(&value)
117189
return bracketsNode{
118190
Text: value,
119191
valueNode: true,
120192
}
121193
}
194+
195+
func addQuotesIfNeed(value *string) {
196+
197+
if strings.ContainsAny(*value, `'"`) {
198+
*value = `"` + *value + `"`
199+
}
200+
}

bracket_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func Test_bucketsNode_GetNode(t *testing.T) {
6565
Nodes: tt.fields.Nodes,
6666
valueNode: tt.fields.valueNode,
6767
}
68-
got, err := b.GetNode(tt.args.address...)
68+
got, err := b.GetNodeE(tt.args.address...)
6969
if (err != nil) != tt.wantErr {
7070
t.Errorf("GetNode() error = %v, wantErr %v", err, tt.wantErr)
7171
return

example_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,19 @@ func ExampleBracketsNode_GetNode() {
8282

8383
node := parser.NextNode()
8484

85-
node0, _ := node.GetNode(0)
85+
node0, _ := node.GetNodeE(0)
8686
fmt.Printf("node <%s>\n", node0.String()) // 20200412134348
8787

88-
node1, _ := node.GetNode(1)
89-
fmt.Printf("node <%s>\n", node1.String()) // N
88+
node1 := node.Get(1)
89+
fmt.Printf("node <%s>\n", node1) // N
9090

91-
node21, _ := node.GetNode(2, 1)
92-
fmt.Printf("node <%d>\n", node21.Int()) // {0,13} -> 13
91+
node21 := node.Int64(2, 1)
92+
fmt.Printf("node <%d>\n", node21) // {0,13} -> 13
9393

94-
node11, _ := node.GetNode(11)
94+
node11 := node.GetNode(11)
9595
fmt.Printf("node <%s>\n", node11) // {"U"}
9696

97-
_, err := node.GetNode(1, 2) // Отсутствующий адрес ноды
97+
_, err := node.GetNodeE(1, 2) // Отсутствующий адрес ноды
9898
fmt.Printf("err <%s>\n", err) // {0,13} -> 13
9999

100100
// Output:

parser_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ func TestBucketsParser_ReadAllNodes_file(t *testing.T) {
136136
"./20200412130000.lgp",
137137
5,
138138
},
139+
{
140+
"multiline log",
141+
"./tests/multiline.lgp",
142+
5,
143+
},
139144
}
140145
for _, tt := range tests {
141146
t.Run(tt.name, func(t *testing.T) {

tests/multiline.lgp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{20200930215529,N,
2+
{0,0},4,1,2,2,12,I,"Идентификатор шага: Новости. Все обновления новостей. Проверка версии платформы
3+
Проверка изменения версии платформы
4+
Строка подключения: File=""/Users/khorevaa/Documents/InfoBase2"";
5+
ТекущийРежимЗапуска: Управляемое приложение
6+
Это разделенная конфигурация: Да
7+
Разделение включено: Нет
8+
Доступно использование разделенных данных: Да
9+
Сеанс запущен без разделителей: Да
10+
Конфигурация (метаданные): УправлениеНебольшойФирмой, 1.6.21.124
11+
Конфигурация (переопределение): SmallBusiness, 01.06.021.0124
12+
Платформа: 08.03.015.1830
13+
Функциональная опция Разрешена работа с новостями: Да
14+
Функциональная опция Разрешена работа с новостями через интернет: Да
15+
Текущий пользователь ИБ:
16+
Имя: Администратор
17+
УИН: 1366c862-f385-11ea-3284-005056ae0f31
18+
Разделение данных:
19+
20+
Время начала (мс): 63 737 088 929 329
21+
Время окончания (мс): 63 737 088 929 361
22+
Длительность (мс): 32
23+
Результат по шагам:
24+
Шаг: Проверка изменения версии платформы
25+
Длительность (мс): 32
26+
Результат выполнения: (0), Сохраненная версия платформы: 8.3.15.1830
27+
Текущая версия платформы: 8.3.15.1830
28+
Редко меняющиеся отборы останутся как есть
29+
30+
Версия конфигурации в этой обработке не проверяется, а пересчитывается принудительно в модуле обновления конфигурации, а также после каждого получения новостей.
31+
Попытка зафиксировать транзакцию.
32+
ТекущаяДатаДляРегистров: 30.09.2020 18:55:29
33+
ДатаСледующегоОбновления: 01.10.2020 0:55:29
34+
35+
",0,
36+
{"N",32},"",0,0,0,4,0,
37+
{2,1,1,2,1}
38+
}

0 commit comments

Comments
 (0)