这个是连接数据库并根据数据库中的表生成对应的一些java和proto的信息,用到了
walk这个库,目前只能在window上使用,如果在其他平台就要自己看着办了,
需要处理其他相关的,就需要自己再进行特殊修改了
package main
// go build -ldflags="-H windowsgui"
//go get github.com/akavel/rsrc
//rsrc -manifest test.manifest -o rsrc.syso
import (
"container/list"
"database/sql"
"encoding/xml"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
_ "github.com/go-sql-driver/mysql"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
)
/*
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname
*/
//=============================================
type SQLInfo struct {
columnName string
dataType string
columnComment string
ucolumnName string
ssName string
}
type XmlData struct {
XMLName xml.Name `xml:"data"`
Name string `xml:"name,attr"`
Url string `xml:",innerxml"`
}
type XmlConfig struct {
XMLName xml.Name `xml:"root"`
Data []XmlData `xml:"data"`
}
//==============================
// 处理表名字
func ParseTbName(tbName string) string {
s := strings.TrimPrefix(tbName, "t_s_")
s = strings.TrimPrefix(s, "t_u_")
return s
}
// 替换字符串
func BigFirstName(str string) string {
temp := strings.Split(str, "_")
var upperStr string
for y := 0; y < len(temp); y++ {
vv := []rune(temp[y])
for i := 0; i < len(vv); i++ {
if i == 0 {
nz := vv[i]
if nz <= 'z' && nz >= 'a' {
vv[i] -= 32
}
//vv[i] -= 32
upperStr += string(vv[i]) // + string(vv[i+1])
} else {
upperStr += string(vv[i])
}
}
}
return upperStr
}
func BigFirstField(str string) string {
temp := strings.Split(str, "_")
var upperStr string
for y := 0; y < len(temp); y++ {
vv := []rune(temp[y])
if y != 0 {
for i := 0; i < len(vv); i++ {
if i == 0 {
vv[i] -= 32
upperStr += string(vv[i]) // + string(vv[i+1])
} else {
upperStr += string(vv[i])
}
}
}
}
return temp[0] + upperStr
}
func ReadStringFile(fn string) string {
bs, err := ioutil.ReadFile(fn)
if err != nil {
fmt.Println(err)
return ""
}
return string(bs)
}
//==============================
// 处理字段名字
//==============================
// 处理
//=============================================
type EnvModel struct {
walk.ListModelBase
Items []string
}
func NewEnvModel() *EnvModel {
m := &EnvModel{Items: make([]string, 10)}
for i := 0; i < 10; i++ {
m.Items[i] = fmt.Sprintf("name:%d", i)
}
return m
}
func (m *EnvModel) ItemCount() int {
return len(m.Items)
}
func (m *EnvModel) Value(index int) interface{} {
return m.Items[index]
}
//==========================
type DBWalk struct {
Mw *walk.MainWindow
Name string
conTE *walk.LineEdit // 连接数据的位置信息
conBT *walk.PushButton
LbDb *walk.ListBox // 数据库对应的库
LbTb *walk.ListBox // 数据库对应的表格
tabWidget *walk.TabWidget
DbModel *EnvModel
TbModel *EnvModel
Db *sql.DB
SelectDb string // 选择的数据库的名字
SelectTb string // 选择的数据库表的名字 t_u_ssn
uTbName string // 选择的数据库表修改后的名字 Ssn
tbColumns *list.List // 当前数据库表的所有字段
protoTE *walk.TextEdit
javaTE *walk.TextEdit
dbTE *walk.TextEdit
DB2PROTO map[string]string
DB2JAVA map[string]string
ProtoString string
TemplatePojo string
ITemplateDao string
TemplateDaoImpl string
TemplateDBQueue string
config XmlConfig
}
func (self *DBWalk) LoadNConfig() bool {
dt, err := ioutil.ReadFile("config.xml")
if err != nil {
log.Fatal("ReadFile xml:", err)
return false
}
fmt.Printf("%s", dt)
err = xml.Unmarshal(dt, &self.config)
if err != nil {
log.Fatal("Unmarshal xml fail:", err)
return false
}
return true
}
func (self *DBWalk) SaveNConfig(str string) bool {
if str != "" {
if len(self.config.Data) > 0 {
self.config.Data[0].Url = str
}
}
bs, err := xml.Marshal(&self.config)
if err != nil {
log.Fatal("Marshal xml fail:", err)
return false
}
err = ioutil.WriteFile("config.xml", bs, os.ModePerm)
if err != nil {
log.Fatal("WriteFile xml fail:", err)
return false
}
return true
}
func (self *DBWalk) ConnectDB(txt string) {
self.conTE.SetEnabled(false)
self.conBT.SetEnabled(false)
fmt.Println(self.Name + txt)
var err error
self.Db, err = sql.Open("mysql", self.conTE.Text())
if err != nil {
fmt.Print(err)
return
}
// 保存一下设置
self.SaveNConfig(self.conTE.Text())
//self.Db.Exec("set names utf8;")
// 显示所有数据库
rs, err := self.Db.Query("show databases;")
if err != nil {
fmt.Print(err)
return
}
l := list.New()
for rs.Next() {
var dbName string
err := rs.Scan(&dbName)
if err != nil {
fmt.Print(err)
return
}
//fmt.Printf("dbName: %s\n", dbName)
l.PushBack(dbName)
}
rs.Close()
self.DbModel.Items = make([]string, l.Len())
i := 0
for e := l.Front(); e != nil; e = e.Next() {
self.DbModel.Items[i] = e