package main

import (
	"database/sql"
	"fmt"
	"strings"

	_ "github.com/go-sql-driver/mysql"
)

func makeTidbDatabase(db dbCfg, dbname string) (c checkDbInfo, e error) {
	psqlInfo := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db.User, db.Pwd, db.Host, db.Port, dbname)
	dbo, err := sql.Open("mysql", psqlInfo)
	if err != nil {
		return c, fmt.Errorf("open tidb(%s) err:%s", dbname, err.Error())
	}
	err = checkDBPing(dbo)
	if err != nil {
		return c, fmt.Errorf("checkDBPing(%s) pg err:%s", dbname, err.Error())
	}
	return checkDbInfo{dbo, db_tidb, dbname}, nil
}

func getTableColumnInfo_tidb(db *sql.DB,dbname, tbl string) ([]ColumnInfo, error) {
	query := fmt.Sprintf("select IS_NULLABLE,column_name, column_comment from information_schema.columns where table_schema ='%s'  and table_name = '%s'",dbname, tbl)
	rows, err := db.Query(query)
	if err != nil {
		return nil, fmt.Errorf("getTableColumnInfo err:%w", err)
	}
	defer rows.Close()
	var ret []ColumnInfo
	for rows.Next(){
		var rc ColumnInfo
		var str string
		err = rows.Scan(&str,&rc.Name,&rc.Type)
		if err != nil {
			return nil, fmt.Errorf("getTableColumnInfo(%s) err2:%w",tbl, err)
		}
		if strings.EqualFold(str,"YES"){
			rc.Nullable = true
		}
		ret = append(ret,rc)
	}
	return ret,nil
}

func findPrimaryKey_tidb(cd checkDbInfo, tbl string) (string, error) {
	query := `SELECT column_name FROM information_schema.KEY_COLUMN_USAGE 
					WHERE table_schema = '%s' AND table_name = '%s' AND CONSTRAINT_NAME = 'PRIMARY' order by ORDINAL_POSITION`
	row := cd.db.QueryRow(fmt.Sprintf(query, cd.dbname, tbl))
	var pk string
	err := row.Scan(&pk)
	return pk, err
}
