File:
1.19.1b/server/bin/import.php (
View as Code)
1: 2: /* -------------------------------------------------------------
3: This file is part of FreeNATS
4:
5: FreeNATS is (C) Copyright 2008-2011 PurplePixie Systems
6:
7: FreeNATS is free software: you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation, either version 3 of the License, or
10: (at your option) any later version.
11:
12: FreeNATS is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with FreeNATS. If not, see www.gnu.org/licenses
19:
20: For more information see www.purplepixie.org/freenats
21: -------------------------------------------------------------- */
22:
23:
24: // FreeNATS Bulk Importer
25: // Usage php import.php filename.xml
26:
27: echo "FreeNATS Bulk Importer - www.purplepixie.org/freenats\n";
28:
29: if ($argc<2)
30: {
31: echo "Usage: php import.php filename.xml [--live] [--debug]\n\n";
32: exit();
33: }
34:
35:
36:
37:
38: $live=false;
39: $debug=false;
40: for ($a=1; $a<$argc; $a++)
41: {
42: if ($argv[$a]=="--live") $live=true;
43: else if ($argv[$a]=="--debug") $debug=true;
44: else $file=$argv[$a];
45: }
46:
47: echo "Importing File: ".$file." => Live Import: ";
48: if ($live) echo "Yes";
49: else echo "No";
50: echo "\n\n";
51:
52:
53: class TImportXML
54: {
55: var $Init=false;
56: var $Elements=0;
57: var $Nodes=0;
58: var $NodeList=array();
59: var $Localtests=0;
60: var $LocaltestList=array();
61:
62: var $NodeDefaults=array();
63: var $LocaltestDefaults=array();
64:
65: var $in_freenats=false;
66: var $in_node=false;
67: var $in_localtest=false;
68: var $in_nodedefault=false;
69: var $in_localtestdefault=false;
70: var $in_test=false;
71: var $depth=0;
72: var $last_element="";
73: var $cur_id="";
74:
75: function startElement($parser, $name, $attrs)
76: {
77: if ($name=="FREENATS-DATA") $this->in_freenats=true;
78: if (!$this->in_freenats) return 0;
79:
80: if ($name=="NODE")
81: {
82: $this->in_node=true;
83: $this->Nodes++;
84: $this->NodeList[$attrs['NODEID']]=$this->NodeDefaults;
85: $this->cur_id=$attrs['NODEID'];
86: }
87: else if ($name=="DEFAULT")
88: {
89: if ($attrs['TYPE']=="node")
90: {
91: echo "Node Default Section Starting\n";
92: $this->in_nodedefault=true;
93: }
94: else if ($attrs['TYPE']=="localtest")
95: {
96: echo "Localtest Default Section Starting\n";
97: $this->in_localtestdefault=true;
98: }
99: }
100: else if ($name=="LOCALTEST")
101: {
102: $this->in_localtest=true;
103: //echo "In Local Test\n";
104: $this->LocaltestList[$this->Localtests]=$this->LocaltestDefaults;
105: $this->Localtests;
106: }
107: $this->last_element=$name;
108: $this->depth++;
109: $this->Elements++;
110: }
111:
112: function endElement($parser, $name)
113: {
114: $this->depth--;
115: if ($name=="LOCALTEST")
116: {
117: //echo "Finished Localtest\n";
118: $this->in_localtest=false;
119: $this->Localtests++;
120: }
121: else if ($name=="NODE") $this->in_node=false;
122: else if ($name=="DEFAULT")
123: {
124: $this->in_nodedefault=false;
125: $this->in_localtestdefault=false;
126: echo "Default Section End\n\n";
127: }
128: else if ($name=="FREENATS-DATA") $in_freenats=false;
129: }
130:
131: function charData($parser,$data)
132: {
133: if (!$this->in_freenats) return 0;
134: $data=trim($data);
135: if ($data!="")
136: {
137: if ($this->in_node)
138: {
139: $this->NodeList[$this->cur_id][strtolower($this->last_element)]=$data;
140: echo "Node Data: ".$data."\n";
141: }
142: else if ($this->in_nodedefault)
143: {
144: echo " Default: ".strtolower($this->last_element)." => ".$data."\n";
145: $this->NodeDefaults[strtolower($this->last_element)]=$data;
146: }
147: else if ($this->in_localtestdefault)
148: {
149: echo " Default: ".strtolower($this->last_element)." => ".$data."\n";
150: $this->LocaltestDefaults[strtolower($this->last_element)]=$data;
151: }
152: else if ($this->in_localtest)
153: {
154: $test=$this->Localtests;
155: //echo "***".$data;
156: $this->LocaltestList[$test][strtolower($this->last_element)]=$data;
157: }
158: //else echo $data;
159:
160: }
161: }
162:
163: function Error()
164: {
165: return $this->LastError;
166: }
167:
168: function Parse($xml)
169: {
170: $this->Init=true;
171: if (get_magic_quotes_gpc()) $xml=stripslashes($xml);
172: $parser=xml_parser_create();
173: xml_set_element_handler($parser,Array( $this, "startElement" ),
174: Array( $this, "endElement" ) );
175: xml_set_character_data_handler($parser,Array( $this, "charData" ));
176:
177: $return=true;
178:
179: if (!xml_parse($parser,$xml,true))
180: {
181: $this->LastError="XML Error ".xml_error_string(xml_get_error_code($parser));
182: $this->LastError.=" at line ".xml_get_current_line_number($parser);
183: $return=false;
184: }
185:
186: xml_parser_free($parser);
187:
188: return true;
189: }
190:
191: function ParseFile($xmlfile)
192: {
193: $fp=fopen($xmlfile,"r")
194: or die("Could not open XML file ".$xmlfile);
195: $data="";
196: while (!feof($fp))
197: $data.=fgets($fp,4096);
198: fclose($fp);
199: return $this->Parse($data);
200: }
201:
202:
203: }
204:
205:
206: $xml=new TImportXML();
207: if ($xml->ParseFile($file)===false)
208: {
209: echo "Error Encountered!\n";
210: echo $xml->LastError;
211: echo "\n\n";
212: exit();
213: }
214:
215: echo "Nodes: ".$xml->Nodes." Local Tests: ".$xml->Localtests."\n";
216: if ($live)
217: {
218: echo "Starting FreeNATS for live import... ";
219: @include("include.php");
220: if (!isset($BaseDir)) $BaseDir="../base/";
221:
222: //require($BaseDir."nats.php"); -- BID 263
223: $NATS->Start();
224: echo "Ok\n";
225: }
226: foreach($xml->NodeList as $nodeid=>$node)
227: {
228:
229: echo "NodeID: ".$nodeid." - Parsing Properties...\n";
230: $fields="(";
231: $values="(";
232: $first=true;
233: foreach($node as $key=>$val)
234: {
235: if ($first) $first=false;
236: else
237: {
238: $fields.=",";
239: $values.=",";
240: }
241: $fields.=$key;
242: $values.="\"".$val."\"";
243: echo " ".$key." => ".$val."\n";
244: }
245: $fields.=")";
246: $values.=")";
247:
248: $q="INSERT INTO fnnode".$fields." VALUES".$values;
249: if ($debug) echo " SQL: ".$q."\n";
250:
251: if ($live)
252: { // actual import
253: $NATS->DB->Query($q);
254: if ($NATS->DB->Error())
255: {
256: echo "Failed: SQL Error: ".$NATS->DB->Error_String()."\n";
257: $xml->NodeList[$nodeid]['import_success']=false;
258: }
259: else if ($NATS->DB->Affected_Rows()<=0)
260: {
261: echo "Failed: SQL INSERT Failed: Duplicate or Blank?\n";
262: $xml->NodeList[$nodeid]['import_success']=false;
263: }
264: else
265: {
266: echo "Succeeded: SQL INSERT Success\n";
267: $xml->NodeList[$nodeid]['import_success']=true;
268: }
269: }
270: else
271: { // dummy run
272: echo " Live Import: No\n";
273: $xml->NodeList[$nodeid]['import_success']=true;
274: }
275: echo "\n";
276: }
277:
278: foreach($xml->LocaltestList as $test)
279: {
280: //print_r($test);
281: //exit();
282: echo "Test ".$test['testtype']." for ".$test['nodeid']."\n";
283: $process=false;
284: if (isset($xml->NodeList[$test['nodeid']]))
285: {
286: if ( isset($xml->NodeList[$test['nodeid']]['import_success']) && $xml->NodeList[$test['nodeid']]['import_success'] )
287: {
288: echo "Processing Test\n";
289: $process=true;
290: }
291: else
292: {
293: echo "Skipping Test: Node failed to import in this data\n";
294: }
295: }
296: else
297: {
298: echo "WARNING: Node not created in this script for this test\n";
299: $process=true;
300: }
301: if ($process)
302: {
303: $fields="(";
304: $values="(";
305: $first=true;
306: foreach($test as $key=>$val)
307: {
308: if ($first) $first=false;
309: else { $fields.=","; $values.=","; }
310: $fields.=$key;
311: $values.="\"".$val."\"";
312: echo " ".$key." => ".$val."\n";
313: }
314: $fields.=")";
315: $values.=")";
316: $q="INSERT INTO fnlocaltest".$fields." VALUES".$values;
317: if ($debug) echo " SQL: ".$q."\n";
318: if ($live)
319: { // actual import
320: $NATS->DB->Query($q);
321: if ($NATS->DB->Error())
322: {
323: echo "Failed: SQL Error: ".$NATS->DB->Error_String()."\n";
324:
325: }
326: else if ($NATS->DB->Affected_Rows()<=0)
327: {
328: echo "Failed: SQL INSERT Failed: Duplicate or Blank?\n";
329:
330: }
331: else
332: {
333: echo "Succeeded: SQL INSERT Success\n";
334:
335: }
336: }
337: }
338: echo "\n";
339: }
340:
341: if ($live) $NATS->Stop();
342: ?>