Export a Import
Z Moriawiki
Prozatímní verze
Tato stranka zatim neni moc urcena pro cteni, zatim si sem spis pisu navrh funkcionality, az to pak naprogramuju tak to popisu podrobnejc :)
Export
Export je v podstate to samy co save, akoratze se savuje jen vybrana mnozina objektu.
Je treba si uvedomit co vsechno se savuje nebo nesavuje kdyz zadam aby se ulozil jen jeden objekt... Reference na Thingy, GameAccounty a ThingDefy se ulozej jen jako odkazy, zatimco reference na jiny objekty (takovy ktery maj asociovanej ISaveImplementor) se ulozej jako odkazy A ZAROVEN se pak ulozi i ten odkazovanej objekt (pres ObjSaver.FlushCache)
Export ma v zasade 2 faze:
1) Urceni mnoziny objektu ktere se maji savovat. Toto dela clovek kterej zadava export, a nebo je to nejakym zpusobem zadefinovany ve funkci kterou ten clovek pusti, typicky je to funkce v C# skriptech.
2) Pusteni funkce ExportImport.Export() ktera vytvori soubor, necha exportovane objekty at se do nej zapisou, nakonec pripise [EOF] a hotovo.
Kazdopadne je to bezpecna protoze se pri ni nijak nemeni svet.
Import
Import je opet podobnej Loadu, ale lisi se v tom ze narozdil od Loadu samotnyho se odehrava za behu. Jinymi slovy pred nim i po nem musi bejt svet ve validnim stavu, a proto je to operace potencionalne nebezpecna, a v pripade ze se narazi na chybu a import uz pokrocil do faze kdy nelze vratit, tak se shazuje bezici server!
Import ma nekolik fazi: 1) vyber souboru kterej se ma importovat, opet bud je to jmeno nekde zahardcodovany v C# skriptu nebo ho uzivatel zada rucne.
2) Spusteni ExportImport.Import(). V pripade ze je to nastaveno v .ini, uklada se svet. Importovanej soubor rozparsuje na PropsSection instance, a vytvori se kolekce ImportHelper objektu na ktery se povesi prave tyto PropsSection instance. Tato faze je kazdopadne bezpecna.
3) Kolekce techto instanci se pak predhazuje Importable tridam do jejich staticky metody oznaceny [ImportAssign] atributem (a taky ObjSaver tride kvuli pridruzenym ISaveImplementor objektum). Ukolem teto jejich metody je priradit k tem ImportHelperum vlastni instance, a to podle zakladnich identifikacnich udaju nactenych z PropsSection instanci. Tyto prirazene objekty budou bud jiz dosud existujici (pokud se jejich identifikacni udaje budou shodovat s temi importovanymi) a nebo nove, v pripade ze se shodovat nebudou. Tyto nove objekty ale zatim nesmi bejt nijak zarazeny do zadnych statickych seznamu atd. Tato faze je taky bezpecna, protoze se tu zadny dosud existujici struktury ani jednotlivy instance nemeni.
4) Kontroluje se, jestli vsechny ImportHelpery maj prirazenou instanci. Pokud se zjisti ze ne, je to chyba, import se rusi, a nenastala zadna skoda. ImportHelpery zanikaji, a nimi by mely zaniknout i ty prirazene instance ktere se tvorily nove (proto veta o tom ze se nesmi prirazovat do existujicich seznamu). V pripade novych instanci se odpovidajicim zpusobem zmeni identifikace objektu na ImportHelper instancich. Toto je jen kontrolni faze a tudiz bezpecna.
5) Na instancich se vola metoda Import (resp. se provadi kompletni load objektu pres ObjSaver). Tady se v podstate spousti stejna procedura jako pri loadu, pouze je treba brat zretel na spravne prirazene identifikacni objekty. Zde uz se taky meni dosud existujici objekty, a proto jakakoli chyba znamena ze je okamzite nucene shozen server a predpoklada se ze bude znova spusten na zaloze ktera byla provedena pred importem. To same plati pro nasledujici faze.
6) Pousti se delayed metody, tj. DelayedResolver.ResolveAll() a ObjectSaver.LoadingFinished(). Tim jsou nahrane instance kompletni. Chyba = ukonceni serveru, jak bylo receno vyse.
7) Na Importable tridach se pousti staticka metoda oznacena atributem [ImportingFinishedMethod]. Tady se ocekava ze provedou svoje zakoncovaci operace, jako zarazovani instanci do seznamu (pokud uz tam nejsou), atd. Chyba = ukonceni serveru, jak bylo receno vyse.