// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // ! This script is provided "as is" by Applied Maths. ! // ! You are free to use and modify this script for your own needs. ! // ! Redistribution or reproduction of the script is prohibited. ! // ! DISCLAIMER: ! // ! Improper use of scripts may corrupt your database. ! // ! Running this script is entirely at your own responsibility. ! // ! Applied Maths accepts no lialibility for any consequences ! // ! resulting from its use. ! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! string filelist,st1,st2,filename,error,ID,gelfilename; string expername,experclass,key,lanekey[]; XMLNODE docnode,rootnode,node1,node2,tmpnode; integer i,j,x,found,expernr,change,lanecount,tl; integer autoaddfields,autoaddexpers,overwriteexpers,autoaddentries,overwriteentries,overwritefprintfiles; DIALOG dlg; INDEX currentfprintfiles; autoaddfields=1; autoaddexpers=1; autoaddentries=1; overwriteentries=1; overwritefprintfiles=1; //build index of known fingerprint files for i=1 to DbGetFileCount do { expername=DbGetFileExper(i); if expername<>"" then { expernr=DbGetExperNr(expername); if expernr>0 then if DbGetExperClass(expernr)="FPR" then IdxSet(currentfprintfiles,DbGetFileName(i),1); } } filelist="*.xml"; if not(FilePromptName("Select the XML file(s) you want to import",filelist,1)) then stop; //prompts for settings DlgReset(dlg); DlgAddText(dlg,"Do you allow the import routine to",15,15,280,30); DlgAddCheck(dlg,"Create new fields",autoaddfields,15,60,200,15); DlgAddCheck(dlg,"Create new experiments",autoaddexpers,15,90,200,15); DlgAddCheck(dlg,"Overwrite experiment settings",overwriteexpers,15,120,200,15); DlgAddCheck(dlg,"Create new entries",autoaddentries,15,150,200,15); DlgAddCheck(dlg,"Overwrite existing entries",overwriteentries,15,180,200,15); DlgAddCheck(dlg,"Overwrite existing fingerprint files",overwritefprintfiles,15,210,200,15); if not(DlgShow(dlg,"XML import",330,300)) then stop; //check if DatabaseLayout is included, and read if found st1=filelist; while st1<>"" do { filename=splitstring(st1," "); if substring(filename,length(filename)-17,length(filename))="databaselayout.xml" then { setbusy("Reading database layout file..."); docnode=XMLNodeReadFile(filename,error); if error<>"" then { setbusy(""); message("Unable to read "+filename+": "+error); stop; } rootnode=XMLNodeGetChildByNr(docnode,1); for i=1 to XMLNodeGetChildCount(rootnode) do { node1=XMLNodeGetChildByNr(rootnode,i); if XMLNodeGetName(node1)="Field" then { st1=XMLNodeGetText(node1); if st1<>"" then { found=0; for j=1 to DbGetFieldCount do if st1=DbGetFieldName(j) then found=j; if not(found) and autoaddfields then DbAddField(st1); } } if XMLNodeGetName(node1)="Experiment" then { expername=XMLNodeGetText(XMLNodeGetChild(node1,"Name")); experclass=XMLNodeGetText(XMLNodeGetChild(node1,"Type")); expernr=DbGetExperNr(expername); if (expernr=0) and (autoaddexpers) then { DbCreateExperType(expername,experclass); expernr=DbGetExperNr(expername); DbSetExperSettings(expernr,XMLNodeGetChild(node1,"Settings")); } if (expernr>0) and (overwriteexpers) then { if experclass<>DbGetExperClass(expernr) then { setbusy(""); message("Error: Inconsistent experiment classes for '"+expername+"'"); stop; } DbSetExperSettings(expernr,XMLNodeGetChild(node1,"Settings")); } } } XMLNodeCloseDocument(docnode); setbusy(""); } } //Read all DatabaseEntries files st1=filelist;tl=0; while st1<>"" do { filename=splitstring(st1," "); if (find(filename,"databaseentries_",1)>0) then { setbusy("Reading database entries file "+filename+"..."); docnode=XMLNodeReadFile(filename,error); if error<>"" then { setbusy(""); message("Error reading "+filename+" : "+error); stop; } rootnode=XMLNodeGetChildByNr(docnode,1); for i=1 to XMLNodeGetChildCount(rootnode) do { node1=XMLNodeGetChildByNr(rootnode,i); if XMLNodeGetName(node1)="Entry" then { tl=tl+1; setbusy("Reading database entries file -- "+str(tl,0,0)+" ..."); key=XMLNodeGetText(XMLNodeGetChild(node1,"Key")); if key<>"" then { change=overwriteentries; if not(DbIsKeyPresent(key)) and autoaddentries then { change=1;DbAddEntry(key); } if change then { XMLImpEntry(key,XMLNodeGetChild(node1,"Fields")); for j=1 to XMLNodeGetChildCount(node1) do { node2=XMLNodeGetChildByNr(node1,j); experclass=XMLNodeGetName(node2); if experclass="CHR" then { expername=XMLNodeGetText(XMLNodeGetChild(node2,"Experiment")); expernr=DbGetExperNr(expername); if expernr>0 then { if DbGetExperclass(expernr)<>experclass then { setbusy(""); message("ERROR: inconsistent experiment class for '"+expername+"'"); stop; } ID=DbGetEntryLink(key,expername); if ID<>"" then DbDelExper(ID); XMLImpCharSet(key,node2); } } if experclass="SEQ" then { expername=XMLNodeGetText(XMLNodeGetChild(node2,"Experiment")); expernr=DbGetExperNr(expername); if expernr>0 then { if DbGetExperclass(expernr)<>experclass then { setbusy(""); message("ERROR: inconsistent experiment class for '"+expername+"'"); stop; } ID=DbGetEntryLink(key,expername); if ID<>"" then DbDelExper(ID); XMLImpSequence(key,node2); } } } } } } } XMLNodeCloseDocument(docnode); setbusy(""); } } //read remaining files... st1=filelist; while st1<>"" do { filename=splitstring(st1," "); if (substring(filename,length(filename)-17,length(filename))<>"databaselayout.xml") and (find(filename,"databaseentries_",1)=0) then { docnode=XMLNodeReadFile(filename,error); if error<>"" then { message("Error reading "+filename+" : "+error); stop; } setbusy("Reading "+filename+" ..."); rootnode=XMLNodeGetChildByNr(docnode,1); gelfilename=XMLNodeGetText(XMLNodeGetChild(rootnode,"Name")); if (IdxGet(currentfprintfiles,gelfilename)<1) or overwritefprintfiles then { node1=XMLNodeGetChild(rootnode,"Lanes"); lanecount=0; for i=1 to XMLNodeGetChildCount(node1) do { lanecount=lanecount+1; key=XMLNodeGetText(XMLNodeGetChildByNr(node1,i)); if key="-" then key=""; if not(DbIsKeyPresent(key)) then { if autoaddentries then DbAddEntry(key); else key=""; } else { if not(overwriteentries) then key=""; } lanekey[lanecount]=key; } node1=XMLNodeGetChild(rootnode,"FprintData"); XMLImpFprintFile(gelfilename,node1); for i=1 to lanecount do if lanekey[i]<>"" then { node2=XMLNodeGetChildByNr(XMLNodeGetChild(node1,"Lanes"),i); expername=XMLNodeGetText(XMLNodeGetChild(node2,"Experiment")); key=lanekey[i]; if (key<>"") and (expername<>"") then { if not(DbIsKeyPresent(key)) then DbAddEntry(key); ID=DbGetEntryLink(key,expername); if ID<>"" then DbDelExper(ID); ID="DBS "+expername+" "+gelfilename+" "+str(i,0,0); DbSetExperLink(ID,key); } } } XMLNodeCloseDocument(docnode); } } setbusy("Saving database fields..."); DbSaveFields; setbusy("");