Guest User

server.lua

a guest
Aug 4th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.22 KB | None | 0 0
  1. print("Starting remote database")
  2. print("Loading database to memory... Please wait")
  3. local db = {}
  4. local function reloadFile()
  5. if fs.exists("/.db") then
  6.     local handler = fs.open("/.db","r")
  7.     db = textutils.unserialise(handler.readAll())
  8.     handler.close()
  9.     print("Done loading")
  10. else
  11.     print("Database file non existent. Creating...")
  12.     local handler = fs.open("/.db","w")
  13.     handler.write(textutils.serialise({
  14.     rdb = "1",
  15.     rdbid = tostring(math.random(1,9999999)),
  16.     keys = {}}))
  17.     handler.close()
  18.     error()
  19. end
  20. end
  21. reloadFile()
  22.  
  23. print("Database version: " .. db.rdb)
  24. local function checkKey(key)
  25.     if db.keys[key] then
  26.         return true
  27.     else
  28.         return false
  29.     end
  30. end
  31. local function initialiseKey(key)
  32.     if checkKey(key) then
  33.         return false
  34.     else
  35.         db.keys[key] = {}
  36.         return true
  37.     end
  38. end
  39. local function checkBit(key,bit)
  40.     if checkKey(key) then
  41.         if db.keys[key][bit] then
  42.             return true
  43.         else
  44.             return false
  45.         end
  46.     else
  47.         return false
  48.     end
  49. end
  50. local function readBit(key,bit)
  51.     if checkBit(key,bit) then
  52.         return true, db.keys[key][bit]
  53.     else
  54.         return false
  55.     end
  56. end
  57. local function setBit(key,bit,value)
  58.     if not checkKey(key) then
  59.         initialiseKey(key)
  60.     end
  61.     if checkBit(key,bit) then
  62.         db.keys[key][bit] = value
  63.     else
  64.         db.keys[key][bit] = value
  65.     end
  66. end
  67.  
  68. local function autosave()
  69. while true do
  70.     sleep(10)
  71.     local handler = fs.open("/.db","w")
  72.     handler.write(textutils.serialise(db))
  73.     handler.close()
  74. end
  75. end
  76. print("Server ID: " .. db.rdbid)
  77. local function server()
  78.     print("Booting server up")
  79.     local modems = {peripheral.find("modem")}
  80.     for k,v in pairs(modems) do
  81.         v.open(410)
  82.     end
  83.     while true do
  84.         local v = {os.pullEvent("modem_message")}
  85.         if v[3] == 410 and v[4] == 410 then
  86.          if v[5].serverId == db.rdbid then
  87.              print("Server id: " .. db.rdbid)
  88.              local response = {}
  89.              response.messageid = v[5].messageId
  90.              response.content = {}
  91.              if v[5].type == "exists-key" then
  92.                  response.content = checkKey(v[5].content)
  93.              elseif v[5].type == "exists-bit" then
  94.                  response.content = checkBit(v[5].content.key,v[5].content.bit)
  95.              elseif v[5].type == "get" then
  96.                  local exists, value = readBit(v[5].content.key,v[5].content.bit)
  97.                  response.content.exists = exists
  98.                  response.content.value = value or false
  99.              elseif v[5].type == "set" then
  100.                  setBit(v[5].content.key,v[5].content.bit,v[5].content.value)
  101.                  response.content = true
  102.              else
  103.                  print("Unrecognised type. Do the versions match?")
  104.              end
  105.              local modems = {peripheral.find("modem")}
  106.              for k,v in pairs(modems) do
  107.                  v.transmit(410,410,response)
  108.              end
  109.          else
  110.           print("Got request, however it was ignored because it wasnt targeted to me")
  111.          end
  112.         end
  113.     end
  114. end
  115. parallel.waitForAny(server,autosave)
Advertisement
Add Comment
Please, Sign In to add comment