progs:fblutil
Toto je starší verze dokumentu!
FBLUtil
Prenos dat mezi DB, Import, Export
local Path = "localhost:/home/firebird/" local DBName1 = "data_test1.fdb" local DBName2 = "data_test2.fdb" local Tmp = "/tmp/" local FName0 = "fbutil_0.csv" local FName1 = "fbutil_1.csv" function CloneTable(db1, TableName, db2) local t = db1:GetTable(TableName) local flds = "" for i, v in ipairs(t) do local s = string.format("%s %s", v.Field, v.Typ) if flds ~= "" then flds = flds .. ", " end flds = flds .. s end db2:Execute(string.format("CREATE TABLE %s (%s)", TableName, flds)) db2:Commit() end function CloneIndices(db1, TableName, db2) local t = db1:GetIndices(TableName) for i, v in ipairs(t) do db2:Execute(string.format("CREATE %s INDEX %s ON %s (%s)", v.Opts, v.Name, TableName, v.Fields)) if v.Inactive then db2:Execute(string.format("ALTER INDEX %s INACTIVE", v.Name)) end end db2:Commit() end function ExportAndDiff(DB, TableName, flds) local n = DB:ExportTable(Tmp..FName1, ";", "UTF-8", "base64", string.format("select %s from %s", flds, TableName)) local err, name, num = os.execute(string.format("diff %s %s >/dev/null 2>&1", Tmp..FName0, Tmp..FName1)) --LUA5.1 vraci cislo, >=5.2 vraci true nebo nil print("Diff", err, name, num) if (type(err) == "number" and err ~= 0) or not err then error(string.format("ERROR: Diff table %s (%s)", TableName, tostring(err))) end return n end print("Starting with", _VERSION) print("Parameters after -- param: ", arg) local db = FBLUtil.ConnectDB(Path..DBName1, "sysdba", "Andromeda") local ok, db2 = pcall(FBLUtil.ConnectDB, Path..DBName2, "sysdba", "Andromeda") if not ok then print("DB2 not found, creating...") db2 = FBLUtil.CreateDB(Path..DBName2, "sysdba", "Andromeda", "PAGE_SIZE 16384 DEFAULT CHARACTER SET UTF8") --db2 = FBLUtil.CreateDB(Path..DBName2, "sysdba", "Andromeda", "PAGE_SIZE 16384 DEFAULT CHARACTER SET WIN1250") end function TestTable(TableName) print("TableName: ", TableName) local Fields = db:GetTable(TableName) local flds = "" local vals = "" local parms = "" for i, v in ipairs(Fields) do if flds ~= "" then flds = flds .. "," end flds = flds .. v.Field if vals ~= "" then vals = vals .. "," end vals = vals .. "$("..tostring(i)..")" if parms ~= "" then parms = parms .. "," end parms = parms .. "?" end local match = "" local ix = db:GetIndices(TableName) for i, v in ipairs(ix) do if v.Opts == "UNIQUE" then match = v.Fields break end end local t = os.time() --local TableRows = db:ExportTable(Tmp..FName0, ";", "UTF-8", "base64", string.format("select %s from %s where idzmena='OB1154523686' and id=733", flds, TableName)) local TableRows = db:ExportTable(Tmp..FName0, ";", "UTF-8", "base64", string.format("select %s from %s", flds, TableName)) print(string.format("Exported %d rows %ds", TableRows, os.difftime(os.time(), t))) local t2idx = {} for i, v in ipairs(db2:GetTables()) do t2idx[v] = true end if t2idx[TableName] then db2:Execute(string.format("drop table %s", TableName)) db2:Commit() end local t = os.time() print("Test DataPumpTo") CloneTable(db, TableName, db2) local n = db:DataPumpTo(string.format("select * from %s", TableName), db2, string.format("insert into %s", TableName)) db2:Commit() CloneIndices(db, TableName, db2) print(string.format("Done %d rows in %ds", n, os.difftime(os.time(), t))) local n = ExportAndDiff(db2, TableName, flds) assert(TableRows == n) db2:Execute(string.format("drop table %s", TableName)) db2:Commit() local t = os.time() print("Test ImportTable") CloneTable(db, TableName, db2) CloneIndices(db, TableName, db2) --local n = db2:ImportTable(Tmp..FName0, ";", "UTF-8", "base64", string.format("update or insert into %s (%s) values (%s) matching (%s)", TableName, flds, vals, match)) --neni-li index, desne pomaly local n = db2:ImportTable(Tmp..FName0, ";", "UTF-8", "base64", string.format("insert into %s (%s) values (%s)", TableName, flds, vals)) db2:Commit() --CloneIndices(db, TableName, db2) print(string.format("Done %d rows in %ds", n, os.difftime(os.time(), t))) assert(TableRows == n) local n = ExportAndDiff(db2, TableName, flds) assert(TableRows == n) db2:Execute(string.format("drop table %s", TableName)) db2:Commit() local t = os.time() print("Test SelectCallback+ExecuteParams") CloneTable(db, TableName, db2) local Struct = {} --local n = db:SelectCallback(string.format("select %s from %s where idvykp='VYK05000811'", flds, TableName), local n = db:SelectCallback(string.format("select %s from %s", flds, TableName), function(t) if t.Structure then for i, v in ipairs(t.Structure) do local tt = {} for kk, vv in pairs(v) do tt[kk] = vv end table.insert(Struct, tt) end else --print(t) --db2:ExecuteParams(string.format("update or insert into %s (%s) values (%s) matching (%s)", TableName, flds, parms, match), t) db2:ExecuteParams(string.format("insert into %s (%s) values (%s)", TableName, flds, parms), t) --return false --ukoncit end end ) db2:Commit() CloneIndices(db, TableName, db2) print(string.format("Done %d rows in %ds", n, os.difftime(os.time(), t))) assert(TableRows == n) --print("------------") print(Struct) local n = ExportAndDiff(db2, TableName, flds) assert(TableRows == n) end --print(db:GetTable("TEST1")) local t = db:GetTables() if arg and arg[1] then TestTable(arg[1]) else for i, v in ipairs(t) do TestTable(v) end end db2:Drop() --db2:Disconnect() db:Disconnect() print("Set exit code") return 6
progs/fblutil.1579251649.txt.gz · Poslední úprava: 2020/01/17 09:00 autor: Karel Petrů