View difference between Paste ID: DTRXxLC1 and vLrTLp6v
SHOW: | | - or go back to the newest paste.
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
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)