2026-01-22 04:59:53 +08:00
package db
import (
. "code.hoteas.com/golang/hotime/common"
"os"
"strings"
)
// backupSave 保存备份
// path: 备份文件路径
// tt: 表名
// code: 备份类型 0=全部, 1=仅数据, 2=仅DDL
func ( that * HoTimeDB ) backupSave ( path string , tt string , code int ) {
fd , _ := os . OpenFile ( path , os . O_RDWR | os . O_CREATE | os . O_APPEND , 0644 )
defer fd . Close ()
2026-03-20 10:46:51 +08:00
q := "`"
if that . Dialect != nil {
q = that . Dialect . QuoteChar ()
}
2026-01-22 04:59:53 +08:00
str := "\r\n"
if code == 0 || code == 2 {
str += that . backupDdl ( tt )
}
if code == 0 || code == 1 {
2026-03-20 10:46:51 +08:00
str += "insert into " + q + tt + q + "\r\n\r\n("
2026-01-22 04:59:53 +08:00
str += that . backupCol ( tt )
}
_ , _ = fd . Write ([] byte ( str ))
}
// backupDdl 备份表结构(DDL)
func ( that * HoTimeDB ) backupDdl ( tt string ) string {
2026-03-20 10:46:51 +08:00
switch that . Type {
case "dm" , "dameng" :
return that . backupDdlDM ( tt )
default :
data := that . Query ( "show create table " + tt )
if len ( data ) == 0 {
return ""
}
return ObjToStr ( data [ 0 ][ "Create Table" ]) + ";\r\n\r\n"
}
}
// backupDdlDM 达梦数据库 DDL 导出
func ( that * HoTimeDB ) backupDdlDM ( tt string ) string {
cols := that . Query ( `SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME='` + tt + `' ORDER BY COLUMN_ID` )
if len ( cols ) == 0 {
2026-01-22 04:59:53 +08:00
return ""
}
2026-03-20 10:46:51 +08:00
ddl := "CREATE TABLE \"" + tt + "\" (\r\n"
for i , col := range cols {
name := col . GetString ( "COLUMN_NAME" )
dtype := col . GetString ( "DATA_TYPE" )
nullable := col . GetString ( "NULLABLE" )
defVal := col . GetString ( "DATA_DEFAULT" )
colDef := " \"" + name + "\" " + dtype
prec := col . GetInt ( "DATA_PRECISION" )
scale := col . GetInt ( "DATA_SCALE" )
length := col . GetInt ( "DATA_LENGTH" )
if prec > 0 {
colDef += "(" + ObjToStr ( prec )
if scale > 0 {
colDef += "," + ObjToStr ( scale )
}
colDef += ")"
} else if length > 0 && ( strings . Contains ( strings . ToUpper ( dtype ), "CHAR" ) || strings . Contains ( strings . ToUpper ( dtype ), "BINARY" )) {
colDef += "(" + ObjToStr ( length ) + ")"
}
if nullable == "N" {
colDef += " NOT NULL"
}
if defVal != "" {
colDef += " DEFAULT " + strings . TrimSpace ( defVal )
}
if i < len ( cols ) - 1 {
colDef += ","
}
ddl += colDef + "\r\n"
}
ddl += ");\r\n\r\n"
return ddl
2026-01-22 04:59:53 +08:00
}
// backupCol 备份表数据
func ( that * HoTimeDB ) backupCol ( tt string ) string {
2026-03-20 10:46:51 +08:00
q := "`"
if that . Dialect != nil {
q = that . Dialect . QuoteChar ()
}
2026-01-22 04:59:53 +08:00
str := ""
data := that . Select ( tt , "*" )
lthData := len ( data )
if lthData == 0 {
return str
}
lthCol := len ( data [ 0 ])
col := make ([] string , lthCol )
tempLthData := 0
for k := range data [ 0 ] {
if tempLthData == lthCol - 1 {
2026-03-20 10:46:51 +08:00
str += q + k + q + ") "
2026-01-22 04:59:53 +08:00
} else {
2026-03-20 10:46:51 +08:00
str += q + k + q + ","
2026-01-22 04:59:53 +08:00
}
col [ tempLthData ] = k
tempLthData ++
}
str += " values"
for j := 0 ; j < lthData ; j ++ {
for m := 0 ; m < lthCol ; m ++ {
if m == 0 {
str += "("
}
v := "NULL"
if data [ j ][ col [ m ]] != nil {
v = "'" + strings . Replace ( ObjToStr ( data [ j ][ col [ m ]]), "'" , `\'` , - 1 ) + "'"
}
if m == lthCol - 1 {
str += v + ") "
} else {
str += v + ","
}
}
if j == lthData - 1 {
str += ";\r\n\r\n"
} else {
str += ",\r\n\r\n"
}
}
return str
}