====== FBLUtil ====== ===== Import ceniku z CSV ===== --../bin64/fblutil scripts/import_cenik.lua -debug 1 -- testcen local DBName = "localhost:/home/firebird/data.fdb" local CenikName=arg[1] local ImportFN = "/tmp/"..CenikName..".csv" local IDDruh="x-"..CenikName local Prefix=string.upper(string.sub(CenikName,1,2)) local PrefixNumChars=4 local ISC_PASSWORD=os.getenv("ISC_PASSWORD") print("Starting with", _VERSION) print("Parameters after -- param: ", arg) print("Connecting "..DBName) local db = FBLUtil.ConnectDB(DBName, "sysdba", ISC_PASSWORD) function CloneTable(db1, TableName, CloneTableName) local r=db1:GetTable(CloneTableName) if #r>0 then --tabulka existuje print("Drop "..CloneTableName) db1:Execute(string.format("DROP TABLE %s", CloneTableName)) db1:Commit() end 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 print("Create "..CloneTableName) db1:Execute(string.format("CREATE TABLE %s (%s)", CloneTableName, flds)) db1:Commit() local t = db1:GetIndices(TableName) for i, v in ipairs(t) do db1:Execute(string.format("CREATE %s INDEX %s ON %s (%s)", v.Opts, "V_"..v.Name, CloneTableName, v.Fields)) if v.Inactive then db1:Execute(string.format("ALTER INDEX %s INACTIVE", "V_"..v.Name)) end end db1:Commit() end function CloneCenik() CloneTable(db, "rozpocty_cenik", "v_rozpocty_cenik") end function GetNextPrefixNum(NumChars) local r=db:SelectToTable(string.format("select first 1 IDCen from rozpocty_cenik where IDDruh='%s' order by IDCen desc", IDDruh)) --print(r) local p=string.format("%%0%dd", NumChars) local n=0 if #r.Rows>0 then local f=string.len(Prefix)+1 local t=string.len(Prefix)+NumChars n=string.sub(r.Rows[1][1], f,t)+1 --print(p,f,t,n) end return string.format(p, n) end local PrefixNum=GetNextPrefixNum(PrefixNumChars) function Import_testcen() print("Import from "..ImportFN) local t = os.time() print(string.format("PrefixNum = %d", PrefixNum)) local n = db:ImportTable(ImportFN, ";", "UTF-8", "base64", [[insert into v_rozpocty_cenik (IDCen, IDDruh, CisRozp, ObjCis, Popis, MJ, Naklady, Hmotnost, v_IDDod, DatumZmeny) values (']]..Prefix..PrefixNum..[['||$COUNTER(%6.6d), ']]..IDDruh..[[', $(5), $(2), $(7), $(3), $(6), $(4), $(1), CURRENT_TIMESTAMP)]]) db:Commit() print(string.format("Done %d rows in %ds", n, os.difftime(os.time(), t))) end function UpdateCenik() print("Update "..IDDruh) local t = os.time() local n=db:ExecuteParams([[update rozpocty_cenik c set naklady=(select naklady from v_rozpocty_cenik v where v.v_iddod=c.v_iddod and c.iddruh=v.iddruh), DatumZmeny=CURRENT_TIMESTAMP where exists (select * from v_rozpocty_cenik v where v.v_iddod=c.v_iddod)]],{}) db:Commit() print(string.format("Update %d rown in %ds", n, os.difftime(os.time(), t))) t = os.time() local n=db:ExecuteParams([[insert into rozpocty_cenik select * from v_rozpocty_cenik v where not exists (select * from rozpocty_cenik c where c.v_iddod=v.v_iddod and c.iddruh=v.iddruh) ]],{}) db:Commit() print(string.format("Insert %d rows in %ds", n, os.difftime(os.time(), t))) end function CreateCenik() print("Create new "..IDDruh) local t = os.time() db:Execute(string.format([[update or insert into rozpocty_cdruh (IDDruh, Typ) values ('%s', 'd') matching (IDDruh)]], IDDruh)) local n=db:ExecuteParams([[insert into rozpocty_cenik select * from v_rozpocty_cenik]],{}) db:Commit() print(string.format("Insert %d rows in %ds", n, os.difftime(os.time(), t))) end CloneCenik() assert(load("Import_"..CenikName.."()"))() if tonumber(PrefixNum) == 0 then CreateCenik() else UpdateCenik() end db:Disconnect() ===== 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