Rahph

remotedb-server

Aug 4th, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 tostring(v[5].serverId) == tostring(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.              elseif v[5].type == "list-keys" then
  103.                 local keys = {}
  104.                 for k,v in pairs(db.keys) do
  105.                     table.insert(keys, k)
  106.                 end
  107.                 response.content = keys
  108.             elseif v[5].type == "list-bits" then
  109.                 local keys = {}
  110.                 for k,v in pairs(db.keys[v[5].content]) do
  111.                     table.insert(keys, k)
  112.                 end
  113.                 response.content = keys
  114.             elseif v[5].type == "stop" then
  115.                 print("Saving...")
  116.                 print("To stop, hold CTRL+T anyway")
  117.                 local handler = fs.open("/.db","w")
  118.                 handler.write(textutils.serialise(db))
  119.                 handler.close()
  120.              else
  121.                  print("Unrecognised type. Do the versions match?")
  122.              end
  123.              local modems = {peripheral.find("modem")}
  124.              for k,v in pairs(modems) do
  125.                  v.transmit(410,410,response)
  126.              end
  127.          else
  128.           print("Got request, however it was ignored because it wasnt targeted to me")
  129.          end
  130.         end
  131.     end
  132. end
  133. parallel.waitForAny(server,autosave)
Add Comment
Please, Sign In to add comment