#!/usr/bin/lua
--
--  rhnop
--
--  Copyright (C) 2011 Christian Pointner <equinox@helsinki.at>
--
--  This file is part of rhnop.
--
--  rhnop is free software: you can redistribute it and/or modify
--  it under the terms of the GNU General Public License as published by
--  the Free Software Foundation, either version 3 of the License, or
--  any later version.
--
--  rhnop is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with rhnop. If not, see <http://www.gnu.org/licenses/>.
--
--
--  send now and next cart# and length to nopsyncd
--  this script should be called by the now/next macro cart
--  the arguments should be:  now# nowlen next# nextlen
--

require "socket"

package.path = package.path .. ";_rhnoplibdir_/?.lua"
db = require "db"

if #arg < 1 then
   io.stderr:write("too few parameters\n")
   os.exit(1)
end

conffile = "nopcollectd." .. arg[1] .. ".conf"
conf = require "conf"

src_db = assert(db.init(conf.src_db, conf.src_user, conf.src_pwd, conf.src_host, conf.src_port, conf.src_table))
dst_db = assert(db.init(conf.dst_db, conf.dst_user, conf.dst_pwd, conf.dst_host, conf.dst_port, conf.dst_table))

local sock = assert(socket.tcp())
local ret, err = sock:connect(conf.sync_host, conf.sync_port)
if ret == nil then
   print(err)
   return 1
end
print "connection established"

local last = dst_db:getLastEntry()
print("last timestamp was " .. last)
local cur = assert(src_db:findMissingEntries(last))
local cnt = 0
while true do
   local data = src_db:getNextMissingEntry(cur)
   if data == nil then break end
   local ret, err = dst_db:addEntry(data)
   if ret == nil then print(err) end
   cnt = cnt + 1
end

print("synced " .. cnt .. " Entries")

while true do
   local timestamp = sock:receive('*l')
   if timestamp == nil then break end
   data = assert(src_db:getEntry(timestamp))
   assert(dst_db:addEntry(data))
end

sock:close()

return 0