feat: init new populator

main
sudo pacman -Syu 2022-11-06 16:21:32 +07:00
commit 510d02d4f4
No known key found for this signature in database
GPG Key ID: D6CB5C6C567C47B0
7 changed files with 1303 additions and 0 deletions

18
.gitignore vendored Normal file
View File

@ -0,0 +1,18 @@
# macOS
.DS_Store
# Window
*.exe
# IntelliJ
.idea
# VSCode
.vscode
# Go
coverage.out
vendor
# GoReleaser
dist

65
.golangci.yml Normal file
View File

@ -0,0 +1,65 @@
run:
tests: false
skip-dirs:
- ".*test.*"
- ".*mock.*"
- ".*generated.*"
- ".*example.*"
skip-files:
- ".*Mock.*"
- ".*_mock.*"
- ".*_generated.*"
output:
sort-results: true
linters:
disable-all: true
enable:
- errcheck
- gosimple
- govet
- staticcheck
- typecheck
- unused
- errname
- errorlint
- execinquery
- goerr113
- gofumpt
- gosec
- importas
- makezero
- nilnil
- prealloc
- unconvert
fast: true
linters-settings:
gosec:
excludes:
- G402
- G501
- G505
exclude-generated: true
govet:
check-shadowing: false
disable-all: true
enable:
- assign
- atomic
- bools
- buildtag
- composites
- copylocks
- fieldalignment
- httpresponse
- loopclosure
- lostcancel
- nilfunc
- printf
- unmarshal
- unreachable
- unusedresult
staticcheck:
checks: ["all", "-SA1019"]

11
Makefile Normal file
View File

@ -0,0 +1,11 @@
.PHONY: all test-color lint
all: test-color lint
go mod tidy
test-color:
go install github.com/haunt98/go-test-color@latest
go-test-color -race -failfast ./...
lint:
golangci-lint run ./...

7
cmd/populatedb/main.go Normal file
View File

@ -0,0 +1,7 @@
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}

80
go.mod Normal file
View File

@ -0,0 +1,80 @@
module github.com/haunt98/populatedb-go
go 1.18
require (
github.com/go-sql-driver/mysql v1.6.0
github.com/k1LoW/tbls v1.56.6
)
require (
cloud.google.com/go v0.102.0 // indirect
cloud.google.com/go/bigquery v1.25.0 // indirect
cloud.google.com/go/compute v1.7.0 // indirect
cloud.google.com/go/iam v0.3.0 // indirect
cloud.google.com/go/spanner v1.28.0 // indirect
github.com/Azure/azure-pipeline-go v0.2.3 // indirect
github.com/Azure/azure-storage-blob-go v0.14.0 // indirect
github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect
github.com/aquasecurity/go-version v0.0.0-20210121072130-637058cfe492 // indirect
github.com/aws/aws-sdk-go v1.42.23 // indirect
github.com/aws/aws-sdk-go-v2 v1.11.2 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.0.0 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.6.4 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.7.4 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.2 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.0.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.5.0 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.5.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.9.2 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.21.0 // indirect
github.com/aws/smithy-go v1.9.0 // indirect
github.com/fatih/color v1.13.0 // indirect
github.com/form3tech-oss/jwt-go v3.2.5+incompatible // indirect
github.com/gabriel-vasile/mimetype v1.4.0 // indirect
github.com/gertd/go-pluralize v0.1.7 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/goccy/go-yaml v1.9.4 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.3 // indirect
github.com/google/flatbuffers v2.0.5+incompatible // indirect
github.com/google/go-cmp v0.5.8 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect
github.com/googleapis/gax-go/v2 v2.4.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/k1LoW/duration v1.1.0 // indirect
github.com/k1LoW/expand v0.1.0 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/lib/pq v1.10.4 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-ieproxy v0.0.1 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/minio/pkg v1.1.9 // indirect
github.com/pierrec/lz4/v4 v4.1.12 // indirect
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/snowflakedb/gosnowflake v1.6.5 // indirect
github.com/stretchr/testify v1.8.0 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/xo/dburl v0.9.0 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.mongodb.org/mongo-driver v1.8.4 // indirect
go.opencensus.io v0.23.0 // indirect
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect
golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 // indirect
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
golang.org/x/sys v0.0.0-20220624220833-87e55d714810 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
google.golang.org/api v0.86.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f // indirect
google.golang.org/grpc v1.47.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
)

1053
go.sum Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,69 @@
package populatedb
import (
"database/sql"
"errors"
"fmt"
"net/url"
"time"
"github.com/go-sql-driver/mysql"
tblsconfig "github.com/k1LoW/tbls/config"
tblsdatasource "github.com/k1LoW/tbls/datasource"
tblsschema "github.com/k1LoW/tbls/schema"
)
const (
dialectMySQL = "mysql"
)
var ErrDialectNotSupport = errors.New("dialect not support ")
type Populator interface{}
type populator struct {
db *sql.DB
tblsSchema *tblsschema.Schema
}
func NewPopulator(dbDialect, dbURL string) (Populator, error) {
if dbDialect != dialectMySQL {
return nil, fmt.Errorf("not support [%s]: %w", dbDialect, ErrDialectNotSupport)
}
// https://go.dev/doc/tutorial/database-access
mysqlCfg, err := mysql.ParseDSN(dbURL)
if err != nil {
return nil, fmt.Errorf("mysql: failed to parse dsn [%s]: %w", dbURL, err)
}
// https://github.com/go-sql-driver/mysql#timetime-support
mysqlCfg.ParseTime = true
mysqlCfg.AllowNativePasswords = true
mysqlCfg.Loc = time.UTC
mysqlURL := mysqlCfg.FormatDSN()
db, err := sql.Open(dbDialect, mysqlURL)
if err != nil {
return nil, fmt.Errorf("sql: failed to open [%s]: %w", mysqlURL, err)
}
if err := db.Ping(); err != nil {
return nil, fmt.Errorf("database: failed to ping [%s] : %w", mysqlURL, err)
}
// https://github.com/k1LoW/tbls
// https://stackoverflow.com/q/48671938
tblsURL := "mysql://" + mysqlCfg.User + ":" + url.QueryEscape(mysqlCfg.Passwd) + "@" + mysqlCfg.Addr + "/" + mysqlCfg.DBName
tblsSchema, err := tblsdatasource.Analyze(tblsconfig.DSN{
URL: tblsURL,
})
if err != nil {
return nil, fmt.Errorf("tbls: faield to analyze [%s]: %w", tblsURL, err)
}
return &populator{
db: db,
tblsSchema: tblsSchema,
}, nil
}