localsqlite3=require("lsqlite3complete")localhelpers=dofile("/home/minetest/maplib/helpers.lua")if#arg==0thenprint("Usage: export.lua maplog.txt master.sqlite backup.sqlite")print("Export all changed mapblocks from master database to backup database")os.exit(1)endlocalmaplog_path=assert(arg[1])localsource_path=assert(arg[2])localtarget_path=assert(arg[3])--------------------------------------------------------localfile=assert(io.open(maplog_path),"Cannot open changelog for reading.")localold_sql=sqlite3.open(source_path,sqlite3.OPEN_READONLY)ifnotold_sqlthenlog_error("Cannot open master database for reading.")endlocalnew_sql=sqlite3.open(target_path)ifnotnew_sqlthenlog_error("Cannot open backup database for writing.")endfor_innew_sql:rows("SELECT * FROM sqlite_master WHERE name = 'blocks' and type = 'table'")doerror("Cannot overwrite backup database.")endifnew_sql:exec("CREATE TABLE blocks (pos INTEGER PRIMARY KEY, data BLOB)")~=sqlite3.OKthenerror("Cannot create backup database.")endlocalinsert=new_sql:prepare("INSERT INTO blocks VALUES (?, ?)")localselect=old_sql:prepare("SELECT data FROM blocks WHERE pos = ?")localstored_count=0locallogged_count=0locallogged_total=0locallogged_blocks={}--------------------------------------------------------forlineinfile:lines()dolocalx,y,z=string.match(line,"Mapblock %((.-),(.-),(.-)%)")localpos={x=x+0,y=y+0,z=z+0}localindex=helpers.encode_pos(pos)localversion=logged_blocks[index]or0ifversion==0thenlogged_count=logged_count+1endlogged_blocks[index]=version+1logged_total=logged_total+1endfile:close()print(string.format("Found %d mapblocks (%d total changes).",logged_count,logged_total))--------------------------------------------------------new_sql:exec("BEGIN")fork,vinpairs(logged_blocks)doselect:reset()select:bind_values(k)ifselect:step()~=sqlite3.ROWthenerror("Failed to read mapblock.")endlocalblob=select:get_value(0)insert:reset()insert:bind_values(k,blob)ifinsert:step()~=sqlite3.DONEthenerror("Failed to write mapblock.")endstored_count=stored_count+1endnew_sql:exec("END")new_sql:close()old_sql:close()print(string.format("Successfully exported %d mapblocks.",stored_count))
localsqlite3=require("lsqlite3complete")localhelpers=dofile("/home/minetest/maplib/helpers.lua")if#arg==0thenprint("Usage: import.lua master.sqlite backup.sqlite")print("Import all mapblocks from backup database into master database")os.exit(1)endlocaltarget_path=assert(arg[1])localsource_path=assert(arg[2])--------------------------------------------------------localold_sql=sqlite3.open(source_path,sqlite3.OPEN_READONLY)ifnotold_sqlthenlog_error("Cannot open backup database for reading.")endlocalnew_sql=sqlite3.open(target_path)ifnotnew_sqlthenlog_error("Cannot open master database for writing.")endlocalinsert=new_sql:prepare("INSERT OR REPLACE INTO blocks VALUES (?, ?)")localstored_count=0--------------------------------------------------------new_sql:exec("BEGIN")forindex,blobinold_sql:urows("SELECT pos, data FROM blocks")doinsert:reset()insert:bind_values(index,blob)ifinsert:step()~=sqlite3.DONEthenerror("Failed to write mapblock.")endlocalpos=helpers.decode_pos(index)print(string.format("Imported mapblock (%d,%d,%d) of %d bytes.",pos.x,pos.y,pos.z,#blob))stored_count=stored_count+1endnew_sql:exec("END")new_sql:close()old_sql:close()--------------------------------------------------------print(string.format("Successfully imported %d mapblocks.",stored_count))
Comments (0)
HTTPSSSH
You can clone a snippet to your computer for local editing.
Learn more.