-
Notifications
You must be signed in to change notification settings - Fork 0
/
analyser.go
95 lines (77 loc) · 2.12 KB
/
analyser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package sqllite
import (
"database/sql"
"strconv"
sl "github.com/eshu0/simplelogger/pkg"
_ "github.com/mattn/go-sqlite3"
)
type DatabaseAnalyser struct {
database *sql.DB
Filename string
sl.AppLogger
}
type View struct {
Name string
TableName string
Sql string
}
func (daa *DatabaseAnalyser) Create() {
db, err := sql.Open("sqlite3", daa.Filename)
if err != nil {
daa.LogErrorEf("Create", "Create %s ", err)
daa.database = nil
} else {
daa.database = db
}
}
func (daa *DatabaseAnalyser) GetDatabaseStructure() *DatabaseStructure {
statement, _ := daa.database.Prepare("SELECT name,type,tbl_name,sql FROM sqlite_master")
rows, _ := statement.Query()
dbs := ParseStructureRows(rows)
for _, tbl := range dbs.Tables {
cols, pk := daa.GetColumns(tbl.TableName)
tbl.Columns = cols
tbl.PKColumn = pk
}
dbs.Database = daa.GetDatabase()
return dbs
}
func (daa *DatabaseAnalyser) GetColumns(tablename string) ([]*Column, *Column) {
statement, _ := daa.database.Prepare("PRAGMA table_info(" + tablename + ")")
rows, _ := statement.Query() //(tablename)
return daa.parseTableColumsRows(rows, tablename)
}
func (daa *DatabaseAnalyser) GetDatabase() *Database {
statement, _ := daa.database.Prepare("PRAGMA database_list")
rows, _ := statement.Query()
return ParseDBRows(daa, rows)
}
func (daa *DatabaseAnalyser) parseTableColumsRows(rows *sql.Rows, PTableName string) ([]*Column, *Column) {
var cId int
var name string
var cType string
var notNull int
var dftvalue []byte
var primaryKey int
var cols []*Column
var pk *Column
for rows.Next() {
rows.Scan(&cId, &name, &cType, ¬Null, &dftvalue, &primaryKey)
daa.LogDebug("parseTableColumsRows", "READ: id: "+strconv.Itoa(cId)+"- type:"+cType+"- notnull:"+strconv.Itoa(notNull)+"- default: name: "+name+"- primaryKey: "+strconv.Itoa(primaryKey))
col := Column{}
//
col.Name = name
col.CType = CTypeFromString(cType)
col.NotNull = notNull
col.DefaultValue = dftvalue
col.PrimaryKey = primaryKey
//
col.PTableName = PTableName
if col.PrimaryKey == 1 {
pk = &col
} else {
cols = append(cols, &col)
}
}
return cols, pk
}