package main

import (
	"database/sql"
	"fmt"
	"log"
	"os"
	"sync"
	"time"
	_ "xugu_go_driver/xugu"
)

func main3() {
	db, err := sql.Open("xugusql", "IP=192.168.2.216;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=15138;AUTO_COMMIT=on;CHAR_SET=UTF8")
	if err != nil {
		log.Fatal("err ", err)
	}
	// if err := db.Ping(); err != nil {
	// 	log.Fatal("err ping ", err)
	// }

	// rows, err := db.Query("select * from dual")
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// // rows, err := db.Query("select * from test1 where id = ?;", 4)
	// // if err != nil {
	// // 	log.Fatal(err)
	// // }
	// var cols []string
	// cols, err = rows.Columns()
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// fmt.Println("cols: ", cols)
	// pvals := make([]interface{}, len(cols))
	// for key, _ := range pvals {
	// 	dest := make([]byte, 216)
	// 	pvals[key] = &dest
	// } /* end for */
	// for rows.Next() {
	// 	err = rows.Scan(pvals...)
	// 	if err != nil {
	// 		log.Fatal(err)
	// 	}
	// 	for _, v := range pvals {
	// 		fmt.Printf("输出 %s\t", string(*(v.(*[]byte))))
	// 	}
	// 	fmt.Printf("\n")
	// }
	//  rows.Close()

	// stmt, err := db.Prepare("select * from test1 where id = ?")
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// stmt.Exec(2)
	// ret, err := db.Exec("insert into test1 (id) values (9)")
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// ret.LastInsertId()

	// stmt, err := db.Prepare("select * from test1 where id = ?")
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// rows, err := stmt.Query(5)
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// var cols []string
	// cols, err = rows.Columns()
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// fmt.Println("cols: ", cols)
	// pvals := make([]interface{}, len(cols))
	// for key, _ := range pvals {
	// 	dest := make([]byte, 216)
	// 	pvals[key] = &dest
	// } /* end for */
	// for rows.Next() {
	// 	err = rows.Scan(pvals...)
	// 	if err != nil {
	// 		log.Fatal(err)
	// 	}
	// 	for _, v := range pvals {
	// 		fmt.Printf("输出 %s\t", string(*(v.(*[]byte))))
	// 	}
	// 	fmt.Printf("\n")
	// }
	// rows.Close()

	//	db.Exec("set auto_commit on;")

	// rows, err := db.Query("select * from gotab2;")
	// if err != nil {
	// 	fmt.Printf("[ERROR] %s\n", err.Error())
	// 	return
	// }

	// column, err := rows.Columns()
	// if err != nil {
	// 	fmt.Printf("[ERROR] %s\n", err.Error())
	// 	return
	// }
	// rows_value := make([]interface{}, len(column))
	// for key, _ := range rows_value {
	// 	dest := make([]byte, 216)
	// 	rows_value[key] = &dest
	// }

	// for rows.Next() {
	// 	rows.Scan(rows_value...)

	// 	for _, v := range rows_value {
	// 		fmt.Printf("结果: %s\t", string(*(v.(*[]byte))))
	// 	}
	// 	fmt.Printf("\n")
	// }

	// rows.Close()
	// db.Close()
	// 打开文件以写入
	file, err := os.OpenFile("output.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		log.Fatalf("无法打开文件: %v", err)
	}
	defer file.Close()

	// 创建一个新的日志记录器，将输出写入文件
	logger := log.New(file, "", log.LstdFlags)
	var wg sync.WaitGroup
	const numGoroutines = 10000

	for i := 0; i < numGoroutines; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			processQuery(db, i, logger)
		}(i)
	}

	wg.Wait()
	fmt.Println("所有goroutine已完成")
	defer db.Close()
}

func processQuery(db *sql.DB, id int, logger *log.Logger) {
	fmt.Printf("goroutine %d 开始\n", id)
	//db.Query("select 1 from dual;")
	rows, err := db.Query("select * from gotab3;")
	if err != nil {
		fmt.Printf("[ERROR] %s\n", err.Error())
		logger.Printf("[ERROR] %s\n", err.Error())
		return
	}
	defer rows.Close()

	column, err := rows.Columns()
	if err != nil {
		fmt.Printf("[ERROR] %s\n", err.Error())
		logger.Printf("[ERROR] %s\n", err.Error())
		return
	}

	rowsValue := make([]interface{}, len(column))
	for key := range rowsValue {
		dest := make([]byte, 100000)
		rowsValue[key] = &dest
	}

	for rows.Next() {
		err := rows.Scan(rowsValue...)
		if err != nil {
			fmt.Printf("[ERROR] %s\n", err.Error())
			logger.Printf("[ERROR] %s\n", err.Error())
			return
		}

		for _, v := range rowsValue {
			sss := []byte(*(v.(*[]byte)))
			v = sss
		}
	}
	//time.Sleep(time.Second * 100)
	logger.Println("goroutine %d 完成\n", id)
	fmt.Printf("goroutine %d 完成\n", id)
}

type UserInfo struct {
	Id        int
	UniqueID  string
	Username  string
	Account   string
	Password  string
	Telephone string
	Email     string
	Role      string
	GroupId   sql.NullInt32
}
type LicenseApplication struct {
	Creator                   string // 创建人
	ApplicationDate           string //申请日期
	AssociatedProject         string // 关联项目
	SalesPerson               string //销售人员
	SalesEmail                string // 销售接收邮箱
	SupportPerson             string //技服人员
	SupportEmail              string // 技服接收邮箱
	TotalNodes                string //总节点数
	Company                   string //使用单位
	ProductName               string // 产品名称
	Version                   string //版本
	NodeCount                 string //节点数
	Processor                 string //处理器
	OperatingSystem           string //操作系统
	MasterMacAddress          string // 主MasterMac地址
	SecondaryMasterMacAddress string // 副MasterMac地址
}

type LicenseInfo struct {
	ID           int          `json:"id"`
	UserID       int          `json:"user_id"`
	UpUser       string       `json:"up_user"`
	UpTime       sql.NullTime `json:"up_time"`
	DelTime      sql.NullTime `json:"del_time"`
	License1     string
	License2     string
	LicenseFlage string
	UniqueID     string
	LicenseApplication
}

func main() {

	db, err := sql.Open("xugusql", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;AUTO_COMMIT=on;CHAR_SET=UTF8")
	if err != nil {
		log.Fatal("err ", err)
	}
	query := fmt.Sprintf(`
				 select ID,UNIQUEID,USERNAME,Account,PASSWORD,TELEPHONE,EMAIL,ROLE,GroupId  from lic_USER where id = ?;`)

	rows, err := db.Query(query, 11)
	if err != nil {
		fmt.Println("query data: %v", err)
		//return nil, 0, fmt.Errorf("query error: %v", err)
	}
	defer rows.Close()
	var results []UserInfo
	for rows.Next() {
		var li UserInfo

		err = rows.Scan(
			&li.Id,
			&li.UniqueID,
			&li.Username,
			&li.Account,
			&li.Password,
			&li.Telephone,
			&li.Email,
			&li.Role,
			&li.GroupId,
		)

		if err != nil {
			fmt.Println("scan row: %v", err)
			//	return nil, fmt.Errorf("scan row: %v", err)
			//return nil, 0, fmt.Errorf("scan row error: %v", err)
		}
		results = append(results, li)
	}

	if err = rows.Err(); err != nil {
		//return nil, 0, fmt.Errorf("rows error: %v", err)
	}
	fmt.Printf("results123 %#v", results)

	db.SetConnMaxLifetime(time.Minute * 3)

}
