Uživatelské nástroje

Nástroje pro tento web


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ů