|
|
package database
|
|
|
|
|
|
import (
|
|
|
"database/sql"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
"github.com/go-kratos/kratos/v2/log"
|
|
|
"strings"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
type ResourcePool struct {
|
|
|
Id int64 `db:"id"`
|
|
|
PoolName string `db:"pool_name"`
|
|
|
CreateTime time.Time `db:"create_time"`
|
|
|
UpdateTime time.Time `db:"update_time"`
|
|
|
}
|
|
|
|
|
|
type Nodes struct {
|
|
|
Id int64 `db:"id"`
|
|
|
NodeName string `db:"node_name"`
|
|
|
NodeIp string `db:"node_ip"`
|
|
|
CreateTime time.Time `db:"create_time"`
|
|
|
UpdateTime time.Time `db:"update_time"`
|
|
|
}
|
|
|
|
|
|
type NodeInfo struct {
|
|
|
Name string
|
|
|
IP string
|
|
|
}
|
|
|
|
|
|
func ExistsResourcePoolByPoolName(poolName string) bool {
|
|
|
var count int
|
|
|
err := db.QueryRow("SELECT count(1) FROM resource_pool WHERE pool_name = ?", poolName).Scan(&count)
|
|
|
if err != nil {
|
|
|
log.Infof("Query failed: %v", err)
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
return count > 0
|
|
|
}
|
|
|
|
|
|
func QueryResourcePoolById(poolId int64) (*ResourcePool, error) {
|
|
|
var pool ResourcePool
|
|
|
err := db.QueryRow("SELECT id, pool_name, create_time, update_time FROM resource_pool WHERE id = ?", poolId).
|
|
|
Scan(&pool.Id, &pool.PoolName, &pool.CreateTime, &pool.UpdateTime)
|
|
|
if err != nil {
|
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
|
log.Infof("No record found with id %d", poolId)
|
|
|
return nil, nil
|
|
|
}
|
|
|
log.Infof("Query failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
return &pool, nil
|
|
|
}
|
|
|
|
|
|
func QueryResourcePoolListAll() ([]*ResourcePool, error) {
|
|
|
// 执行查询
|
|
|
rows, err := db.Query("SELECT id, pool_name, create_time, update_time FROM resource_pool order by id asc")
|
|
|
if err != nil {
|
|
|
log.Infof("Query failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
defer rows.Close()
|
|
|
|
|
|
// 存放结果的切片
|
|
|
pools := make([]*ResourcePool, 0)
|
|
|
|
|
|
// 遍历每一行
|
|
|
for rows.Next() {
|
|
|
var pool ResourcePool
|
|
|
err := rows.Scan(&pool.Id, &pool.PoolName, &pool.CreateTime, &pool.UpdateTime)
|
|
|
if err != nil {
|
|
|
log.Infof("Scan failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
pools = append(pools, &pool)
|
|
|
}
|
|
|
|
|
|
// 检查 rows 是否遍历中出错
|
|
|
if err := rows.Err(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
return pools, nil
|
|
|
}
|
|
|
|
|
|
func QueryNodesByPoolId(poolId int64) ([]*Nodes, error) {
|
|
|
// 执行查询
|
|
|
rows, err := db.Query("SELECT id, node_name, node_ip, create_time, update_time FROM nodes where pool_id = ?", poolId)
|
|
|
if err != nil {
|
|
|
log.Infof("Query failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
defer rows.Close()
|
|
|
|
|
|
// 存放结果的切片
|
|
|
nodes := make([]*Nodes, 0)
|
|
|
|
|
|
// 遍历每一行
|
|
|
for rows.Next() {
|
|
|
var node Nodes
|
|
|
err := rows.Scan(&node.Id, &node.NodeName, &node.NodeIp, &node.CreateTime, &node.UpdateTime)
|
|
|
if err != nil {
|
|
|
log.Infof("Scan failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
nodes = append(nodes, &node)
|
|
|
}
|
|
|
|
|
|
// 检查 rows 是否遍历中出错
|
|
|
if err := rows.Err(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
return nodes, nil
|
|
|
}
|
|
|
|
|
|
func QueryDistinctNodes() ([]*Nodes, error) {
|
|
|
// 执行查询
|
|
|
rows, err := db.Query("select distinct nodes.node_name, nodes.node_ip from nodes")
|
|
|
if err != nil {
|
|
|
log.Infof("Query failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
defer rows.Close()
|
|
|
|
|
|
// 存放结果的切片
|
|
|
nodes := make([]*Nodes, 0)
|
|
|
|
|
|
// 遍历每一行
|
|
|
for rows.Next() {
|
|
|
var node Nodes
|
|
|
err := rows.Scan(&node.NodeName, &node.NodeIp)
|
|
|
if err != nil {
|
|
|
log.Infof("Scan failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
nodes = append(nodes, &node)
|
|
|
}
|
|
|
|
|
|
// 检查 rows 是否遍历中出错
|
|
|
if err := rows.Err(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
return nodes, nil
|
|
|
}
|
|
|
|
|
|
func QueryResourceNamesByIp(nodeIp string) ([]string, error) {
|
|
|
// 执行查询
|
|
|
rows, err := db.Query("select pool_name from resource_pool where id in (select distinct pool_id from nodes where node_ip=?)", nodeIp)
|
|
|
if err != nil {
|
|
|
log.Infof("Query failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
defer rows.Close()
|
|
|
|
|
|
// 存放结果的切片
|
|
|
resourcePoolNames := make([]string, 0)
|
|
|
|
|
|
// 遍历每一行
|
|
|
for rows.Next() {
|
|
|
var name string
|
|
|
err := rows.Scan(&name)
|
|
|
if err != nil {
|
|
|
log.Infof("Scan failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
resourcePoolNames = append(resourcePoolNames, name)
|
|
|
}
|
|
|
|
|
|
// 检查 rows 是否遍历中出错
|
|
|
if err := rows.Err(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
return resourcePoolNames, nil
|
|
|
}
|
|
|
|
|
|
func QueryResourceNamesByNodeName(nodeName string) ([]string, error) {
|
|
|
// 执行查询
|
|
|
rows, err := db.Query("select pool_name from resource_pool where id in (select distinct pool_id from nodes where node_name=?)", nodeName)
|
|
|
if err != nil {
|
|
|
log.Infof("Query failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
defer rows.Close()
|
|
|
|
|
|
// 存放结果的切片
|
|
|
resourcePoolNames := make([]string, 0)
|
|
|
|
|
|
// 遍历每一行
|
|
|
for rows.Next() {
|
|
|
var name string
|
|
|
err := rows.Scan(&name)
|
|
|
if err != nil {
|
|
|
log.Infof("Scan failed: %v", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
resourcePoolNames = append(resourcePoolNames, name)
|
|
|
}
|
|
|
|
|
|
// 检查 rows 是否遍历中出错
|
|
|
if err := rows.Err(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
return resourcePoolNames, nil
|
|
|
}
|
|
|
|
|
|
func InsertResourcePool(poolName string) (int64, error) {
|
|
|
querySql := "INSERT INTO resource_pool(pool_name) VALUES (?)"
|
|
|
|
|
|
result, err := db.Exec(querySql, poolName)
|
|
|
if err != nil {
|
|
|
log.Infof("Failed to insert record: %v", err)
|
|
|
return 0, err
|
|
|
}
|
|
|
|
|
|
id, err := result.LastInsertId()
|
|
|
if err != nil {
|
|
|
log.Infof("Failed to get last insert ID: %v", err)
|
|
|
return 0, err
|
|
|
}
|
|
|
|
|
|
return id, nil
|
|
|
}
|
|
|
|
|
|
func UpdateResourcePool(poolId int64, poolName string) (int64, error) {
|
|
|
updateSql := "UPDATE resource_pool SET pool_name=? where id=?"
|
|
|
result, err := db.Exec(updateSql, poolName, poolId)
|
|
|
if err != nil {
|
|
|
log.Infof("Failed to update record: %v", err)
|
|
|
return 0, err
|
|
|
}
|
|
|
|
|
|
rows, err := result.RowsAffected()
|
|
|
if err != nil {
|
|
|
log.Infof("Failed to get rows affected: %v", err)
|
|
|
return 0, err
|
|
|
}
|
|
|
|
|
|
return rows, nil
|
|
|
}
|
|
|
|
|
|
func InsertNodes(poolId int64, nodes []*NodeInfo) (int64, error) {
|
|
|
valueStrings := make([]string, 0, len(nodes))
|
|
|
valueArgs := make([]interface{}, 0, len(nodes)*3)
|
|
|
|
|
|
for _, node := range nodes {
|
|
|
valueStrings = append(valueStrings, "(?, ?, ?)")
|
|
|
valueArgs = append(valueArgs, poolId, node.Name, node.IP)
|
|
|
}
|
|
|
|
|
|
insertSql := fmt.Sprintf("INSERT INTO nodes(pool_id, node_name, node_ip) VALUES %s",
|
|
|
strings.Join(valueStrings, ","),
|
|
|
)
|
|
|
|
|
|
result, err := db.Exec(insertSql, valueArgs...)
|
|
|
if err != nil {
|
|
|
log.Infof("Batch insert failed: %v", err)
|
|
|
return 0, err
|
|
|
}
|
|
|
|
|
|
rows, err := result.RowsAffected()
|
|
|
if err != nil {
|
|
|
log.Infof("Get rows affected failed: %v", err)
|
|
|
return 0, err
|
|
|
}
|
|
|
|
|
|
return rows, nil
|
|
|
}
|
|
|
|
|
|
func DeleteResourcePoolById(poolId int64) (int64, error) {
|
|
|
result, err := db.Exec("DELETE FROM resource_pool WHERE id = ?", poolId)
|
|
|
if err != nil {
|
|
|
return 0, fmt.Errorf("delete failed: %w", err)
|
|
|
}
|
|
|
|
|
|
// 返回影响的行数(0 表示未删除任何数据)
|
|
|
rowsAffected, err := result.RowsAffected()
|
|
|
if err != nil {
|
|
|
return 0, fmt.Errorf("get rows affected failed: %w", err)
|
|
|
}
|
|
|
|
|
|
return rowsAffected, nil
|
|
|
}
|
|
|
|
|
|
func DeleteNodesByPoolId(poolId int64) (int64, error) {
|
|
|
result, err := db.Exec("DELETE FROM nodes WHERE pool_id = ?", poolId)
|
|
|
if err != nil {
|
|
|
return 0, fmt.Errorf("delete failed: %w", err)
|
|
|
}
|
|
|
|
|
|
// 返回影响的行数(0 表示未删除任何数据)
|
|
|
rowsAffected, err := result.RowsAffected()
|
|
|
if err != nil {
|
|
|
return 0, fmt.Errorf("get rows affected failed: %w", err)
|
|
|
}
|
|
|
|
|
|
return rowsAffected, nil
|
|
|
}
|
|
|
|
|
|
func DeleteNodeById(nodeId int64) (int64, error) {
|
|
|
result, err := db.Exec("DELETE FROM nodes WHERE id = ?", nodeId)
|
|
|
if err != nil {
|
|
|
return 0, fmt.Errorf("delete failed: %w", err)
|
|
|
}
|
|
|
|
|
|
// 返回影响的行数(0 表示未删除任何数据)
|
|
|
rowsAffected, err := result.RowsAffected()
|
|
|
if err != nil {
|
|
|
return 0, fmt.Errorf("get rows affected failed: %w", err)
|
|
|
}
|
|
|
|
|
|
return rowsAffected, nil
|
|
|
}
|