Skip to content

Commit 667a488

Browse files
author
Noboru Saito
authored
Merge pull request #4 from noborus/guessmode
Guessmode
2 parents 57fe342 + 794874b commit 667a488

9 files changed

+114
-79
lines changed

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Options:
3030
database connection option.
3131
-id string
3232
Field delimiter for input. (default ",")
33+
-ig
34+
Guess format from extension.
3335
-ih
3436
The first line is interpreted as column names.
3537
-iltsv
@@ -43,7 +45,7 @@ Options:
4345
-oh
4446
Output column name as header.
4547
-ojson
46-
Json format for output.
48+
JSON format for output.
4749
-oltsv
4850
LTSV format for output.
4951
-omd

csv.go

+19-21
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,27 @@ func csvheader(reader *csv.Reader) ([]string, error) {
3535
return header, err
3636
}
3737

38-
func (trdsql TRDSQL) csvReader(db *DDB, sqlstr string, tablenames []string) (string, int) {
38+
func (trdsql TRDSQL) csvReader(db *DDB, sqlstr string, tablename string) (string, int) {
3939
var header []string
40-
for _, tablename := range tablenames {
41-
reader, err := csvOpen(tablename, trdsql.inSep, trdsql.iskip)
42-
if err != nil {
43-
// no file
44-
continue
45-
}
46-
rtable := db.escapetable(tablename)
47-
sqlstr = rewrite(sqlstr, tablename, rtable)
48-
header, err = csvheader(reader)
49-
if err != nil {
50-
log.Println(err)
51-
return sqlstr, 1
52-
}
53-
db.Create(rtable, header, trdsql.ihead)
54-
err = db.ImportPrepare(rtable, header, trdsql.ihead)
55-
if err != nil {
56-
log.Println(err)
57-
return sqlstr, 1
58-
}
59-
db.csvImport(reader, header, trdsql.ihead)
40+
reader, err := csvOpen(tablename, trdsql.inSep, trdsql.iskip)
41+
if err != nil {
42+
// no file
43+
return sqlstr, 0
44+
}
45+
rtable := db.escapetable(tablename)
46+
sqlstr = db.rewrite(sqlstr, tablename, rtable)
47+
header, err = csvheader(reader)
48+
if err != nil {
49+
log.Println(err)
50+
return sqlstr, 1
51+
}
52+
db.Create(rtable, header, trdsql.ihead)
53+
err = db.ImportPrepare(rtable, header, trdsql.ihead)
54+
if err != nil {
55+
log.Println(err)
56+
return sqlstr, 1
6057
}
58+
db.csvImport(reader, header, trdsql.ihead)
6159
return sqlstr, 0
6260
}
6361

database.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ import (
1818

1919
// DDB is *sql.DB wrapper.
2020
type DDB struct {
21-
driver string
22-
dsn string
23-
escape string
21+
driver string
22+
dsn string
23+
escape string
24+
rewritten []string
2425
*sql.DB
2526
stmt *sql.Stmt
2627
}
@@ -170,8 +171,15 @@ func (db *DDB) escapetable(oldname string) string {
170171
return newname
171172
}
172173

173-
func rewrite(sqlstr string, oldname string, newname string) (rewrite string) {
174+
func (db *DDB) rewrite(sqlstr string, oldname string, newname string) (rewrite string) {
175+
for _, rewritten := range db.rewritten {
176+
if rewritten == newname {
177+
// Rewritten
178+
return sqlstr
179+
}
180+
}
174181
rewrite = strings.Replace(sqlstr, oldname, newname, -1)
182+
db.rewritten = append(db.rewritten, newname)
175183
return rewrite
176184
}
177185

ltsv.go

+20-22
Original file line numberDiff line numberDiff line change
@@ -28,29 +28,27 @@ func ltsvOpen(filename string, delimiter string, skip int) (*ltsv.Reader, error)
2828
return reader, nil
2929
}
3030

31-
func (trdsql TRDSQL) ltsvReader(db *DDB, sqlstr string, tablenames []string) (string, int) {
32-
for _, tablename := range tablenames {
33-
reader, err := ltsvOpen(tablename, trdsql.inSep, trdsql.iskip)
34-
if err != nil {
35-
// no file
36-
continue
37-
}
38-
rtable := db.escapetable(tablename)
39-
sqlstr = rewrite(sqlstr, tablename, rtable)
40-
first, err := reader.Read()
41-
if err != nil {
42-
return sqlstr, 1
43-
}
44-
header := keys(first)
45-
db.Create(rtable, header, true)
46-
err = db.ImportPrepare(rtable, header, true)
47-
if err != nil {
48-
log.Println(err)
49-
return sqlstr, 1
50-
}
51-
52-
db.ltsvImport(reader, first, header)
31+
func (trdsql TRDSQL) ltsvReader(db *DDB, sqlstr string, tablename string) (string, int) {
32+
reader, err := ltsvOpen(tablename, "\t", trdsql.iskip)
33+
if err != nil {
34+
// no file
35+
return sqlstr, 0
36+
}
37+
rtable := db.escapetable(tablename)
38+
sqlstr = db.rewrite(sqlstr, tablename, rtable)
39+
first, err := reader.Read()
40+
if err != nil {
41+
return sqlstr, 1
5342
}
43+
header := keys(first)
44+
db.Create(rtable, header, true)
45+
err = db.ImportPrepare(rtable, header, true)
46+
if err != nil {
47+
log.Println(err)
48+
return sqlstr, 1
49+
}
50+
51+
db.ltsvImport(reader, first, header)
5452
return sqlstr, 0
5553
}
5654

ltsv_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"fmt"
54
"strings"
65
"testing"
76

@@ -31,7 +30,6 @@ ID:2 name:testb
3130
reader := ltsv.NewReader(s)
3231
r, _ := reader.Read()
3332
if r["ID"] != "1" || r["name"] != "testa" {
34-
fmt.Printf("[%s]\n", r["ID"])
3533
t.Error("invalid value", r["ID"])
3634
}
3735
}

main.go

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
type TRDSQL struct {
1010
outStream io.Writer
1111
errStream io.Writer
12+
iguess bool
13+
iltsv bool
1214
inSep string
1315
ihead bool
1416
iskip int

trdsql.go

+32-16
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import (
1111
"strings"
1212
)
1313

14-
const VERSION = `0.3.0`
15-
1614
var debug = debugT(false)
1715

1816
type debugT bool
@@ -29,9 +27,6 @@ func (trdsql TRDSQL) Run(args []string) int {
2927
version bool
3028
odriver string
3129
odsn string
32-
iltsv bool
33-
inSep string
34-
ihead bool
3530
iskip int
3631
query string
3732
driver string
@@ -63,10 +58,11 @@ Options:
6358
flags.StringVar(&cfg.Db, "db", cfg.Db, "Specify db name of the setting.")
6459
flags.StringVar(&odriver, "driver", "", "database driver. [ "+strings.Join(sql.Drivers(), " | ")+" ]")
6560
flags.StringVar(&odsn, "dsn", "", "database connection option.")
66-
flags.BoolVar(&iltsv, "iltsv", false, "LTSV format for input.")
67-
flags.StringVar(&inSep, "id", ",", "Field delimiter for input.")
61+
flags.BoolVar(&trdsql.iguess, "ig", false, "Guess format from extension.")
62+
flags.BoolVar(&trdsql.iltsv, "iltsv", false, "LTSV format for input.")
63+
flags.StringVar(&trdsql.inSep, "id", ",", "Field delimiter for input.")
6864
flags.StringVar(&trdsql.outSep, "od", ",", "Field delimiter for output.")
69-
flags.BoolVar(&ihead, "ih", false, "The first line is interpreted as column names.")
65+
flags.BoolVar(&trdsql.ihead, "ih", false, "The first line is interpreted as column names.")
7066
flags.BoolVar(&oltsv, "oltsv", false, "LTSV format for output.")
7167
flags.BoolVar(&oat, "oat", false, "ASCII Table format for output.")
7268
flags.BoolVar(&omd, "omd", false, "Mark Down format for output.")
@@ -134,17 +130,11 @@ Options:
134130
}
135131
trdsql.iskip = iskip
136132
var r int
137-
if iltsv {
138-
trdsql.inSep = "\t"
139-
sqlstr, r = trdsql.ltsvReader(db, sqlstr, tablenames)
140-
} else {
141-
trdsql.inSep = inSep
142-
trdsql.ihead = ihead
143-
sqlstr, r = trdsql.csvReader(db, sqlstr, tablenames)
144-
}
133+
sqlstr, r = trdsql.tableReader(db, sqlstr, tablenames)
145134
if r != 0 {
146135
return r
147136
}
137+
148138
switch {
149139
case oltsv:
150140
r = trdsql.ltsvWrite(db, sqlstr)
@@ -163,6 +153,32 @@ Options:
163153
return r
164154
}
165155

156+
func (trdsql TRDSQL) tableReader(db *DDB, sqlstr string, tablenames []string) (string, int) {
157+
var r int
158+
for _, tablename := range tablenames {
159+
ltsv := false
160+
if trdsql.iltsv {
161+
ltsv = true
162+
} else if trdsql.iguess {
163+
ltsv = guessExtension(tablename)
164+
}
165+
if ltsv {
166+
sqlstr, r = trdsql.ltsvReader(db, sqlstr, tablename)
167+
} else {
168+
sqlstr, r = trdsql.csvReader(db, sqlstr, tablename)
169+
}
170+
}
171+
return sqlstr, r
172+
}
173+
174+
func guessExtension(tablename string) bool {
175+
pos := strings.LastIndex(tablename, ".")
176+
if pos > 0 && tablename[pos:] == ".ltsv" {
177+
return true
178+
}
179+
return false
180+
}
181+
166182
func getSeparator(sepString string) (rune, error) {
167183
if sepString == "" {
168184
return 0, nil

trdsql_test.go

+22-13
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ var outformat = []string{
2222
"-oltsv",
2323
"-oat",
2424
"-omd",
25+
"-ojson",
26+
"-oraw",
2527
}
2628

2729
func TestRun(t *testing.T) {
@@ -61,15 +63,12 @@ func TestLtsvRun(t *testing.T) {
6163
}
6264
}
6365

64-
var tsql = []string{
65-
"test.sql",
66-
}
67-
68-
func TestQueryfileRun(t *testing.T) {
66+
func TestGuessRun(t *testing.T) {
6967
outStream, errStream := new(bytes.Buffer), new(bytes.Buffer)
7068
trdsql := &TRDSQL{outStream: outStream, errStream: errStream}
71-
for _, c := range tsql {
72-
args := []string{"trdsql", "-q", "testdata/" + c}
69+
for _, c := range append(tcsv, tltsv...) {
70+
sql := "SELECT * FROM testdata/" + c
71+
args := []string{"trdsql", "-ig", sql}
7372
if trdsql.Run(args) != 0 {
7473
t.Errorf("trdsql error.")
7574
}
@@ -79,13 +78,15 @@ func TestQueryfileRun(t *testing.T) {
7978
}
8079
}
8180

82-
/*
83-
func TestPgRun(t *testing.T) {
81+
var tsql = []string{
82+
"test.sql",
83+
}
84+
85+
func TestQueryfileRun(t *testing.T) {
8486
outStream, errStream := new(bytes.Buffer), new(bytes.Buffer)
8587
trdsql := &TRDSQL{outStream: outStream, errStream: errStream}
86-
for _, c := range tcsv {
87-
sql := "SELECT * FROM testdata/" + c
88-
args := []string{"trdsql", "-driver", "postgres", sql}
88+
for _, c := range tsql {
89+
args := []string{"trdsql", "-q", "testdata/" + c}
8990
if trdsql.Run(args) != 0 {
9091
t.Errorf("trdsql error.")
9192
}
@@ -94,4 +95,12 @@ func TestPgRun(t *testing.T) {
9495
}
9596
}
9697
}
97-
*/
98+
99+
func TestGuessExtension(t *testing.T) {
100+
if guessExtension("test.ltsv") != true {
101+
t.Errorf("guessExtension error.")
102+
}
103+
if guessExtension("test.csv") != false {
104+
t.Errorf("guessExtension error.")
105+
}
106+
}

version.go

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package main
2+
3+
// VERSION is trdsql version
4+
const VERSION = `0.3.1`

0 commit comments

Comments
 (0)