Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- print("Starting remote database")
- print("Loading database to memory... Please wait")
- local db = {}
- local function reloadFile()
- if fs.exists("/.db") then
- local handler = fs.open("/.db","r")
- db = textutils.unserialise(handler.readAll())
- handler.close()
- print("Done loading")
- else
- print("Database file non existent. Creating...")
- local handler = fs.open("/.db","w")
- handler.write(textutils.serialise({
- rdb = "1",
- rdbid = tostring(math.random(1,9999999)),
- keys = {}}))
- handler.close()
- error()
- end
- end
- reloadFile()
- print("Database version: " .. db.rdb)
- local function checkKey(key)
- if db.keys[key] then
- return true
- else
- return false
- end
- end
- local function initialiseKey(key)
- if checkKey(key) then
- return false
- else
- db.keys[key] = {}
- return true
- end
- end
- local function checkBit(key,bit)
- if checkKey(key) then
- if db.keys[key][bit] then
- return true
- else
- return false
- end
- else
- return false
- end
- end
- local function readBit(key,bit)
- if checkBit(key,bit) then
- return true, db.keys[key][bit]
- else
- return false
- end
- end
- local function setBit(key,bit,value)
- if not checkKey(key) then
- initialiseKey(key)
- end
- if checkBit(key,bit) then
- db.keys[key][bit] = value
- else
- db.keys[key][bit] = value
- end
- end
- local function autosave()
- while true do
- sleep(10)
- local handler = fs.open("/.db","w")
- handler.write(textutils.serialise(db))
- handler.close()
- end
- end
- print("Server ID: " .. db.rdbid)
- local function server()
- print("Booting server up")
- local modems = {peripheral.find("modem")}
- for k,v in pairs(modems) do
- v.open(410)
- end
- while true do
- local v = {os.pullEvent("modem_message")}
- if v[3] == 410 and v[4] == 410 then
- if v[5].serverId == db.rdbid then
- print("Server id: " .. db.rdbid)
- local response = {}
- response.messageid = v[5].messageId
- response.content = {}
- if v[5].type == "exists-key" then
- response.content = checkKey(v[5].content)
- elseif v[5].type == "exists-bit" then
- response.content = checkBit(v[5].content.key,v[5].content.bit)
- elseif v[5].type == "get" then
- local exists, value = readBit(v[5].content.key,v[5].content.bit)
- response.content.exists = exists
- response.content.value = value or false
- elseif v[5].type == "set" then
- setBit(v[5].content.key,v[5].content.bit,v[5].content.value)
- response.content = true
- else
- print("Unrecognised type. Do the versions match?")
- end
- local modems = {peripheral.find("modem")}
- for k,v in pairs(modems) do
- v.transmit(410,410,response)
- end
- else
- print("Got request, however it was ignored because it wasnt targeted to me")
- end
- end
- end
- end
- parallel.waitForAny(server,autosave)
Advertisement
Add Comment
Please, Sign In to add comment