omq/config.go
2024-03-05 21:46:13 +05:00

114 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"bytes"
"errors"
"fmt"
"net"
"strconv"
"strings"
"github.com/BurntSushi/toml"
go_ora "github.com/sijms/go-ora/v2"
)
type Config struct {
// Список серверов
Servers []*Server
// Кол-во prefetch строк
PrefetchRows int
// Таймаут ожидания ответа на запрос
Timeout int
}
type Server struct {
// Имя сервера
Name string
// Логин БД Oracle
Login string
// Пароль БД Oracle
Password string
// Список хостов БД Oracle
Hosts []string
// Наименование сервиса БД Oracle
Service string
// Статус работы с сервером
status string
// Ошибка работы с сервером
err error
config *Config
}
func loadConfig(filePath string) (*Config, error) {
b, err := readFileIgnoreBOM(filePath)
if err != nil {
return nil, err
}
config := new(Config)
_, err = toml.NewDecoder(bytes.NewReader(b)).Decode(&config)
if err != nil {
return nil, err
}
if config.PrefetchRows <= 0 {
config.PrefetchRows = 1000
}
if config.Timeout < 0 {
config.Timeout = 0
}
for i := range config.Servers {
config.Servers[i].config = config
}
return config, nil
}
func (s *Server) Url() (string, error) {
urlOptions := make(map[string]string)
if len(s.Hosts) == 0 {
return "", errors.New("hostname is not specified")
}
host, portStr, err := net.SplitHostPort(s.Hosts[0])
if err != nil {
host = s.Hosts[0]
portStr = "1521"
}
port, err := strconv.Atoi(portStr)
if err != nil {
return "", err
}
additionalHosts := make([]string, 0)
if len(s.Hosts) > 1 {
for _, v := range s.Hosts[1:] {
h, p, err := net.SplitHostPort(v)
if err != nil {
h = v
p = "1521"
}
additionalHosts = append(additionalHosts, fmt.Sprintf("%s:%s", h, p))
}
urlOptions["server"] = strings.Join(additionalHosts, ",") // TODO: должен добавляться порт
}
urlOptions["TIMEOUT"] = strconv.Itoa(s.config.Timeout)
urlOptions["PREFETCH_ROWS"] = strconv.Itoa(s.config.PrefetchRows)
return go_ora.BuildUrl(host, port, s.Service, s.Login, s.Password, urlOptions), nil
}