Skip to content

Commit f7c1aba

Browse files
committed
Finish v0.1.0
2 parents db00ceb + dec19a6 commit f7c1aba

File tree

17 files changed

+535
-469
lines changed

17 files changed

+535
-469
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
/0/
2+
/.idea/misc.xml
3+
4+
.idea

agent.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package v8
2+
3+
import (
4+
"github.com/v8platform/designer"
5+
)
6+
7+
func AgentMode(visible bool) designer.AgentModeOptions {
8+
9+
command := designer.AgentModeOptions{
10+
SSHHostKeyAuto: true,
11+
Visible: visible,
12+
}
13+
14+
return command
15+
16+
}

api.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"github.com/v8platform/errors"
66
"github.com/v8platform/runner"
7+
"strings"
78
)
89

910
func Run(where runner.Infobase, what runner.Command, opts ...interface{}) error {
@@ -18,17 +19,19 @@ func Background(ctx context.Context, where runner.Infobase, what runner.Command,
1819

1920
}
2021

21-
func CreateInfobase(create CreateInfobaseCommand, opts ...interface{}) (interface{}, error) {
22+
func CreateInfobase(create runner.Command, opts ...interface{}) (*Infobase, error) {
2223

2324
if create.Command() != runner.CreateInfobase {
2425
return nil, errors.Check.New("command must be <CreateInfobase>")
2526
}
2627

27-
err := Run(InfoBase{}, create, opts...)
28+
err := Run(nil, create, opts...)
2829

2930
if err != nil {
3031
return nil, err
3132
}
3233

33-
return create.Infobase(), nil
34+
connectionStringValues := create.Values()
35+
connectionString := strings.Join(connectionStringValues, ";")
36+
return ParseConnectionString(connectionString)
3437
}

api_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package v8
2+
3+
import (
4+
"github.com/v8platform/designer"
5+
"github.com/v8platform/runner"
6+
"reflect"
7+
"testing"
8+
)
9+
10+
func TestCreateInfobase(t *testing.T) {
11+
12+
if testing.Short() {
13+
t.Skip("skipped for integrated tests")
14+
}
15+
16+
type args struct {
17+
create runner.Command
18+
opts []interface{}
19+
}
20+
temp := t.TempDir()
21+
22+
tests := []struct {
23+
name string
24+
args args
25+
want *Infobase
26+
wantErr bool
27+
}{
28+
{
29+
"simple",
30+
args{
31+
create: designer.CreateFileInfoBaseOptions{
32+
File: temp,
33+
},
34+
},
35+
&Infobase{
36+
Connect: FilePath{
37+
File: temp,
38+
},
39+
},
40+
false,
41+
},
42+
}
43+
44+
for _, tt := range tests {
45+
t.Run(tt.name, func(t *testing.T) {
46+
got, err := CreateInfobase(tt.args.create, tt.args.opts...)
47+
if (err != nil) != tt.wantErr {
48+
t.Errorf("CreateInfobase() error = %v, wantErr %v", err, tt.wantErr)
49+
return
50+
}
51+
if !reflect.DeepEqual(got, tt.want) {
52+
t.Errorf("CreateInfobase() got = %v, want %v", got, tt.want)
53+
}
54+
})
55+
}
56+
}

base.go

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
package v8
2+
3+
import (
4+
"fmt"
5+
"github.com/v8platform/errors"
6+
"github.com/v8platform/marshaler"
7+
"strings"
8+
)
9+
10+
var _ ConnectPath = (*FilePath)(nil)
11+
var _ ConnectPath = (*ServerPath)(nil)
12+
13+
type ConnectPath interface {
14+
String() string
15+
}
16+
17+
type FilePath struct {
18+
19+
// имя каталога, в котором размещается файл информационной базы;
20+
File string `v8:"File, equal_sep, quotes" json:"file"`
21+
}
22+
23+
func (f FilePath) String() string {
24+
v, _ := marshaler.Marshal(f)
25+
connString := strings.Join(v, ";")
26+
return connString + ";"
27+
}
28+
29+
type WsPath struct {
30+
31+
// имя каталога, в котором размещается файл информационной базы;
32+
Ws string `v8:"Ws, equal_sep" json:"ws"`
33+
}
34+
35+
func (f WsPath) String() string {
36+
v, _ := marshaler.Marshal(f)
37+
connString := strings.Join(v, ";")
38+
return connString + ";"
39+
}
40+
41+
type ServerPath struct {
42+
//имя сервера «1С:Предприятия» в формате: [<протокол>://]<адрес>[:<порт>], где:
43+
//<протокол> – не обязателен, поддерживается только протокол TCP,
44+
//<адрес> – имя сервера или IP-адрес сервера в форматах IPv4 или IPv6,
45+
//<порт> – не обязателен, порт главного менеджера кластера, по умолчанию равен 1541.
46+
Server string `v8:"Srvr, equal_sep" json:"srvr"`
47+
48+
//имя информационной базы на сервере "1С:Предприятия";
49+
Ref string `v8:"Ref, equal_sep, quotes" json:"ref"`
50+
}
51+
52+
func (s ServerPath) String() string {
53+
v, _ := marshaler.Marshal(s)
54+
connString := strings.Join(v, ";")
55+
return connString + ";"
56+
}
57+
58+
var _ ConnectionString = (*Infobase)(nil)
59+
60+
type Infobase struct {
61+
Connect ConnectPath `v8:",inherit" json:"path"`
62+
63+
// имя пользователя;
64+
User string `v8:"Usr, equal_sep, optional" json:"user"`
65+
66+
// пароль;
67+
Password string `v8:"Pwd, equal_sep, optional" json:"password"`
68+
69+
// разрешить получение клиентских лицензий через сервер "1С:Предприятия" ("Y"|"N").
70+
// "Y" — получать клиентскую лицензию через сервер "1С:Предприятия".
71+
// Если клиентское приложение не получило программную лицензию
72+
// или аппаратную лицензию из локального ключа HASP или из сетевого ключа HASP,
73+
// то производится попытка получения клиентской лицензии через сервер 1С:Предприятия.
74+
// "N" — не получать клиентскую лицензию через сервер "1С:Предприятия".
75+
//
76+
// Значение по умолчанию — "N". / false
77+
AllowServerLicenses bool `v8:"LicDstr, equal_sep, optional, bool_true=Y" json:"lic_dstr"`
78+
79+
// установка разделителей.
80+
//
81+
// ZN=<Общий реквизит 1>,<Общий реквизит 2>,...,<Общий реквизит N>
82+
//
83+
// <Общий реквизит> = [<+>|<->]<значение общего реквизита>
84+
//
85+
// [<+>|<->] - признак использования: "+" (по умолчанию) - реквизит используется; "-" - не используется;
86+
// Если разделитель не используется, то перед значением должен быть "-".
87+
// Если первым символом в значении разделителя содержится символ "+" или "-", то при указании его нужно удваивать.
88+
// <значение общего реквизита> - значение общего реквизита. Если в значении разделителя присутствует запятая,
89+
// то при указании ее нужно удваивать.
90+
// Если значение разделителя пропущено, но разделитель должен использоваться, то используется символ "+".
91+
// Разделители разделяются запятой.
92+
// Например:
93+
// "Zn=-ПервыйРазделитель,+,---ТретийРазделитель", что означает:
94+
// Первый разделитель выключен, значение – "ПервыйРазделитель",
95+
// Второй разделитель включен, значение – пустая строка,
96+
// Третий разделитель выключен, значение – "-ТретийРазделитель".
97+
SeparatorList DatabaseSeparatorList `v8:"ZN, equal_sep, optional" json:"zn"`
98+
99+
// запуск в режиме привилегированного сеанса.
100+
// Разрешен аутентифицированному пользователю, имеющему административные права.
101+
// Журнал регистрации фиксирует установку или отказ в возможности установки режима привилегированного сеанса.
102+
// prmod=1 - привилегированный сеанс устанавливается.
103+
UsePrivilegedMode bool `v8:"Prmod, equal_sep, optional, bool_true=1" json:"prmod"`
104+
105+
// язык (страна), который будет использован при открытии или создании информационной базы.
106+
// Допустимые значения такие же как у параметра <Форматная строка> метода Формат().
107+
// Параметр Locale задавать не обязательно.
108+
// Если не задан, то будут использованы региональные установки текущей информационной базы;
109+
Locale string `v8:"Locale, optional, equal_sep" json:"locale"`
110+
}
111+
112+
func (ib Infobase) ConnectionString() string {
113+
114+
v, _ := marshaler.Marshal(ib)
115+
connString := strings.Join(v, ";")
116+
return fmt.Sprintf("/IBConnectionString %s%s", ib.Connect.String(), connString)
117+
}
118+
119+
func NewFileInfobase(file string) *Infobase {
120+
121+
ib := &Infobase{
122+
Connect: FilePath{
123+
File: file,
124+
},
125+
}
126+
127+
ib.Connect.String()
128+
129+
return ib
130+
131+
}
132+
133+
func ParseConnectionString(connectingString string) (ib *Infobase, err error) {
134+
135+
switch {
136+
137+
case strings.HasPrefix(connectingString, "/S"):
138+
panic("implement me")
139+
return nil, err
140+
case strings.HasPrefix(connectingString, "/F"):
141+
panic("implement me")
142+
return nil, err
143+
case strings.HasPrefix(connectingString, "/IBConnectionString "):
144+
connectingString = strings.TrimPrefix(connectingString, "/IBConnectionString ")
145+
return parseIBConnectionString(connectingString)
146+
default:
147+
return parseIBConnectionString(connectingString)
148+
}
149+
150+
}
151+
152+
func parseIBConnectionString(connectingString string) (ib *Infobase, err error) {
153+
154+
ib = &Infobase{}
155+
156+
valuesMap, err := ConnectionStringtoMap(connectingString)
157+
if err != nil {
158+
return nil, err
159+
}
160+
161+
switch {
162+
case len(valuesMap["srvr"]) > 0:
163+
server := valuesMap["srvr"]
164+
ref := valuesMap["ref"]
165+
166+
if len(ref) == 0 {
167+
return nil, errors.BadConnectString.New("wrong infobase ref on server connection string")
168+
}
169+
170+
ib.Connect = ServerPath{
171+
Server: server,
172+
Ref: ref,
173+
}
174+
175+
case len(valuesMap["file"]) > 0:
176+
177+
ib.Connect = FilePath{
178+
File: valuesMap["file"],
179+
}
180+
181+
default:
182+
return nil, errors.BadConnectString.New("wrong server connection string")
183+
}
184+
185+
for key, val := range valuesMap {
186+
switch key {
187+
188+
case "usr":
189+
ib.User = val
190+
case "pwd":
191+
ib.Password = val
192+
case "locale":
193+
ib.Locale = val
194+
case "licdstr":
195+
ib.AllowServerLicenses = val == "Y"
196+
case "prmod":
197+
ib.UsePrivilegedMode = val == "1"
198+
case "zn":
199+
var err error
200+
ib.SeparatorList, err = ParseDatabaseSeparatorList(val)
201+
if err != nil {
202+
return nil, err
203+
}
204+
}
205+
}
206+
207+
return
208+
}
209+
210+
func ConnectionStringtoMap(connectingString string) (map[string]string, error) {
211+
valuesMap := make(map[string]string)
212+
213+
values := strings.Split(connectingString, ";")
214+
215+
for _, value := range values {
216+
217+
if len(value) == 0 ||
218+
strings.HasPrefix(value, "/") ||
219+
strings.HasPrefix(value, "-") {
220+
continue
221+
}
222+
223+
keyValue := strings.SplitN(value, "=", 2)
224+
225+
if len(keyValue) != 2 {
226+
return nil, errors.BadConnectString.New("wrong key/value count")
227+
}
228+
229+
valuesMap[strings.ToLower(keyValue[0])] = strings.Trim(keyValue[1], "'")
230+
}
231+
return valuesMap, nil
232+
}

0 commit comments

Comments
 (0)