85 lines
3.1 KiB
Go
85 lines
3.1 KiB
Go
package backupbinlog
|
|
|
|
import (
|
|
"database/sql"
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
const (
|
|
TableName = "upload_record"
|
|
CreateTableSQL = `CREATE TABLE IF NOT EXISTS ` + TableName + ` (
|
|
id BIGINT not null,
|
|
pxc_name varchar(200) not null,
|
|
pxc_uid varchar(200) not null,
|
|
xstore_name varchar(200) not null,
|
|
pod_name varchar(200) not null,
|
|
version varchar(200) not null,
|
|
filepath varchar(300) not null,
|
|
filename varchar(50) not null,
|
|
num BIGINT not null,
|
|
start_index BIGINT,
|
|
sink_name varchar(50) not null,
|
|
sink_type varchar(50) not null,
|
|
binlog_checksum varchar(50) not null,
|
|
hash_val varchar(200),
|
|
status INT DEFAULT 0 ,
|
|
err_message TEXT,
|
|
file_mod_at datetime default CURRENT_TIMESTAMP,
|
|
created_at datetime default CURRENT_TIMESTAMP,
|
|
updated_at datetime default CURRENT_TIMESTAMP,
|
|
PRIMARY key (id)
|
|
)`
|
|
CreateIndexSQL = `CREATE INDEX IF NOT EXISTS num_idx on ` + TableName + `(num)`
|
|
ReplaceRecordSQL = "REPLACE INTO " + TableName + "(id,pxc_name,pxc_uid,xstore_name,pod_name,version,filepath,filename,num,start_index,hash_val,status,err_message,updated_at,sink_name,sink_type,binlog_checksum,file_mod_at) values(?,?,?,?,?,?,?,?,?,?,?,?,?,datetime('now'),?,?,?,?)"
|
|
SelectSQL = "SELECT id,pxc_name,pxc_uid,xstore_name,pod_name,version,filepath,filename,num,start_index,hash_val,status,err_message,created_at,updated_at,sink_name,sink_type,binlog_checksum,file_mod_at FROM " + TableName + " WHERE id=?"
|
|
// IdBitNumMask use the low bit num of binlog no. for record id
|
|
IdBitNumMask = 0x0ffff
|
|
SelectExpiredOneSQL = ""
|
|
)
|
|
|
|
func GetDb(dbFile string) (*sql.DB, error) {
|
|
db, err := sql.Open("sqlite", dbFile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return db, nil
|
|
}
|
|
|
|
func TryCreateTableOfUploadRecord(db *sql.DB) error {
|
|
_, err := db.Exec(CreateTableSQL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = db.Exec(CreateIndexSQL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func getRecordId(num int64) int64 {
|
|
return num & IdBitNumMask
|
|
}
|
|
|
|
func AddRecord(db *sql.DB, binlogFile BinlogFile) error {
|
|
id := getRecordId(binlogFile.Num)
|
|
_, err := db.Exec(ReplaceRecordSQL, id, binlogFile.PxcName, binlogFile.PxcUid, binlogFile.XStoreName, binlogFile.PodName, binlogFile.Version, binlogFile.Filepath, binlogFile.Filename, binlogFile.Num, binlogFile.StartIndex, binlogFile.Sha256, binlogFile.Status, binlogFile.ErrMsg, binlogFile.SinkName, binlogFile.SinkType, binlogFile.BinlogChecksum, binlogFile.FileLastModifiedAt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func FindRecord(db *sql.DB, num int64) (*BinlogFile, error) {
|
|
binlogFile := BinlogFile{}
|
|
var id int64
|
|
err := db.QueryRow(SelectSQL, num).Scan(&id, &binlogFile.PxcName, &binlogFile.PxcUid, &binlogFile.XStoreName, &binlogFile.PodName, &binlogFile.Version, &binlogFile.Filepath, &binlogFile.Filename, &binlogFile.Num, &binlogFile.StartIndex, &binlogFile.Sha256, &binlogFile.Status, &binlogFile.ErrMsg, &binlogFile.CreatedAt, &binlogFile.UpdatedAt, &binlogFile.SinkName, &binlogFile.SinkType, &binlogFile.BinlogChecksum, &binlogFile.FileLastModifiedAt)
|
|
if err != nil {
|
|
if sql.ErrNoRows == err {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &binlogFile, nil
|
|
}
|