package common

import (
	"dbweb/core"
	"github.com/linlexing/dbx/ddb"
	"fmt"
	"time"

	"github.com/linlexing/dbx/render"
)

type SqlRun struct{}

func init() {
	core.RegisterFun(  "sqlrun",new(SqlRun))
}
func (s *SqlRun) Post(p *core.ElementHandleArgs) {
	var err error
	var db ddb.DB
	var dbName string
	if len(p.PKS) > 0 {
		dbName = p.PKS[0]
	}
	if len(dbName) == 0 {
		db = p.DB
	} else {
		if !core.OuterDBExists(p.DB, dbName) {
			p.More["Error"] = "外部数据库[" + dbName + "]不存在"
			p.HTML()
			return
		}
		db = core.LoadOuterDB(p.DB, dbName)
	}
	cmdType := p.Req.PostFormValue("cmdtype")
	sql := p.Req.PostFormValue("sql")
	p.More["Sql"] = sql
	if sql, err = render.RenderSQL(sql, map[string]interface{}{
		"User": p.User,
	}); err != nil {
		p.More["Error"] = err.Error()
		p.HTML()
		return
	}
	if cmdType == "select" {
		tm := time.Now()

		rows, cols, err := ddb.QueryMaps(db, sql)
		if err != nil {
			p.More["Error"] = err.Error()
			p.HTML()
			return
		}
		p.More["Columns"] = cols
		p.More["UsedTime"] = time.Since(tm).Seconds()
		p.More["Result"] = rows
	} else {
		tm := time.Now()
		sr, err := db.Exec(sql)
		if err != nil {
			p.More["Error"] = err.Error()
			p.HTML()
			return
		}
		i, err := sr.RowsAffected()
		if err != nil {
			p.More["Error"] = err.Error()
			p.HTML()
			return
		}
		p.More["UsedTime"] = time.Since(tm).Seconds()
		p.More["CmdResult"] = fmt.Sprintf("成功执行命令，共有%d行记录受到影响", i)
	}

	p.HTML()
}
