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) |