Skip to content

Commit a465458

Browse files
committed
CSV comments.
1 parent 65af806 commit a465458

File tree

2 files changed

+26
-22
lines changed

2 files changed

+26
-22
lines changed

ext/csv/csv.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) {
3838
header bool
3939
columns int = -1
4040
comma rune = ','
41+
comment rune
4142

4243
done = map[string]struct{}{}
4344
)
@@ -60,6 +61,8 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) {
6061
columns, err = uintArg(key, val)
6162
case "comma":
6263
comma, err = runeArg(key, val)
64+
case "comment":
65+
comment, err = runeArg(key, val)
6366
default:
6467
return nil, fmt.Errorf("csv: unknown %q parameter", key)
6568
}
@@ -74,11 +77,12 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) {
7477
}
7578

7679
table := &table{
77-
fsys: fsys,
78-
name: filename,
79-
data: data,
80-
comma: comma,
81-
header: header,
80+
fsys: fsys,
81+
name: filename,
82+
data: data,
83+
comma: comma,
84+
comment: comment,
85+
header: header,
8286
}
8387

8488
if schema == "" {
@@ -118,12 +122,13 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) {
118122
}
119123

120124
type table struct {
121-
fsys fs.FS
122-
name string
123-
data string
124-
typs []affinity
125-
comma rune
126-
header bool
125+
fsys fs.FS
126+
name string
127+
data string
128+
typs []affinity
129+
comma rune
130+
comment rune
131+
header bool
127132
}
128133

129134
func (t *table) BestIndex(idx *sqlite3.IndexInfo) error {
@@ -180,6 +185,7 @@ func (t *table) newReader() (*csv.Reader, io.Closer, error) {
180185
csv := csv.NewReader(r)
181186
csv.ReuseRecord = true
182187
csv.Comma = t.comma
188+
csv.Comment = t.comment
183189
return csv, c, nil
184190
}
185191

@@ -235,17 +241,13 @@ func (c *cursor) RowID() (int64, error) {
235241

236242
func (c *cursor) Column(ctx *sqlite3.Context, col int) error {
237243
if col < len(c.row) {
238-
var typ affinity
244+
typ := text
239245
if col < len(c.table.typs) {
240246
typ = c.table.typs[col]
241247
}
242248

243249
txt := c.row[col]
244-
if typ == blob {
245-
ctx.ResultText(txt)
246-
return nil
247-
}
248-
if txt == "" {
250+
if txt == "" && typ != text {
249251
return nil
250252
}
251253

@@ -266,9 +268,9 @@ func (c *cursor) Column(ctx *sqlite3.Context, col int) error {
266268
}
267269
}
268270
fallthrough
269-
case text:
270-
ctx.ResultText(c.row[col])
271+
default:
271272
}
273+
ctx.ResultText(txt)
272274
}
273275
return nil
274276
}

ext/csv/csv_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,16 @@ func TestRegister(t *testing.T) {
6363
csv.Register(db)
6464

6565
const data = `
66+
# Comment
6667
"Rob" "Pike" rob
6768
"Ken" Thompson ken
6869
Robert "Griesemer" "gri"`
6970
err = db.Exec(`
7071
CREATE VIRTUAL TABLE temp.users USING csv(
71-
data = ` + sqlite3.Quote(data) + `,
72-
schema = 'CREATE TABLE x(first_name, last_name, username)',
73-
comma = '\t'
72+
data = ` + sqlite3.Quote(data) + `,
73+
schema = 'CREATE TABLE x(first_name, last_name, username)',
74+
comma = '\t',
75+
comment = '#'
7476
)`)
7577
if err != nil {
7678
t.Fatal(err)

0 commit comments

Comments
 (0)