Thread Tools Display Modes
Prev Previous Post   Next Post Next
02-29-12, 11:23 AM   #1
Talyrius
An Onyxian Warder
 
Talyrius's Avatar
AddOn Author - Click to view addons
Join Date: Oct 2008
Posts: 363
Traversing Nested Tables

I really don't know where to start in trying to explain this...

I'm writing a module for my UI to help assist me in exporting my saved variables for the various addons I use in my private compilation. I plan to include this data in my UI and overwrite the addons' default saved variables upon installation.

However, some of the addons' saved variables house information that I don't want included. I could copy the data I want manually, but I'm looking for a more automated solution.

As you'll see in my code below, I have a table populated with the names of the addons and their corresponding global variable names. For addons where I don't want to copy everything, I've listed specific table branching to the data I do want.

TL;DR:
I can't wrap my head around how to traverse nested tables while also keeping track of the current path in relation to the global variable that it needs to be copied from. I hope this makes sense to someone.

lua Code:
  1. local addonName, ns = ...
  2.  
  3. --[[--------------------------------------------------------------------------------------------------------------------
  4.     Note to self:
  5.     These need to be looked over manually before import.
  6.    
  7.         Altoholic
  8.         GatherMate2
  9.         Prat-3.0
  10.         SorhaQuestLog
  11.         Squire2
  12.         Vendorizer
  13. --]]--------------------------------------------------------------------------------------------------------------------
  14.  
  15. ns.TalyriusUI.SavedVariables = {
  16.     ["_NPCScan.Overlay"] = {
  17.         "_NPCScanOverlayOptions",
  18.     },
  19.     ["AddonLoader"] = {
  20.         "AddonLoaderSV",
  21.     },
  22.     ["AdiBags"] = {
  23.         "AdiBagsDB",
  24.     },
  25.     ["Altoholic"] = {
  26.         ["AltoholicDB"] = {
  27.             ["global"] = {
  28.                 ["options"] = {
  29.                     "ShowMinimap",
  30.                 },
  31.             },
  32.         },
  33.     },
  34.     ["Ara_Broker_Guild_Friends"] = {
  35.         "AraBrokerGuildFriendsDB",
  36.     },
  37.     ["AtlasLoot_Loader"] = {
  38.         "AtlasLootLoaderDB",
  39.     },
  40.     ["AuctionLite"] = {
  41.         "AuctionLiteDB",
  42.     },
  43.     ["Bartender4"] = {
  44.         "Bartender4DB",
  45.     },
  46.     ["Bazooka"] = {
  47.         "BazookaDB",
  48.     },
  49.     ["BigWigs"] = {
  50.         "BigWigs3DB",
  51.         "BigWigs3IconDB",
  52.     },
  53.     ["BugSack"] = {
  54.         "BugSackDB",
  55.         "BugSackLDBIconDB",
  56.     },
  57.     ["Cascade"] = {
  58.         "CascadeDB",
  59.     },
  60.     ["Fizzle"] = {
  61.         "FizzleDB",
  62.     },
  63.     ["FocusInterruptSounds"] = {
  64.         "FocusInterruptSoundsDB",
  65.     },
  66.     ["GatherMate2"] = {
  67.         "GatherMate2DB",
  68.     },
  69.     ["GladiatorlosSA"] = {
  70.         "GladiatorlosSADB",
  71.     },
  72.     ["GoblinVendorFilter"] = {
  73.         "GoblinVendorFilterDB",
  74.     },
  75.     ["InFlight"] = {
  76.         "InFlightDB",
  77.     },
  78.     ["InlineAura"] = {
  79.         "InlineAuraDB",
  80.     },
  81.     ["Mapster"] = {
  82.         "MapsterDB",
  83.     },
  84.     ["MikScrollingBattleText"] = {
  85.         "MSBTProfiles_SavedVars",
  86.     },
  87.     ["Omen"] = {
  88.         "Omen3DB",
  89.     },
  90.     ["OmniCC"] = {
  91.         "OmniCC4Config",
  92.     },
  93.     ["Prat-3.0"] = {
  94.         "Prat3DB",
  95.     },
  96.     ["RealIDToons"] = {
  97.         "RID_TOONS_FORMAT",
  98.         "RID_TOONS_LOCALFORMAT",
  99.         "RID_TOONS_HIDE_IC",
  100.     },
  101.     ["Skinner"] = {
  102.         "SkinnerDB",
  103.     },
  104.     ["SorhaQuestLog"] = {
  105.         ["SorhaQuestLogDB"] = {
  106.             ["profiles"] = {
  107.                 "Default",
  108.             },
  109.         },
  110.     },
  111.     ["Squire2"] = {
  112.         ["Squire2DB"] = {
  113.             ["profiles"] = {
  114.                 "Default",
  115.             },
  116.         },
  117.     },
  118.     ["teksLoot"] = {
  119.         "teksLootDB",
  120.     },
  121.     ["TinyDPS"] = {
  122.         "tdps",
  123.         "tdpsPosition",
  124.         "tdpsFont",
  125.         "tdpsNumberOfFights",
  126.         "tdpsF",
  127.         "tdpsV",
  128.         "tdpsTextOffset",
  129.         "tdpsColorAlpha",
  130.         "tdpsVisibleBars",
  131.         "tdpsReportLength",
  132.     },
  133.     ["TipTac"] = {
  134.         "TipTac_Config",
  135.     },
  136.     ["Vendorizer"] = {
  137.         ["VendorizerCharSavedState"] = {
  138.             "autoRepair",
  139.         },
  140.     },
  141.     ["WakeSpams"] = {
  142.         "WakeSpamsDB",
  143.     },
  144.     ["XPBarNone"] = {
  145.         "XPBarNoneDB",
  146.     },
  147.     ["YssDrop"] = {
  148.         "YssDrop_DB",
  149.     },
  150. }
  151.  
  152. function ns.recursiveCopy(src, dst)
  153.     if type(src) ~= "table" then
  154.         return {}
  155.     end
  156.    
  157.     if type(dst) ~= "table" then
  158.         dst = {}
  159.     end
  160.    
  161.     for k, v in pairs(src) do
  162.         if type(v) == "table" then
  163.             dst[k] = ns.recursiveCopy(v, dst[k])
  164.         elseif type(v) ~= type(dst[k]) then
  165.             dst[k] = v
  166.         end
  167.     end
  168.    
  169.     for k, v in pairs(dst) do
  170.         if not src[k] then
  171.             dst[k] = nil
  172.         end
  173.     end
  174.    
  175.     return dst
  176. end
  177.  
  178. function ns.recursiveWipe(tbl, key)
  179.     if type(tbl) ~= "table" then
  180.         return
  181.     end
  182.    
  183.     for k, v in pairs(tbl) do
  184.         if type(v) == "table" then
  185.             recursiveWipe(v, key)
  186.         end
  187.        
  188.         if k == key then
  189.             wipe(tbl[k])
  190.         end
  191.     end
  192. end
  193.  
  194. -- This is global intentionally.
  195. function DumpSV(addon)
  196.     wipe(TalyriusUI_DumpSV)
  197.     local SV
  198.    
  199.     if addon ~= nil then
  200.         SV = {}
  201.         local valid
  202.        
  203.         for k, v in pairs(ns.TalyriusUI.SavedVariables) do
  204.             if k == addon then
  205.                 SV[k] = v
  206.                 valid = true
  207.             end
  208.         end
  209.        
  210.         if not valid then
  211.             ns.Print("DumpSV() |cFFFF0000"..FAILED.."|r")
  212.             print("    \""..addon.."\" isn't valid.")
  213.            
  214.             return
  215.         end
  216.     else
  217.         SV = ns.TalyriusUI.SavedVariables
  218.     end
  219.    
  220.     local t = {}
  221.     for k, v in pairs(SV) do
  222.         _, _, _, enabled, _, reason, _ = GetAddOnInfo(k)
  223.        
  224.         if not enabled then
  225.             tinsert(t, {[k] = reason})
  226.         end
  227.     end
  228.  
  229.     if #t > 0 then
  230.         ns.Print("DumpSV() |cFFFF0000"..FAILED.."|r")
  231.        
  232.         for i = 1, #t do
  233.             for k, v in pairs(t[i]) do
  234.                 print("    "..k..": "..v)
  235.             end
  236.         end
  237.        
  238.         return
  239.     end
  240.    
  241.     ns.Print("DumpSV() |cFF00FF00"..COMPLETE.."|r")
  242.     wipe(t)
  243.    
  244.     for k, v in pairs(SV) do
  245.         t[k] = {}
  246.        
  247.         if #SV[k] > 0 then
  248.             for i = 1, #SV[k] do
  249.                 t[k][SV[k][i]] = _G[SV[k][i]]
  250.                
  251.                 if _G[SV[k][i]] == nil then
  252.                     print("    |cFFFFA500Warning|r: "..SV[k][i].." was nil.")
  253.                 end
  254.             end
  255.         end
  256.     end
  257.    
  258.     -- Cleanup and dump the table into a global
  259.     ns.recursiveWipe(t, "profileKeys")
  260.     ns.recursiveCopy(t, TalyriusUI_DumpSV)
  261. end
  Reply With Quote
 

WoWInterface » Developer Discussions » Lua/XML Help » Traversing Nested Tables


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off