package main // TODO 这里面的代码要移动到db库的db.go中 /* import ( "fmt" "time" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "gitlink.org.cn/cloudream/utils/consts" ) // 数据库指针 var db *sqlx.DB // 错误处理函数 func HandleError(why string, err error) { if err != nil { fmt.Println(why, err) } } // 初始化数据库连接,init()方法系统会在动在main方法之前执行。 func init() { database, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/kx?charset=utf8mb4&parseTime=true") HandleError("open mysql failed,", err) db = database } // 节点延迟表插入 func Insert_NodeDelay(innodeIP string, outnodeIP []string, delay []int) { insSql := "insert into NodeDelay values(?,?,?)" updateSql := "UPDATE NodeDelay SET DelayInMs=? WHERE InNodeIP=? AND OutNodeIP=?" for i := 0; i < len(outnodeIP); i++ { _, err := db.Exec(insSql, innodeIP, outnodeIP[i], delay[i]) //HandleError("insert failed: ", err) if err != nil { _, e := db.Exec(updateSql, delay[i], innodeIP, outnodeIP[i]) HandleError("update failed: ", e) } } } // 节点表插入 func Insert_Node(nodeip string, nodelocation string, ipfsstatus string, localdirstatus string) { // 根据NodeIP查询,若不存在则插入,若存在则更新 //查询 type Node struct { NodeIP string `db:"NodeIP"` } var x Node sql := "select NodeIP from Node where NodeIP=?" err := db.Get(&x, sql, nodeip) HandleError("Get failed: ", err) //local和ipfs同时可达才可达 // TODO 将status字段改成字符串(枚举值) NodeStatus := ipfsstatus == consts.IPFS_STATUS_OK && localdirstatus == consts.LOCAL_DIR_STATUS_OK //不存在才插入 if x == (Node{}) { sql := "insert into Node values(?,?,?)" _, err := db.Exec(sql, nodeip, nodelocation, NodeStatus) HandleError("insert failed: ", err) } else { //存在则更新 sql := "update Node set NodeStatus=? where NodeIP=?" _, err := db.Exec(sql, NodeStatus, nodeip) HandleError("update failed: ", err) } } // 纠删码对象表插入 func Insert_EcObject(Object_Name string, Bucket_ID int, FileSizeInBytes int64, EcName string) (objectid int64) { // 根据objectname和bucketid查询,若不存在则插入,若存在则不操作 //查询 type Object struct { ObjectID int64 `db:"ObjectID"` ObjectName string `db:"ObjectName"` BucketID int `db:"BucketID"` } var x Object sql := "select ObjectID, ObjectName, BucketID from Object where ObjectName=? AND BucketID=?" err := db.Get(&x, sql, Object_Name, Bucket_ID) HandleError("Get failed: ", err) //不存在才插入 if x == (Object{}) { sql := "insert into Object(ObjectName, BucketID, FileSizeInBytes, Redundancy, NumRep, EcName) values(?,?,?,?,?,?)" r, err := db.Exec(sql, Object_Name, Bucket_ID, FileSizeInBytes, false, "-1", EcName) HandleError("insert failed: ", err) id, err := r.LastInsertId() HandleError("exec failed: ", err) objectid = id } else { objectid = x.ObjectID } return } // 多副本对象表插入 func Insert_RepObject(Object_Name string, Bucket_ID int, FileSizeInBytes int64, NumRep int) (objectid int64) { // 根据objectname和bucketid查询,若不存在则插入,若存在则不操作 //查询 type Object struct { ObjectID int64 `db:"ObjectID"` ObjectName string `db:"ObjectName"` BucketID int `db:"BucketID"` } var x Object sql := "select ObjectID, ObjectName, BucketID from Object where ObjectName=? AND BucketID=?" err := db.Get(&x, sql, Object_Name, Bucket_ID) HandleError("Get failed: ", err) //不存在才插入 if x == (Object{}) { sql := "insert into Object(ObjectName, BucketID, FileSizeInBytes, Redundancy, NumRep) values(?,?,?,?,?)" r, err := db.Exec(sql, Object_Name, Bucket_ID, FileSizeInBytes, true, NumRep) HandleError("insert failed: ", err) id, err := r.LastInsertId() HandleError("exec failed: ", err) objectid = id } else { objectid = x.ObjectID } return } // 对象编码块表插入 func Insert_EcObjectBlock(Object_ID int64, Inner_ID int) { // 根据objectID查询,若不存在则插入,若存在则不操作 //查询 type Block struct { ObjectID int64 `db:"ObjectID"` } var x []Block sql := "select ObjectID from ObjectBlock where ObjectID=? AND InnerID=?" err := db.Select(&x, sql, Object_ID, Inner_ID) HandleError("select failed: ", err) //不存在才插入 if x == nil { sql := "insert into ObjectBlock(ObjectID, InnerID) values(?,?)" //执行SQL语句 _, err := db.Exec(sql, Object_ID, Inner_ID) HandleError("insert failed: ", err) //查询最后一条用户ID,判断是否插入成功 // id, err := r.LastInsertId() // HandleError("exec failed: ", err) // fmt.Println("insert EcObjectBlock succ: ", id) } } // 对象副本表插入 func Insert_ObjectRep(Object_ID int64) { sql := "insert into ObjectRep(ObjectID) values(?)" _, err := db.Exec(sql, Object_ID) HandleError("insert failed: ", err) } // 对象编码块表Echash插入 func Insert_EcHash(Object_ID int, Hashs []string) { for i := 0; i < len(Hashs); i++ { sql := "update ObjectBlock set BlockHash =? where ObjectID = ? AND InnerID = ?" _, err := db.Exec(sql, Hashs[i], Object_ID, i) HandleError("insert failed: ", err) } } // 对象副本表rephash插入 func Insert_RepHash(Object_ID int, Hashs string) { sql := "update ObjectRep set RepHash =? where ObjectID = ?" _, err := db.Exec(sql, Hashs, Object_ID) HandleError("insert failed: ", err) } // 缓存表插入 func Insert_Cache(Hashs []string, Ips []string, TempOrPin bool) { for i := 0; i < len(Hashs); i++ { sql := "insert into Cache values(?,?,?,?)" _, err := db.Exec(sql, Hashs[i], Ips[i], TempOrPin, time.Now()) HandleError("insert failed: ", err) } return } func Query_ObjectID(objectname string) (objectid int) { type Object struct { ObjectID int `db:"ObjectID"` } var x Object sql := "select ObjectID from Object where ObjectName=? " err := db.Get(&x, sql, objectname) HandleError("Get failed: ", err) if x != (Object{}) { objectid = x.ObjectID } else { fmt.Println("Object not found!") } // fmt.Println("select bucketid succ:",bucketid) return } // 根据BucketName查询BucketID func Query_BucketID(bucketname string) (bucketid int) { //桶结构体 type Bucket struct { BucketID int `db:"BucketID"` BucketName string `db:"BucketName"` } var x Bucket sql := "select BucketID, BucketName from Bucket where BucketName=? " err := db.Get(&x, sql, bucketname) HandleError("Get failed: ", err) if x != (Bucket{}) { bucketid = x.BucketID } else { fmt.Println("Bucket not found!") bucketid = -1 } // fmt.Println("select bucketid succ:",bucketid) return } // 根据用户id查询可用nodeip func Query_UserNode(user_id int) []string { //用户节点结构体 type UserNode struct { UserID int `db:"UserID"` NodeIP string `db:"NodeIP"` } var x []UserNode var node_ip []string sql := "select UserID, NodeIP from UserNode where UserID=? " err := db.Select(&x, sql, user_id) HandleError("select failed: ", err) for _, value := range x { node_ip = append(node_ip, value.NodeIP) } fmt.Println("select node_ip succ:", node_ip) return node_ip } // 根据objectname和bucketid查询对象表,获得redundancy,EcName,fileSizeInBytes func Query_Object(objectname string, bucketid int) (objectid int, filesizeinbytes int64, redundancy bool, ecname string) { //对象结构体 type Object struct { ObjectID int `db:"ObjectID"` FileSizeInBytes int64 `db:"FileSizeInBytes"` Redundancy bool `db:"Redundancy"` EcName string `db:"EcName"` } var x Object sql := "select ObjectID, FileSizeInBytes, Redundancy, EcName from Object where ObjectName=? AND BucketID=?" err := db.Get(&x, sql, objectname, bucketid) HandleError("Get failed: ", err) if x != (Object{}) { objectid = x.ObjectID filesizeinbytes = x.FileSizeInBytes redundancy = x.Redundancy ecname = x.EcName } else { fmt.Println("Object not found!") } return } // 查询对象副本表 func Query_ObjectRep(objectid int) (repHash string) { //对象结构体 type ObjectRep struct { RepHash string `db:"RepHash"` } var x ObjectRep sql := "select RepHash from ObjectRep where ObjectID=?" err := db.Get(&x, sql, objectid) HandleError("Get failed: ", err) if x != (ObjectRep{}) { repHash = x.RepHash } else { fmt.Println("ObjectRep not found!") } return } // 对象编码块结构体 type ObjectBlock struct { InnerID int `db:"InnerID"` BlockHash string `db:"BlockHash"` } // 查询对象编码块表 func Query_ObjectBlock(Object_ID int) (x []ObjectBlock) { sql := "select InnerID, BlockHash from ObjectBlock where ObjectID=?" err := db.Select(&x, sql, Object_ID) HandleError("select failed: ", err) return } // 将时间字符串转化为时间戳格式(s) func Time_trans(time_string string) (timestamp int64) { timeTemplate1 := "2006-01-02 15:04:05" stamp, _ := time.ParseInLocation(timeTemplate1, time_string, time.Local) //使用parseInLocation将字符串格式化返回本地时区时间 timestamp = stamp.Unix() return } // 缓存结构体 type Cache struct { NodeIP string `db:"NodeIP"` TempOrPin bool `db:"TempOrPin"` Cachetime string `db:"Cachetime"` } // 查询缓存表 func Query_Cache(BlockHash string) (x []Cache) { sql := "select NodeIP, TempOrPin, Cachetime from Cache where HashValue=?" err := db.Select(&x, sql, BlockHash) HandleError("Get failed: ", err) return } // 更新缓存表 func Update_Cache(BlockHash string, nodeip string) (x Cache) { //根据hash和nodeip查询缓存表里是否存在此条记录 sql := "select NodeIP, TempOrPin, Cachetime from Cache where HashValue=? AND NodeIP=?" err := db.Select(&x, sql, BlockHash, nodeip) HandleError("Get failed: ", err) //若在表中已存在且所对应的TempOrPin字段为true,则更新Time if x.TempOrPin == true { sql = "update Cache set Cachetime=? where HashValue=? AND NodeIP=?" _, err := db.Exec(sql, time.Now(), BlockHash, nodeip) HandleError("update failed: ", err) } return } // 查询节点延迟表 func Query_NodeDelay(innodeip string, outnodeip string) (delay int) { //节点延迟结构体 type NodeDelay struct { DelayInMs int `db:"DelayInMs"` } var x NodeDelay sql := "select DelayInMs from NodeDelay where InNodeIP=? AND OutNodeIP=?" err := db.Get(&x, sql, innodeip, outnodeip) HandleError("Get failed: ", err) if x != (NodeDelay{}) { delay = x.DelayInMs } else { fmt.Println("NodeDelay not found!") } return } */