спеціалізована СУБД для зберігання та обробки показань датчиків та лічильників
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

135 lines
2.4 KiB

package main
import (
"flag"
"fmt"
"log"
"os"
"os/signal"
"sync"
"syscall"
"gopkg.in/ini.v1"
"gordenko.dev/dima/diploma/database"
)
func main() {
var (
logfile = os.Stdout
iniFileName string
)
flag.Usage = func() {
fmt.Fprint(flag.CommandLine.Output(), helpMessage)
fmt.Fprint(flag.CommandLine.Output(), configExample)
fmt.Fprintf(flag.CommandLine.Output(), mainUsage, os.Args[0])
flag.PrintDefaults()
}
flag.StringVar(&iniFileName, "c", "database.ini", "path to *.ini config file")
flag.Parse()
config, err := loadConfig(iniFileName)
if err != nil {
log.Fatalln(err)
}
var (
exitCh = make(chan struct{})
wg = new(sync.WaitGroup)
)
db, err := database.New(database.Options{
TCPPort: config.TcpPort,
Dir: config.Dir,
DatabaseName: config.DatabaseName,
RedoDir: config.REDODir,
Logfile: logfile,
ExitCh: exitCh,
WaitGroup: wg,
})
if err != nil {
log.Fatalf("database.New: %s\n", err)
}
go func() {
err = db.ListenAndServe()
if err != nil {
log.Fatalln(err)
}
}()
wg.Add(1)
fmt.Fprintf(logfile, "database %q started on port %d.\n",
config.DatabaseName, config.TcpPort)
fmt.Fprintln(logfile, config)
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
<-sigs
close(exitCh)
wg.Wait()
fmt.Fprintln(logfile, "database stopped.")
}
// config file
const mainUsage = `Usage:
%s -c path/to/config.ini
`
const helpMessage = `Diploma project. Database. Version: 1.0
created by Dmytro Gordenko, 1.e4.kc6@gmail.com
`
const configExample = `
database.ini example:
tcpPort = 12345
dir = ../../datadir
redoDir = ../../datadir
databaseName = test
`
type Config struct {
TcpPort int
Dir string
REDODir string
DatabaseName string
}
func (s Config) String() string {
return fmt.Sprintf(`starting options:
tcpPort = %d
dir = %s
redoDir = %s
databaseName = %s
`,
s.TcpPort, s.Dir, s.REDODir, s.DatabaseName)
}
func loadConfig(iniFileName string) (_ Config, err error) {
file, err := ini.Load(iniFileName)
if err != nil {
return
}
conf := Config{}
top := file.Section("")
conf.TcpPort, err = top.Key("tcpPort").Int()
if err != nil {
err = fmt.Errorf("'tcpPort' option is required in config file")
return
}
conf.Dir = top.Key("dir").String()
conf.REDODir = top.Key("redoDir").String()
conf.DatabaseName = top.Key("databaseName").String()
return conf, nil
}