Autosaving Tables

Started by KingofGamesYami, Aug 13, 2018, 02:31 am

Previous topic - Next topic

KingofGamesYami

Reposted from here

If you have ever tried to write a script that saves a lot of things, say a bank server, you've had to repeatedly save tables whenever they are modified. I have the solution! After a day or two of tinkering around with metatables & serializing, I've created a method that makes a table save every time it is edited. I got the idea from locked tables, where people where using __newindex to detect when it was being modified, and prevent it. Here I've modified that method to additionally save the table after modification.
pastebin get h0eW3iEA

How to use
Simple: Paste the code into the top of your program and write this:
Code Select
makeAutoSaving( YOUR_TABLE, FILE_NAME )
Alternatively, you can use it as a seperate file and load it as an api, in which case you can use this
Code Select
api.makeAutoSaving( YOUR_TABLE, FILE_NAME )
Also, this method DOES prevent the use of pairs and ipairs, and the # operator is broken. I tried adding __len, but it doesn't want to work (although, that could be the emulator). Because of this, I modify the metatable in such a way that doing
Code Select
getmetatable( t ).origin
will get you the actual table, however setting variables to this table bypasses my code entirely. It is mainly there to get the length of, although you can iterate through it if necessary. Here's an example of good iteration:
Code Select
for k, v in pairs( getmetatable( t ).origin ) do
  if v == "some random thingy" then
    t[ k ] = "r" --#modify the variable holding the modified table
  end
end

As always, constructive criticism is appreciated.
Edit: Fixed bug with restoring previous tables!
I'm a ComputerCraft veteran with over 3k posts on the old ComputerCraft Forum.  I'm mostly inactive in CC having moved on to bigger, more interesting projects but still contribute to the community.