|
1 | 1 | package main
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "io" |
| 4 | + "database/sql" |
5 | 5 | "os"
|
6 | 6 | "path/filepath"
|
7 | 7 |
|
8 | 8 | "github.com/gitql/gitql"
|
9 |
| - gitqlgit "github.com/gitql/gitql/git" |
| 9 | + "github.com/gitql/gitql/git" |
10 | 10 | "github.com/gitql/gitql/internal/format"
|
11 |
| - "github.com/gitql/gitql/sql" |
12 | 11 |
|
13 |
| - "srcd.works/go-git.v4" |
| 12 | + gogit "srcd.works/go-git.v4" |
| 13 | + "srcd.works/go-git.v4/utils/ioutil" |
14 | 14 | )
|
15 | 15 |
|
16 | 16 | type cmdQueryBase struct {
|
17 | 17 | cmd
|
18 | 18 |
|
19 | 19 | Path string `short:"p" long:"path" description:"Path where the git repository is located"`
|
20 | 20 |
|
21 |
| - db sql.Database |
22 |
| - e *gitql.Engine |
| 21 | + db *sql.DB |
| 22 | + name string |
23 | 23 | }
|
24 | 24 |
|
25 | 25 | func (c *cmdQueryBase) buildDatabase() error {
|
26 | 26 | c.print("opening %q repository...\n", c.Path)
|
27 | 27 |
|
28 | 28 | var err error
|
29 |
| - r, err := git.PlainOpen(c.Path) |
| 29 | + r, err := gogit.PlainOpen(c.Path) |
30 | 30 | if err != nil {
|
31 | 31 | return err
|
32 | 32 | }
|
33 | 33 |
|
34 |
| - name := filepath.Base(filepath.Join(c.Path, "..")) |
35 |
| - |
36 |
| - c.db = gitqlgit.NewDatabase(name, r) |
37 |
| - c.e = gitql.New() |
38 |
| - c.e.AddDatabase(c.db) |
39 |
| - |
40 |
| - return nil |
| 34 | + c.name = filepath.Base(filepath.Join(c.Path, "..")) |
| 35 | + gitql.DefaultEngine.AddDatabase(git.NewDatabase(c.name, r)) |
| 36 | + c.db, err = sql.Open(gitql.DriverName, "") |
| 37 | + return err |
41 | 38 | }
|
42 | 39 |
|
43 |
| -func (c *cmdQueryBase) executeQuery(sql string) (sql.Schema, sql.RowIter, error) { |
44 |
| - c.print("executing %q at %q\n", sql, c.db.Name()) |
45 |
| - |
46 |
| - return c.e.Query(sql) |
| 40 | +func (c *cmdQueryBase) executeQuery(sql string) (*sql.Rows, error) { |
| 41 | + c.print("executing %q at %q\n", sql, c.name) |
| 42 | + return c.db.Query(sql) |
47 | 43 | }
|
48 | 44 |
|
49 |
| -func (c *cmdQueryBase) printQuery(schema sql.Schema, iter sql.RowIter, formatId string) error { |
| 45 | +func (c *cmdQueryBase) printQuery(rows *sql.Rows, formatId string) (err error) { |
| 46 | + defer ioutil.CheckClose(rows, &err) |
| 47 | + |
50 | 48 | f, err := format.NewFormat(formatId, os.Stdout)
|
51 | 49 | if err != nil {
|
52 | 50 | return err
|
53 | 51 | }
|
| 52 | + defer ioutil.CheckClose(f, &err) |
54 | 53 |
|
55 |
| - headers := []string{} |
56 |
| - for _, f := range schema { |
57 |
| - headers = append(headers, f.Name) |
| 54 | + cols, err := rows.Columns() |
| 55 | + if err != nil { |
| 56 | + return err |
58 | 57 | }
|
59 | 58 |
|
60 |
| - if err := f.WriteHeader(headers); err != nil { |
| 59 | + if err := f.WriteHeader(cols); err != nil { |
61 | 60 | return err
|
62 | 61 | }
|
63 | 62 |
|
| 63 | + vals := make([]interface{}, len(cols)) |
| 64 | + valPtrs := make([]interface{}, len(cols)) |
| 65 | + for i := 0; i < len(cols); i++ { |
| 66 | + valPtrs[i] = &vals[i] |
| 67 | + } |
| 68 | + |
64 | 69 | for {
|
65 |
| - row, err := iter.Next() |
66 |
| - if err == io.EOF { |
| 70 | + if !rows.Next() { |
67 | 71 | break
|
68 | 72 | }
|
69 |
| - if err != nil { |
70 |
| - return err |
71 |
| - } |
72 | 73 |
|
73 |
| - dataRow := make([]interface{}, len(row)) |
74 |
| - for i := range row { |
75 |
| - dataRow[i] = interface{}(row[i]) |
| 74 | + if err := rows.Scan(valPtrs...); err != nil { |
| 75 | + return err |
76 | 76 | }
|
77 | 77 |
|
78 |
| - if err := f.Write(dataRow); err != nil { |
| 78 | + if err := f.Write(vals); err != nil { |
79 | 79 | return err
|
80 | 80 | }
|
81 | 81 | }
|
82 | 82 |
|
83 |
| - if err := iter.Close(); err != nil { |
84 |
| - _ = f.Close() |
85 |
| - return err |
86 |
| - } |
87 |
| - |
88 |
| - return f.Close() |
| 83 | + return rows.Err() |
89 | 84 | }
|
0 commit comments