Skip to content

Commit 1823690

Browse files
authored
Store teleport tube DB in mod storage (#40)
* Store teleport tube DB in mod storage * Prevent overwriting of tube DB backup file * Remove backup code * Slightly improve storage reading code * Log DB migration to mod storage * Add migration note in README * Improve pipeworks.logger
1 parent 7589435 commit 1823690

File tree

3 files changed

+64
-30
lines changed

3 files changed

+64
-30
lines changed

README

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ This mod is a work in progress.
2020

2121
Please note that owing to the nature of this mod, I have opted to use 64px
2222
textures. Anything less just looks terrible.
23+
24+
The teleport tube database used to kept in a file named 'teleport_tubes'.
25+
The database is now kept in mod storage. The migration from 'teleport_tubes' is
26+
automatic. The old file is then kept around but is not used at all.

init.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ function pipeworks.replace_name(tbl,tr,name)
128128
end
129129

130130
pipeworks.logger = function(msg)
131-
print("[pipeworks] "..msg)
131+
minetest.log("action", "[pipeworks] "..msg)
132132
end
133133

134134
-------------------------------------------

teleport_tube.lua

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
local S = minetest.get_translator("pipeworks")
2-
local filename=minetest.get_worldpath() .. "/teleport_tubes"
2+
local filename=minetest.get_worldpath() .. "/teleport_tubes" -- Only used for backward-compat
3+
local storage=minetest.get_mod_storage()
34

45
local tp_tube_db = nil -- nil forces a read
5-
local tp_tube_db_version = 2.0
6+
local tp_tube_db_version = 3.0
67

78
-- cached rceiver list: hash(pos) => {receivers}
89
local cache = {}
@@ -12,47 +13,78 @@ local function hash(pos)
1213
end
1314

1415
local function save_tube_db()
15-
local file, err = io.open(filename, "w")
16-
if file then
17-
tp_tube_db.version = tp_tube_db_version
18-
file:write(minetest.serialize(tp_tube_db))
19-
tp_tube_db.version = nil
20-
io.close(file)
21-
else
22-
error(err)
16+
-- reset tp-tube cache
17+
cache = {}
18+
19+
local fields = {version = tp_tube_db_version}
20+
for key, val in pairs(tp_tube_db) do
21+
fields[key] = minetest.serialize(val)
2322
end
23+
storage:from_table({fields = fields})
24+
end
25+
26+
local function save_tube_db_entry(hash)
2427
-- reset tp-tube cache
2528
cache = {}
29+
30+
local val = tp_tube_db[hash]
31+
storage:set_string(hash, val and minetest.serialize(val) or "")
2632
end
2733

2834
local function migrate_tube_db()
35+
local old_version = tp_tube_db.version or 0
36+
tp_tube_db.version = nil
37+
if old_version < 2.0 then
2938
local tmp_db = {}
30-
tp_tube_db.version = nil
3139
for _, val in pairs(tp_tube_db) do
3240
if(val.channel ~= "") then -- skip unconfigured tubes
3341
tmp_db[hash(val)] = val
3442
end
3543
end
3644
tp_tube_db = tmp_db
37-
save_tube_db()
45+
end
46+
save_tube_db()
3847
end
3948

4049
local function read_tube_db()
41-
local file = io.open(filename, "r")
42-
if file ~= nil then
50+
local file = not storage:contains("version") and io.open(filename, "r")
51+
if not file then
52+
tp_tube_db = {}
53+
54+
for key, val in pairs(storage:to_table().fields) do
55+
if tonumber(key) then
56+
tp_tube_db[key] = minetest.deserialize(val)
57+
elseif key == "version" then
58+
tp_tube_db.version = tonumber(val)
59+
else
60+
error("Unknown field in teleport tube DB: " .. key)
61+
end
62+
end
63+
64+
if tp_tube_db.version == nil then
65+
tp_tube_db.version = tp_tube_db_version
66+
storage:set_string("version", tp_tube_db.version)
67+
elseif tp_tube_db.version > tp_tube_db_version then
68+
error("Cannot read teleport tube DB of version " .. tp_tube_db.version)
69+
end
70+
else
4371
local file_content = file:read("*all")
4472
io.close(file)
4573

74+
pipeworks.logger("Moving teleport tube DB into mod storage from " .. filename)
75+
4676
if file_content and file_content ~= "" then
4777
tp_tube_db = minetest.deserialize(file_content)
48-
if(not tp_tube_db.version or tonumber(tp_tube_db.version) < tp_tube_db_version) then
49-
migrate_tube_db()
50-
end
51-
tp_tube_db.version = nil -- we add it back when saving
52-
return tp_tube_db -- we read sucessfully
78+
else
79+
tp_tube_db = {version = 2.0}
5380
end
5481
end
55-
tp_tube_db = {}
82+
83+
if(not tp_tube_db.version or tonumber(tp_tube_db.version) < tp_tube_db_version) then
84+
migrate_tube_db()
85+
end
86+
tp_tube_db.version = nil
87+
5688
return tp_tube_db
5789
end
5890

@@ -69,7 +101,7 @@ local function set_tube(pos, channel, can_receive)
69101
if tube then
70102
tube.channel = channel
71103
tube.cr = can_receive
72-
save_tube_db()
104+
save_tube_db_entry(hash)
73105
return
74106
end
75107

@@ -88,13 +120,14 @@ local function set_tube(pos, channel, can_receive)
88120
end
89121

90122
tp_tube_db[hash] = {x=pos.x,y=pos.y,z=pos.z,channel=channel,cr=can_receive}
91-
save_tube_db()
123+
save_tube_db_entry(hash)
92124
end
93125

94126
local function remove_tube(pos)
95127
local tubes = tp_tube_db or read_tube_db()
96-
tubes[hash(pos)] = nil
97-
save_tube_db()
128+
local hash = hash(pos)
129+
tubes[hash] = nil
130+
save_tube_db_entry(hash)
98131
end
99132

100133
local function read_node_with_vm(pos)
@@ -114,7 +147,6 @@ local function get_receivers(pos, channel)
114147

115148
local tubes = tp_tube_db or read_tube_db()
116149
local receivers = {}
117-
local dirty = false
118150
for key, val in pairs(tubes) do
119151
-- skip all non-receivers and the tube that it came from as early as possible, as this is called often
120152
if (val.cr == 1 and val.channel == channel and (val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z)) then
@@ -125,13 +157,10 @@ local function get_receivers(pos, channel)
125157
table.insert(receivers, val)
126158
else
127159
tp_tube_db[key] = nil
128-
dirty = true
160+
save_tube_db_entry(key)
129161
end
130162
end
131163
end
132-
if dirty then
133-
save_tube_db()
134-
end
135164
-- cache the result for next time
136165
cache[hash] = receivers
137166
return receivers
@@ -290,6 +319,7 @@ end
290319
pipeworks.tptube = {
291320
hash = hash,
292321
save_tube_db = save_tube_db,
322+
save_tube_db_entry = save_tube_db_entry,
293323
get_db = function() return tp_tube_db or read_tube_db() end,
294324
set_tube = set_tube,
295325
update_meta = update_meta,

0 commit comments

Comments
 (0)