libf 5 kuukautta sitten
vanhempi
commit
3a6cd020dc
6 muutettua tiedostoa jossa 192 lisäystä ja 44 poistoa
  1. 0 35
      cfg/cfg.go
  2. 3 3
      cgf/cgf.go
  3. 13 0
      go.mod
  4. 34 2
      go.sum
  5. 4 4
      main.go
  6. 138 0
      odbc/odbclient.go

+ 0 - 35
cfg/cfg.go

@@ -1,35 +0,0 @@
-package cfg
-
-import (
-	"fmt"
-	"path/filepath"
-
-	ucfg "git.wecise.com/wecise/util/cfg"
-	ulog "git.wecise.com/wecise/util/logger"
-)
-
-var Config = ucfg.MConfig(&ucfg.CfgOption{
-	Name: "m:default",
-	Type: ucfg.INI_TEXT,
-	Values: []string{`
-[log]
-level=debug
-dir=` + filepath.Join("/", "opt", "matrix", "var", "logs") + `
-file=` + "cgimport.log" + `
-console=true
-color=true
-consolelevel=info
-format=yyyy-MM-dd HH:mm:ss.SSSSSS [pid] [level] module/file:line msg
-eol=\n
-size=10MB
-count=100
-scroll=1d
-expire=14d
-`}},
-	ucfg.GetIniFileCfgOption(filepath.Join(fmt.Sprint("cgimport", ".conf"))),
-	ucfg.GetIniFileCfgOption(filepath.Join(fmt.Sprint(ucfg.DefaultAppName, ".conf"))),
-	ucfg.CFGOPTION_ENVS,
-	ucfg.CFGOPTION_ARGS)
-
-var Logger = ulog.New().WithConfig(Config, "log")
-var LogFile = Logger.FileOutPath()

+ 3 - 3
cgf/cgf.go

@@ -9,15 +9,15 @@ import (
 	"sync"
 	"sync/atomic"
 
-	"git.wecise.com/wecise/cgimport/cfg"
 	"git.wecise.com/wecise/cgimport/cgf/reader"
+	"git.wecise.com/wecise/cgimport/odbc"
 	"git.wecise.com/wecise/util/filewalker"
 	"git.wecise.com/wecise/util/merrs"
 	"git.wecise.com/wecise/util/rc"
 )
 
-var mcfg = cfg.Config
-var logger = cfg.Logger
+var mcfg = odbc.Config
+var logger = odbc.Logger
 
 func ImportDir(datapath string, parallel int) (filescount, recordscount int64, err error) {
 	// 遍历文件目录

+ 13 - 0
go.mod

@@ -3,19 +3,32 @@ module git.wecise.com/wecise/cgimport
 go 1.20
 
 require (
+	git.wecise.com/wecise/odb-go v0.0.0-20250123142240-7c4d1df627b4
 	git.wecise.com/wecise/util v0.0.0-20250204084114-10f3a56ec32b
+	github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e
 	github.com/spf13/cast v1.7.0
 )
 
 require (
+	github.com/bluele/gcache v0.0.2 // indirect
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/coreos/go-semver v0.3.0 // indirect
 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
+	github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/fatih/color v1.18.0 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/gomodule/redigo v1.8.5 // indirect
+	github.com/google/uuid v1.3.1 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/redis/go-redis/v9 v9.0.5 // indirect
 	github.com/spacemonkeygo/errors v0.0.0-20201030155909-2f5f890dbc62 // indirect
+	github.com/tidwall/uhatools v0.4.1 // indirect
+	github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
+	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
 	go.etcd.io/etcd/api/v3 v3.5.8 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.8 // indirect
 	go.etcd.io/etcd/client/v3 v3.5.8 // indirect

+ 34 - 2
go.sum

@@ -1,5 +1,13 @@
+git.wecise.com/wecise/odb-go v0.0.0-20250123142240-7c4d1df627b4 h1:VUr6whmUPURppVSqLeDnHa5yk2n05FjrsonJTzd6Pt0=
+git.wecise.com/wecise/odb-go v0.0.0-20250123142240-7c4d1df627b4/go.mod h1:ZgFysxr5kKxDUrFcwCWJs5ntFsQtK0Q77o6ZU4bYQnM=
 git.wecise.com/wecise/util v0.0.0-20250204084114-10f3a56ec32b h1:GQ5IfKNb+XBziRCd0PmkBlteXf1upyp4sNhpAZS3UZE=
 git.wecise.com/wecise/util v0.0.0-20250204084114-10f3a56ec32b/go.mod h1:2YXWE9m5mNgAu40zpYrL3woGz6S8CoHAW/CJeWXaIko=
+github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
+github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
+github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=
+github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
@@ -7,15 +15,26 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
 github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
 github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/fatih/set v0.2.1 h1:nn2CaJyknWE/6txyUDGwysr3G5QC6xWB/PtVjPBbeaA=
+github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
+github.com/gomodule/redigo v1.8.5 h1:nRAxCa+SVsyjSBrtZmG/cqb6VbTmuRzpg/PoTFlpumc=
+github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
+github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -25,19 +44,31 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=
+github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e h1:7q6NSFZDeGfvvtIRwBrU/aegEYJYmvev0cHAwo17zZQ=
+github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e/go.mod h1:DkpGd78rljTxKAnTDPFqXSGxvETQnJyuSOQwsHycqfs=
 github.com/spacemonkeygo/errors v0.0.0-20201030155909-2f5f890dbc62 h1:X5+jSi+pL+sc2/Sp9mtrmRqDDnKkm9YVy1ik/jJDRD0=
 github.com/spacemonkeygo/errors v0.0.0-20201030155909-2f5f890dbc62/go.mod h1:7NL9UAYQnRM5iKHUCld3tf02fKb5Dft+41+VckASUy0=
 github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
 github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/tidwall/uhatools v0.4.1 h1:RS7RO0z7+uqGYWqRnagCyGbAQnFqRQzrOftMEiZYgo4=
+github.com/tidwall/uhatools v0.4.1/go.mod h1:A0rmLPzOam2WhWA02UFtC3WRWcQJygCH/TwXR11Jd3w=
+github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
+github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
+github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
+github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 go.etcd.io/etcd/api/v3 v3.5.8 h1:Zf44zJszoU7zRV0X/nStPenegNXoFDWcB/MwrJbA+L4=
@@ -95,10 +126,11 @@ google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
 google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
 google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 4 - 4
main.go

@@ -4,8 +4,8 @@ import (
 	"fmt"
 	"time"
 
-	"git.wecise.com/wecise/cgimport/cfg"
 	"git.wecise.com/wecise/cgimport/cgf"
+	"git.wecise.com/wecise/cgimport/odbc"
 )
 
 // 获取配置信息
@@ -14,8 +14,8 @@ import (
 //		当前工作目录下 与应用同名的 .conf 文件
 //		环境变量
 //		命令行参数
-var mcfg = cfg.Config
-var logger = cfg.Logger
+var mcfg = odbc.Config
+var logger = odbc.Logger
 
 func main() {
 	// 开始计时
@@ -36,5 +36,5 @@ func main() {
 	}
 	// 输出统计信息
 	fmt.Println("total import", filescount, "files", recordscount, "records", "in", time.Since(st))
-	fmt.Println("access", cfg.LogFile, "for detail information")
+	fmt.Println("access", odbc.LogFile, "for detail information")
 }

+ 138 - 0
odbc/odbclient.go

@@ -0,0 +1,138 @@
+package odbc
+
+import (
+	"fmt"
+	"path/filepath"
+	"strings"
+
+	odb "git.wecise.com/wecise/odb-go/odb"
+	ucfg "git.wecise.com/wecise/util/cfg"
+	ulog "git.wecise.com/wecise/util/logger"
+	"github.com/scylladb/go-set/strset"
+)
+
+var DefaultAppName = "cgimport"
+var Config = ucfg.MConfig(&ucfg.CfgOption{
+	Name: "m:default",
+	Type: ucfg.INI_TEXT,
+	Values: []string{`
+[log]
+level=debug
+dir=` + filepath.Join("/", "opt", "matrix", "var", "logs") + `
+file=` + DefaultAppName + ".log" + `
+console=true
+color=true
+consolelevel=info
+format=yyyy-MM-dd HH:mm:ss.SSSSSS [pid] [level] module/file:line msg
+eol=\n
+size=10MB
+count=100
+scroll=1d
+expire=14d
+`}},
+	ucfg.GetIniFileCfgOption(filepath.Join(fmt.Sprint(DefaultAppName, ".conf"))),
+	ucfg.CFGOPTION_ENVS,
+	ucfg.CFGOPTION_ARGS)
+
+var Logger = ulog.New().WithConfig(Config, "log")
+var LogFile = Logger.FileOutPath()
+
+var ODBClient odb.Client
+var ODBError error
+var Debug bool
+var Usage string
+
+var default_keyspace = `oktest`
+var default_odbpaths = `127.0.0.1:11001`
+
+var default_config = &odb.Config{
+	Hosts:    []string{"127.0.0.1:11001"},
+	Keyspace: "oktest",
+	User:     fmt.Sprint("测试客户端"),
+	Pass:     "********",
+	PoolSize: 20,
+	Debug:    false,
+}
+
+func config_merge(a *odb.Config, b *odb.Config) *odb.Config {
+	if len(b.Hosts) > 0 {
+		a.Hosts = b.Hosts
+	}
+	if b.Port != 0 {
+		a.Port = b.Port
+	}
+	if b.Keyspace != "" {
+		a.Keyspace = b.Keyspace
+	}
+	if b.User != "" {
+		a.User = b.User
+	}
+	if b.Pass != "" {
+		a.Pass = b.Pass
+	}
+	if b.PoolSize != 0 {
+		a.PoolSize = b.PoolSize
+	}
+	if b.Debug {
+		a.Debug = b.Debug
+	}
+	return a
+}
+
+// 参数设置为程序默认配置
+// 可以通过命令行,环境变量 或 与应用同名的.conf配置文件 设置
+// 远程连接需要在白名单中增加本地IP
+func ODBC(odbcfgs ...*odb.Config) odb.Client {
+	odbcfg := config_merge(&odb.Config{}, default_config)
+	for _, c := range odbcfgs {
+		odbcfg = config_merge(odbcfg, c)
+	}
+	default_keyspace = odbcfg.Keyspace
+	default_odbpaths = strings.Join(odbcfg.Hosts, ",")
+	Usage = `
+命令行参数:
+odbpath=` + default_odbpaths + ` #指定odbserver路径,默认通过环境变量ODBPATH或通过ETCD相关配置获取
+keyspace=` + default_keyspace + ` #指定keyspace,默认通过环境变量KEYSPACE获取
+debug=true #开启调试模式,输出更多信息
+	
+环境变量需求:
+ODBPATH=` + default_odbpaths + ` #指定odbserver路径,默认通过配置信息 odbc.odbpath 获取
+KEYSPACE=` + default_keyspace + ` #指定keyspace,默认通过配置信息 odbc.keyspace 获取
+ETCDPATH=127.0.0.1:2379 #必须设置
+ETCDUSER=
+ETCDPASS=
+CASSANDRAPATH=127.0.0.1
+CASSANDRALOOKUP=false
+NATSPATH=nats://user:N5JbKeT1C3uOUh317OVXjg==@127.0.0.1:4222
+
+LANG=zh_CN.utf8
+LC_ALL=zh_CN.utf8
+
+可通过` + DefaultAppName + `.conf配置运行参数:
+[odbc]
+;指定odbserver路径
+odbpath=` + default_odbpaths + `
+;指定keyspace
+keyspace=` + default_keyspace + `
+`
+	Logger.SetFormat("yyyy-MM-dd HH:mm:ss.SSSSSS [pid] [level] msg", "\n")
+	odbpaths := strset.New(strings.Split(ucfg.CommandArgs.GetString("odbpath",
+		strings.Join(ucfg.Environs.GetStrings("ODBPATH",
+			Config.GetStrings("odbc.odbpath", default_odbpaths)...), ",")), ",")...).List()
+	keyspace := ucfg.CommandArgs.GetString("keyspace",
+		ucfg.Environs.GetString("KEYSPACE", Config.GetString("odbc.keyspace", default_keyspace)))
+	Debug = ucfg.CommandArgs.GetBool("debug", false)
+	ODBClient, ODBError = odb.NewClient(config_merge(odbcfg, &odb.Config{
+		Keyspace: keyspace,
+		Hosts:    odbpaths,
+		Debug:    Debug,
+	}))
+	if ODBError != nil {
+		fmt.Print(Usage)
+		panic(ODBError)
+	}
+	Logger.Info("odbpath :", ODBClient.Config().Hosts, ODBClient.Config().Port)
+	Logger.Info("keyspace:", ODBClient.Config().Keyspace)
+	Logger.Info("debug:   ", Debug)
+	return ODBClient
+}