1 //////////////////////////////////////////////////////////////////////////
2 //
3 // pgAdmin III - PostgreSQL Tools
4 //
5 // Copyright (C) 2002 - 2016, The pgAdmin Development Team
6 // This software is released under the PostgreSQL Licence
7 //
8 // ddXmlStorage.cpp - Database designer class for storing / loading objects
9 //
10 //////////////////////////////////////////////////////////////////////////
11 
12 #include "pgAdmin3.h"
13 
14 
15 #include <ctl/ctlAuiNotebook.h>
16 #include <libxml/xmlwriter.h>
17 #include <libxml/xmlreader.h>
18 
19 // App headers
20 #include "dd/dditems/figures/xml/ddXmlStorage.h"
21 #include "dd/dditems/utilities/ddDataType.h"
22 #include "hotdraw/figures/hdIFigure.h"
23 #include "dd/dditems/figures/ddTableFigure.h"
24 #include "dd/dditems/figures/ddColumnFigure.h"
25 #include "dd/dditems/figures/ddRelationshipFigure.h"
26 #include "dd/dditems/figures/ddRelationshipItem.h"
27 #include "dd/dditems/figures/ddRelationshipTerminal.h"
28 #include "dd/dditems/figures/ddColumnKindIcon.h"
29 #include "dd/dditems/figures/ddColumnOptionIcon.h"
30 #include "dd/ddmodel/ddDatabaseDesign.h"
31 
32 ddDatabaseDesign *ddXmlStorage::design = NULL;
33 ctlAuiNotebook *ddXmlStorage::tabs = NULL;
34 
ddXmlStorage()35 ddXmlStorage::ddXmlStorage():
36 	hdStorage()
37 {
38 	design = NULL;
39 	tabs = NULL;
40 }
41 
42 #define XML_FROM_WXSTRING(s) ((xmlChar *)(const char *)s.mb_str(wxConvUTF8))
43 #define WXSTRING_FROM_XML(s) wxString((char *)s, wxConvUTF8)
44 
setModel(ddDatabaseDesign * sourceDesign)45 void ddXmlStorage::setModel(ddDatabaseDesign *sourceDesign)
46 {
47 	design = sourceDesign;
48 }
49 
setNotebook(ctlAuiNotebook * notebook)50 void ddXmlStorage::setNotebook(ctlAuiNotebook *notebook)
51 {
52 	tabs = notebook;
53 }
54 
StartModel(xmlTextWriterPtr writer,ddDatabaseDesign * sourceDesign)55 void ddXmlStorage::StartModel(xmlTextWriterPtr writer, ddDatabaseDesign *sourceDesign)
56 {
57 	int tmp;
58 	design = sourceDesign;
59 	//<!DOCTYPE MODEL ...pgRelationModel.dtd> but add all dtd to doc instead url
60 	wxString name = _("MODEL");
61 	wxString pubid = _("pgrm");
62 	wxString uri = _("pgrm");
63 
64 	xmlTextWriterWriteDTD(writer, XML_FROM_WXSTRING(name), NULL, NULL, XML_FROM_WXSTRING(getModelDTD()));
65 	//<!ELEMENT MODEL (TABLE+)>
66 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "MODEL");
67 	processResult(tmp);
68 
69 	//<!ELEMENT VERSION EMPTY>
70 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "VERSION");
71 	processResult(tmp);
72 	// <!ATTLIST VERSION VERIXLU CDATA #REQUIRED>
73 	wxString version = sourceDesign->getVersionXML();
74 	tmp = xmlTextWriterWriteAttribute(writer, BAD_CAST "VERIXLU", XML_FROM_WXSTRING(version) );
75 	processResult(tmp);
76 	//Close VERSION Element
77 	xmlTextWriterEndElement(writer);
78 }
79 
EndModel(xmlTextWriterPtr writer)80 void ddXmlStorage::EndModel( xmlTextWriterPtr writer)
81 {
82 	//Close MODEL Element
83 	xmlTextWriterEndElement(writer);
84 	design = NULL;
85 }
86 
Write(xmlTextWriterPtr writer,hdIFigure * figure)87 bool ddXmlStorage::Write(xmlTextWriterPtr writer, hdIFigure *figure)
88 {
89 	if(design == NULL)
90 	{
91 		wxMessageBox(_("Error saving model: not source model have been set"));
92 		return false;
93 	}
94 
95 	switch(figure->getKindId())
96 	{
97 		case DDCOLUMNOPTIONICON:
98 			WriteLocal(writer, (ddColumnOptionIcon *)figure);
99 			break;
100 		case DDCOLUMNKINDICON:
101 			WriteLocal(writer, (ddColumnKindIcon *)figure);
102 			break;
103 		case DDTEXTTABLEITEMFIGURE:
104 			WriteLocal(writer, (ddTextTableItemFigure *)figure);
105 			break;
106 		case DDCOLUMNFIGURE:
107 			WriteLocal(writer, (ddColumnFigure *)figure);
108 			break;
109 		case DDTABLEFIGURE:
110 			WriteLocal(writer, (ddTableFigure *)figure);
111 			break;
112 		case DDRELATIONSHIPFIGURE:
113 			WriteLocal(writer, (ddRelationshipFigure *)figure);
114 			break;
115 	}
116 	return true;
117 }
118 
processResult(int value)119 bool ddXmlStorage::processResult(int value)
120 {
121 	if (value < 0)
122 	{
123 		wxMessageBox(_("Fatal Error at libxml for figure persistency"));
124 		return false;
125 	}
126 	return true;
127 }
128 
WriteLocal(xmlTextWriterPtr writer,ddColumnOptionIcon * figure)129 void ddXmlStorage::WriteLocal(xmlTextWriterPtr writer, ddColumnOptionIcon *figure)
130 {
131 	int tmp;
132 
133 	//At COLUMN Element
134 	//<!ELEMENT OPTION (#PCDATA)>
135 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "OPTION", "%d", figure->getOption() );
136 	processResult(tmp);
137 }
138 
WriteLocal(xmlTextWriterPtr writer,ddColumnKindIcon * figure)139 void ddXmlStorage::WriteLocal(xmlTextWriterPtr writer, ddColumnKindIcon *figure)
140 {
141 	int tmp;
142 
143 	//At COLUMN Element
144 	//<!ELEMENT UKINDEX (#PCDATA)>
145 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "UKINDEX", "%d", figure->getUniqueConstraintIndex());
146 	processResult(tmp);
147 
148 	//<!ELEMENT ISPK (#PCDATA)>
149 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ISPK", "%c", figure->isPrimaryKey() ? 'T' : 'F' );
150 	processResult(tmp);
151 }
152 
WriteLocal(xmlTextWriterPtr writer,ddTextTableItemFigure * figure)153 void ddXmlStorage::WriteLocal( xmlTextWriterPtr writer, ddTextTableItemFigure *figure)
154 {
155 	int tmp;
156 
157 	//<!ELEMENT COLUMNTYPE (#PCDATA)>
158 	wxString ddType = figure->dataTypes()[figure->getDataType()];
159 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "COLUMNTYPE", "%s", XML_FROM_WXSTRING(ddType));
160 	processResult(tmp);
161 
162 	if(figure->getPrecision() != -1)
163 	{
164 		//<!ELEMENT PRECISION (#PCDATA)>
165 		tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PRECISION", "%d", figure->getPrecision());
166 		processResult(tmp);
167 	}
168 
169 	if(figure->getScale() != -1)
170 	{
171 		//<!ELEMENT SCALE (#PCDATA)>
172 		tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "SCALE", "%d", figure->getScale());
173 		processResult(tmp);
174 	}
175 
176 }
177 
WriteLocal(xmlTextWriterPtr writer,ddColumnFigure * figure)178 void ddXmlStorage::WriteLocal( xmlTextWriterPtr writer, ddColumnFigure *figure)
179 {
180 	int tmp;
181 
182 	//At TABLE Element
183 	//<!ELEMENT COLUMN (Attribute+,OPTION,UKINDEX,ISPK,SHOWDATATYPE,SHOWALIAS,COLUMNTYPE,PRECISION?,SCALE?,GENERATEFKNAME)>
184 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "COLUMN");
185 
186 	//<!ELEMENT NAME (#PCDATA)>
187 	wxString columnName = figure->getColumnName(false);
188 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "NAME", "%s", XML_FROM_WXSTRING(columnName));
189 	processResult(tmp);
190 
191 	//At Column Element
192 	Write(writer, figure->getOptionImage());
193 	Write(writer, figure->getKindImage());
194 	Write(writer, figure->getColumnText());
195 
196 	//At Column Element
197 	//<!ELEMENT GENERATEFKNAME (#PCDATA)>
198 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "GENERATEFKNAME", "%c", figure->isFkNameGenerated() ?  'T' : 'F' );
199 	processResult(tmp);
200 
201 	//Close COLUMN Element
202 	xmlTextWriterEndElement(writer);
203 	processResult(tmp);
204 }
205 
WriteLocal(xmlTextWriterPtr writer,ddTableFigure * figure)206 void ddXmlStorage::WriteLocal( xmlTextWriterPtr writer, ddTableFigure *figure)
207 {
208 	int tmp;
209 
210 	//At TABLES ELEMENT
211 	//<!ELEMENT TABLE (Attribute*,POINTS,TITLE,UKNAMES?, PKNAME, BEGINDRAWCOLS, BEGINDRAWIDXS, MAXCOLINDEX, MINIDXINDEX, MAXIDXINDEX, COLSROWSSIZE, COLSWINDOW,  IDXSROWSSIZE, IDXSWINDOW, COLUMNS )>
212 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "TABLE");
213 	processResult(tmp);
214 
215 	//<!ATTLIST TABLE	TableID ID #REQUIRED > --> ddTableFigure ID
216 	wxString TableId = design->getTableId(figure->getTableName());
217 	tmp = xmlTextWriterWriteAttribute(writer, BAD_CAST "TableID", XML_FROM_WXSTRING(TableId) );
218 	processResult(tmp);
219 
220 	//Start POINTS <!ELEMENT POINTS (POINT*)>
221 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "POINTS");
222 	processResult(tmp);
223 	int posIdx, positionsCount = figure->getBasicDisplayBox().CountPositions();
224 	for(posIdx = 0; posIdx < positionsCount; posIdx++)
225 	{
226 		//Start POINT <!ELEMENT POINT (X,Y)>
227 		tmp = xmlTextWriterStartElement(writer, BAD_CAST "POINT");
228 		//<!ELEMENT X (#PCDATA)>
229 		tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X", "%d", figure->getBasicDisplayBox().x[posIdx]);
230 		processResult(tmp);
231 		//<!ELEMENT Y (#PCDATA)>
232 		tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Y", "%d", figure->getBasicDisplayBox().y[posIdx]);
233 		processResult(tmp);
234 		//Close POINT Element
235 		xmlTextWriterEndElement(writer);
236 	}
237 	xmlTextWriterEndElement(writer);
238 	//Close POINTS Element
239 
240 	//Add Table Title
241 	ddColumnFigure *f;
242 	hdIteratorBase *iterator = figure->figuresEnumerator();
243 	iterator->Next(); //First figure is main rect
244 
245 	//<!ELEMENT TITLE (NAME,ALIAS?)>
246 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "TITLE");
247 	processResult(tmp);
248 	f = (ddColumnFigure *) iterator->Next();
249 
250 	//<!ELEMENT NAME (#PCDATA)>
251 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "NAME", "%s", XML_FROM_WXSTRING(figure->getTableName()));
252 	processResult(tmp);
253 
254 	//Close TITLE Element
255 	xmlTextWriterEndElement(writer);
256 
257 	if(figure->getUkConstraintsNames().Count() > 0)
258 	{
259 		//<!ELEMENT UKNAMES (UKNAME+)>
260 		tmp = xmlTextWriterStartElement(writer, BAD_CAST "UKNAMES");
261 		processResult(tmp);
262 
263 		//<!ELEMENT UKNAME (#PCDATA)>  one for each name
264 		int i, last = figure->getUkConstraintsNames().Count();
265 		wxString ukName;
266 		for(i = 0; i < last; i++)
267 		{
268 			ukName = figure->getUkConstraintsNames()[i];
269 			tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "UKNAME", "%s", XML_FROM_WXSTRING(ukName));
270 			processResult(tmp);
271 		}
272 
273 		//Close UKNAMES Element
274 		xmlTextWriterEndElement(writer);
275 	}
276 
277 	//<!ELEMENT PKNAME (#PCDATA)>
278 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PKNAME", "%s", XML_FROM_WXSTRING(figure->getPkConstraintName()));
279 	processResult(tmp);
280 
281 	//<!ELEMENT BEGINDRAWCOLS (#PCDATA)>
282 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "BEGINDRAWCOLS", "%d", figure->getBeginDrawCols());
283 	processResult(tmp);
284 
285 	//<!ELEMENT BEGINDRAWIDXS (#PCDATA)>
286 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "BEGINDRAWIDXS", "%d", figure->getBeginDrawIdxs());
287 	processResult(tmp);
288 
289 	//<!ELEMENT MAXCOLINDEX (#PCDATA)>
290 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MAXCOLINDEX", "%d", figure->getMaxColIndex());
291 	processResult(tmp);
292 
293 	//<!ELEMENT MINIDXINDEX (#PCDATA)>
294 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MINIDXINDEX", "%d", figure->getMinIdxIndex());
295 	processResult(tmp);
296 
297 	//<!ELEMENT MAXIDXINDEX (#PCDATA)>
298 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MAXIDXINDEX", "%d", figure->getMaxIdxIndex());
299 	processResult(tmp);
300 
301 	//<!ELEMENT COLSROWSSIZE (#PCDATA)>
302 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "COLSROWSSIZE", "%d", figure->getColsRowsSize());
303 	processResult(tmp);
304 
305 	//<!ELEMENT COLSWINDOW (#PCDATA)>
306 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "COLSWINDOW", "%d", figure->getColsWindow());
307 	processResult(tmp);
308 
309 	//<!ELEMENT IDXSROWSSIZE (#PCDATA)>
310 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IDXSROWSSIZE", "%d", figure->getIdxsRowsSize());
311 	processResult(tmp);
312 
313 	//<!ELEMENT IDXSWINDOW (#PCDATA)>
314 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IDXSWINDOW", "%d", figure->getIdxsWindow());
315 	processResult(tmp);
316 
317 	//<!ELEMENT COLUMNS (COLUMN*)>
318 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "COLUMNS");
319 	processResult(tmp);
320 
321 	//ALL COLUMN ELEMENT
322 	while(iterator->HasNext())
323 	{
324 		f = (ddColumnFigure *) iterator->Next();
325 		Write(writer, f);
326 	}
327 	delete iterator;
328 
329 	//Close COLUMNS Element
330 	xmlTextWriterEndElement(writer);
331 
332 	//Close TABLE Element
333 	xmlTextWriterEndElement(writer);
334 
335 }
336 
337 
WriteLocal(xmlTextWriterPtr writer,ddRelationshipFigure * figure)338 void ddXmlStorage::WriteLocal( xmlTextWriterPtr writer, ddRelationshipFigure *figure)
339 {
340 	int tmp;
341 
342 	//At RELATIONSHIPS Element
343 	//<!ELEMENT RELATIONSHIP (Attributes*, POINTSRELATION, RELATIONITEMS, UKINDEX, NAME, ONUPDATE, ONDELETE, MATCHSIMPLE, IDENTIFYING, ONETOMANY, MANDATORY, FKFROMPK)>
344 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "RELATIONSHIP");
345 
346 	//<!ATTLIST RELATIONITEM SourceTableID IDREF #REQUIRED > --> ddTableFigure ID
347 	wxString TableId = design->getTableId(figure->getStartTable()->getTableName());
348 	tmp = xmlTextWriterWriteAttribute(writer, BAD_CAST "SourceTableID", XML_FROM_WXSTRING(TableId) );
349 	processResult(tmp);
350 
351 	//<!ATTLIST RELATIONSHIP DestTableID IDREF #REQUIRED >
352 	TableId = design->getTableId(figure->getEndTable()->getTableName());
353 	tmp = xmlTextWriterWriteAttribute(writer, BAD_CAST "DestTableID", XML_FROM_WXSTRING(TableId) );
354 	processResult(tmp);
355 
356 	//At RELATIONSHIP Element
357 
358 	//Start POINTSRELATION <!ELEMENT POINTSRELATION (POINTS+)>
359 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "POINTSRELATION");
360 	hdPoint point;
361 
362 	for(int posIdx = 0 ; posIdx < figure->pointLinesCount(); posIdx++)
363 	{
364 		//At POINTSRELATION Element
365 		//Start POINTS <!ELEMENT POINTS (POINT*)>
366 		tmp = xmlTextWriterStartElement(writer, BAD_CAST "POINTS");
367 		for(int i = 0; i < figure->pointCount(posIdx); i++)
368 		{
369 			//At POINTS Element
370 			//Start POINT <!ELEMENT POINT (X,Y)>
371 			tmp = xmlTextWriterStartElement(writer, BAD_CAST "POINT");
372 			point = figure->pointAt(posIdx, i);
373 			//<!ELEMENT X (#PCDATA)>
374 			tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X", "%d", point.x);
375 			processResult(tmp);
376 			//<!ELEMENT Y (#PCDATA)>
377 			tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Y", "%d", point.y);
378 			processResult(tmp);
379 			//Close POINT Element
380 			xmlTextWriterEndElement(writer);
381 		}
382 		//Close POINTS Element
383 		xmlTextWriterEndElement(writer);
384 	}
385 	//Close POINTSRELATION Element
386 	xmlTextWriterEndElement(writer);
387 
388 	//At RELATIONSHIP Element
389 	//<!ELEMENT UKINDEX (#PCDATA)>
390 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "UKINDEX", "%d", figure->getUkIndex());
391 	processResult(tmp);
392 
393 	if(figure->getConstraintName().Length() > 0)
394 	{
395 		//<!ELEMENT NAME (#PCDATA)>
396 		wxString name = figure->getConstraintName();
397 		tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "NAME", "%s", XML_FROM_WXSTRING(name));
398 		processResult(tmp);
399 	}
400 
401 	//<!ELEMENT ONUPDATE (#PCDATA)>
402 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ONUPDATE", "%d", figure->getOnUpdateAction());
403 	processResult(tmp);
404 
405 	//<!ELEMENT ONDELETE (#PCDATA)>
406 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ONDELETE", "%d", figure->getOnDeleteAction());
407 	processResult(tmp);
408 
409 	//<!ELEMENT MATCHSIMPLE (#PCDATA)>
410 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MATCHSIMPLE", "%c", figure->getMatchSimple() ? 'T' : 'F' );
411 	processResult(tmp);
412 
413 	//<!ELEMENT IDENTIFYING (#PCDATA)>
414 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IDENTIFYING", "%c", figure->getIdentifying() ? 'T' : 'F' );
415 	processResult(tmp);
416 
417 	//<!ELEMENT ONETOMANY (#PCDATA)>
418 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ONETOMANY", "%c", figure->getOneToMany() ? 'T' : 'F' );
419 	processResult(tmp);
420 
421 	//<!ELEMENT MANDATORY (#PCDATA)>
422 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MANDATORY", "%c", figure->getMandatory() ? 'T' : 'F' );
423 	processResult(tmp);
424 
425 	//<!ELEMENT FKFROMPK (#PCDATA)>
426 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "FKFROMPK", "%c", figure->isForeignKeyFromPk() ? 'T' : 'F' );
427 	processResult(tmp);
428 
429 	//At RELATIONSHIP Element
430 	//Start RELATIONITEMS <!ELEMENT RELATIONITEMS (RELATIONITEM*)>
431 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "RELATIONITEMS");
432 
433 	ddRelationshipItem *item;
434 	wxString key;
435 	columnsHashMap::iterator it;
436 	for( it = figure->getItemsHashMap().begin(); it != figure->getItemsHashMap().end(); ++it )
437 	{
438 		key = it->first;
439 		item = it->second;
440 		ddXmlStorage::WriteLocal(writer, item);
441 	}
442 
443 	//Close RELATIONITEMS
444 	xmlTextWriterEndElement(writer);
445 
446 	//Close RELATIONSHIP Element
447 	xmlTextWriterEndElement(writer);
448 }
449 
WriteLocal(xmlTextWriterPtr writer,ddRelationshipItem * item)450 void ddXmlStorage::WriteLocal( xmlTextWriterPtr writer, ddRelationshipItem *item)
451 {
452 	int tmp;
453 
454 	//At RELATIONITEMS Element
455 	//<!ELEMENT RELATIONITEM (AUTOGENFK, FKCOLNAME,SOURCECOLNAME, INITIALCOLNAME, INITIALALIASNAME )>
456 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "RELATIONITEM");
457 
458 	//<!ELEMENT AUTOGENFK (#PCDATA)>
459 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "AUTOGENFK", "%c", item->isAutomaticallyGenerated() ? 'T' : 'F' );
460 	processResult(tmp);
461 
462 	//<!ELEMENT FKCOLNAME (#PCDATA)>
463 	wxString fkColName = item->fkColumn->getColumnName();
464 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "FKCOLNAME", "%s", XML_FROM_WXSTRING(fkColName));
465 	processResult(tmp);
466 
467 	//<!ELEMENT SOURCECOLNAME (#PCDATA)>
468 	wxString sourceColName = item->original->getColumnName();
469 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "SOURCECOLNAME", "%s", XML_FROM_WXSTRING(sourceColName));
470 	processResult(tmp);
471 
472 	//<!ELEMENT INITIALCOLNAME (#PCDATA)>
473 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "INITIALCOLNAME", "%s", XML_FROM_WXSTRING(item->originalStartColName));
474 	processResult(tmp);
475 
476 	//Close RELATIONITEM Element
477 	xmlTextWriterEndElement(writer);
478 }
479 
StarDiagrams(xmlTextWriterPtr writer)480 void ddXmlStorage::StarDiagrams( xmlTextWriterPtr writer)
481 {
482 	//At MODEL Element
483 	//<!ELEMENT DIAGRAMS (DIAGRAM)>
484 	xmlTextWriterStartElement(writer, BAD_CAST "DIAGRAMS");
485 }
486 
EndDiagrams(xmlTextWriterPtr writer)487 void ddXmlStorage::EndDiagrams( xmlTextWriterPtr writer)
488 {
489 
490 	//Close DIAGRAMS Element
491 	xmlTextWriterEndElement(writer);
492 }
493 
WriteLocal(xmlTextWriterPtr writer,hdDrawing * diagram)494 void ddXmlStorage::WriteLocal(xmlTextWriterPtr writer, hdDrawing *diagram)
495 {
496 	int tmp;
497 
498 	//At DIAGRAMS Element
499 	//<!ELEMENT DIAGRAM (NAME, TABLEREF*)>
500 	tmp = xmlTextWriterStartElement(writer, BAD_CAST "DIAGRAM");
501 
502 	//At DIAGRAM Element
503 	//<!ELEMENT NAME (#PCDATA)>
504 	tmp = xmlTextWriterWriteFormatElement(writer, BAD_CAST "NAME", "%s", XML_FROM_WXSTRING(diagram->getName()) );
505 	processResult(tmp);
506 
507 	hdIteratorBase *iterator = diagram->figuresEnumerator();
508 	hdIFigure *tmpFigure;
509 	ddTableFigure *table;
510 
511 	while(iterator->HasNext())
512 	{
513 		tmpFigure = (hdIFigure *)iterator->Next();
514 		if(tmpFigure->getKindId() == DDTABLEFIGURE)
515 		{
516 			table = (ddTableFigure *)tmpFigure;
517 			//<!ELEMENT TABLEREF EMPTY>
518 			tmp = xmlTextWriterStartElement(writer, BAD_CAST "TABLEREF");
519 
520 			//<!ATTLIST TABLEREF TableID IDREF #REQUIRED >  --> ddTableFigure ID
521 			wxString TableId = design->getTableId(table->getTableName());
522 			tmp = xmlTextWriterWriteAttribute(writer, BAD_CAST "TableID", XML_FROM_WXSTRING(TableId) );
523 			processResult(tmp);
524 
525 			//Close TABLEREF Element
526 			xmlTextWriterEndElement(writer);
527 		}
528 	}
529 	delete iterator;
530 
531 	//Close DIAGRAM Element
532 	xmlTextWriterEndElement(writer);
533 }
534 
535 //This is needed because table doesn't have any explicit order when stored then I created all first
initialModelParse(xmlTextReaderPtr reader)536 void ddXmlStorage::initialModelParse(xmlTextReaderPtr reader)
537 {
538 	int ret, tmp;
539 	xmlChar *value;
540 
541 	if(reader != NULL)
542 	{
543 		wxString tableName = wxEmptyString, tableAlias = wxEmptyString, TableID;
544 		xmlTextReaderSetParserProp( reader, XML_PARSER_VALIDATE, 1 );
545 		ret = xmlTextReaderRead(reader);
546 		while (ret == 1)
547 		{
548 			if(getNodeType(reader) == 1 && getNodeName(reader).IsSameAs(_("TABLE"), false)) //libxml 1 for start element
549 			{
550 				//Look for table ID
551 				tmp = xmlTextReaderHasAttributes(reader);
552 				TableID = _("TableID");
553 				if(tmp)
554 				{
555 					value = xmlTextReaderGetAttribute(reader, XML_FROM_WXSTRING(TableID));
556 				}
557 
558 				if(value)
559 				{
560 					TableID = WXSTRING_FROM_XML(value);
561 					xmlFree(value);
562 				}
563 
564 				// <!ELEMENT POINTS (POINT*)>
565 				wxString tmpInt;
566 				tmp = xmlTextReaderRead(reader);	//go to POINTS
567 				wxArrayInt x, y;
568 				if(getNodeName(reader).IsSameAs(_("POINTS")) && getNodeType(reader) == 1 && !xmlTextReaderIsEmptyElement(reader) )
569 				{
570 					tmp = xmlTextReaderRead(reader);	//go POINT
571 					do
572 					{
573 						// --> POINT
574 						//<!ELEMENT POINT (X,Y)>
575 						tmp = xmlTextReaderRead(reader);	//go X
576 						tmp = xmlTextReaderRead(reader);	//go X Value
577 						tmp = xmlTextReaderRead(reader);	//go to /X
578 
579 						tmp = xmlTextReaderRead(reader);	//go Y
580 						tmp = xmlTextReaderRead(reader);	//go Y Value
581 						tmp = xmlTextReaderRead(reader);	//go to /Y
582 
583 						tmp = xmlTextReaderRead(reader);	//go /POINT
584 						tmp = xmlTextReaderRead(reader);	//go POINT or /POINTS ?
585 					}
586 					while(getNodeName(reader).IsSameAs(_("POINT"), false));
587 				}
588 
589 				tmp = xmlTextReaderRead(reader);	//go to TITLE
590 				tmp = xmlTextReaderRead(reader);	//go to NAME
591 				tmp = xmlTextReaderRead(reader);	//go to NAME Value
592 				value = xmlTextReaderValue(reader);  //Value of NAME
593 				if(value)
594 				{
595 					tableName = WXSTRING_FROM_XML(value);
596 					design->addTableToMapping(TableID, tableName);
597 					xmlFree(value);
598 				}
599 				tmp = xmlTextReaderRead(reader);	//go to /NAME
600 
601 				tmp = xmlTextReaderRead(reader);	//go to ALIAS or /TITLE
602 				if(getNodeName(reader).IsSameAs(_("ALIAS"), false))
603 				{
604 					tmp = xmlTextReaderRead(reader);	//go to ALIAS Value
605 					value = xmlTextReaderValue(reader);  //Value of ALIAS
606 					if(value)
607 					{
608 						tableAlias = WXSTRING_FROM_XML(value);
609 						xmlFree(value);
610 					}
611 					tmp = xmlTextReaderRead(reader);	//go to /ALIAS
612 					tmp = xmlTextReaderRead(reader);	//go to /TITLE
613 				}
614 				ddTableFigure *t = new ddTableFigure(tableName, -1, -1);
615 
616 				design->addTableToModel(t);
617 			}
618 			ret = xmlTextReaderRead(reader);
619 		}
620 
621 		//Once the document has been fully parsed check the validation results
622 		if (xmlTextReaderIsValid(reader) != 1)
623 		{
624 			wxMessageBox(_("Model is not following embedded DTD definition, check it.\n"));
625 			return;
626 		}
627 	}
628 	//reset reader to begining of stream
629 }
630 
631 
632 
Read(xmlTextReaderPtr reader)633 bool ddXmlStorage::Read(xmlTextReaderPtr reader)
634 {
635 	int ret;
636 
637 	if(reader != NULL)
638 	{
639 		xmlTextReaderSetParserProp( reader, XML_PARSER_VALIDATE, 1 );
640 		ret = xmlTextReaderRead(reader);
641 		while (ret == 1)
642 		{
643 			selectReader(reader);
644 			ret = xmlTextReaderRead(reader);
645 		}
646 
647 		//Once the document has been fully parsed check the validation results
648 		if (xmlTextReaderIsValid(reader) != 1)
649 		{
650 			wxMessageBox(_("Model is not following embedded DTD definition, check it.\n"));
651 			return false;
652 		}
653 
654 		if (ret != 0)
655 		{
656 			wxMessageBox(_("Failed to load document from disk"));
657 			return false;
658 		}
659 		else
660 		{
661 			return true;
662 		}
663 	}
664 	return false;
665 }
666 
getNodeName(xmlTextReaderPtr reader)667 wxString ddXmlStorage::getNodeName(xmlTextReaderPtr reader)
668 {
669 	xmlChar *name;
670 	wxString out = wxEmptyString;
671 	name = xmlTextReaderName(reader);
672 	if (name == NULL)
673 		name = xmlStrdup(BAD_CAST "--");
674 	out = WXSTRING_FROM_XML(name);
675 	xmlFree(name);
676 	return out;
677 }
getNodeType(xmlTextReaderPtr reader)678 int ddXmlStorage::getNodeType(xmlTextReaderPtr reader)
679 {
680 	return xmlTextReaderNodeType(reader);
681 }
682 
getNodeValue(xmlTextReaderPtr reader)683 wxString ddXmlStorage::getNodeValue(xmlTextReaderPtr reader)
684 {
685 	wxString out = wxEmptyString;
686 	xmlChar *value;
687 	value = xmlTextReaderValue(reader);
688 	if (value != NULL)
689 	{
690 		out = WXSTRING_FROM_XML(value);
691 		xmlFree(value);
692 	}
693 	return out;
694 }
695 
696 
selectReader(xmlTextReaderPtr reader)697 void ddXmlStorage::selectReader(xmlTextReaderPtr reader)
698 {
699 	if(getNodeType(reader) == 1) //libxml 1 for start element
700 	{
701 		if(getNodeName(reader).IsSameAs(_("VERSION"), false))
702 		{
703 			checkVersion(reader);
704 		}
705 		if(getNodeName(reader).IsSameAs(_("MODEL"), false))
706 		{
707 			//<!ELEMENT MODEL (TABLE+)>
708 		}
709 
710 		if(getNodeName(reader).IsSameAs(_("TABLE"), false))
711 		{
712 			getTable(reader);
713 		}
714 
715 		if(getNodeName(reader).IsSameAs(_("RELATIONSHIP"), false))
716 		{
717 			ddRelationshipFigure *r = getRelationship(reader);
718 			design->addTableToModel(r);
719 		}
720 
721 		if(getNodeName(reader).IsSameAs(_("DIAGRAMS"), false))
722 		{
723 			initDiagrams(reader);
724 		}
725 	}
726 }
727 
728 //Check if version of modeler with xml input is compatible
checkVersion(xmlTextReaderPtr reader)729 void ddXmlStorage::checkVersion(xmlTextReaderPtr reader)
730 {
731 	/*
732 	<!--Version Element-->
733 	<!ELEMENT VERSIONXL EMPTY>
734 	<!ATTLIST VERSION VERIXLU CDATA #REQUIRED>
735 	*/
736 	int tmp;
737 	wxString Number;
738 	xmlChar *value;
739 	//<!ATTLIST  VERSIONXL NUMBER CDATA #REQUIRED>
740 	tmp = xmlTextReaderHasAttributes(reader);
741 	Number = _("VERIXLU");
742 	if(tmp)
743 	{
744 		value = xmlTextReaderGetAttribute(reader, XML_FROM_WXSTRING(Number));
745 	}
746 
747 	if(value)
748 	{
749 		Number = WXSTRING_FROM_XML(value);
750 		xmlFree(value);
751 	}
752 	if(!Number.IsSameAs(_("1.0")))
753 	{
754 		wxMessageBox(_("Invalid version of XML file for pgAdmin database designer found"), _("Invalid XML"), wxOK | wxICON_ERROR);
755 	}
756 }
757 
758 //Table isn't create here because fk needs all tables created before assign it
getTable(xmlTextReaderPtr reader)759 ddTableFigure *ddXmlStorage::getTable(xmlTextReaderPtr reader)
760 {
761 	/*
762 	<!ELEMENT POINTS (POINT*)>
763 	<!-- POINT Element -->
764 	<!ELEMENT POINT (X,Y)>
765 	<!ELEMENT X (#PCDATA)>
766 	<!ELEMENT Y (#PCDATA)>
767 
768 
769 	<!ELEMENT TABLE (Attribute*,POINTS,TITLE,UKNAMES?, PKNAME, COLUMNS, BEGINDRAWCOLS, BEGINDRAWIDXS, MAXCOLINDEX, MINIDXINDEX, MAXIDXINDEX, COLSROWSSIZE, COLSWINDOW,  IDXSROWSSIZE, IDXSWINDOW )>
770 	<!ELEMENT POINTS (POINT*)>
771 	<!ELEMENT COLUMNS (COLUMN*)>
772 	<!ELEMENT UKNAMES (UKNAME+)>
773 	<!ELEMENT UKNAME (#PCDATA)>
774 	<!ELEMENT PKNAME (#PCDATA)>
775 	<!ELEMENT BEGINDRAWCOLS (#PCDATA)>
776 	<!ELEMENT BEGINDRAWIDXS (#PCDATA)>
777 	<!ELEMENT MAXCOLINDEX (#PCDATA)>
778 	<!ELEMENT MINIDXINDEX (#PCDATA)>
779 	<!ELEMENT MAXIDXINDEX (#PCDATA)>
780 	<!ELEMENT COLSROWSSIZE (#PCDATA)>
781 	<!ELEMENT COLSWINDOW (#PCDATA)>
782 	<!ELEMENT IDXSROWSSIZE (#PCDATA)>
783 	<!ELEMENT IDXSWINDOW (#PCDATA)>
784 
785 	<!ATTLIST TABLE	TableID ID #REQUIRED >
786 	*/
787 
788 	int tmp;
789 	wxString TableID, node, tmpInt;
790 	xmlChar *value;
791 
792 	//<!ATTLIST TABLE	TableID ID #REQUIRED >
793 	tmp = xmlTextReaderHasAttributes(reader);
794 	TableID = _("TableID");
795 	if(tmp)
796 	{
797 		value = xmlTextReaderGetAttribute(reader, XML_FROM_WXSTRING(TableID));
798 	}
799 
800 	if(value)
801 	{
802 		TableID = WXSTRING_FROM_XML(value);
803 		xmlFree(value);
804 	}
805 
806 	// --> ATTRIBUTE*
807 	//Element(s) Attribute*
808 	// NEED TO IMPLEMENT THIS
809 
810 
811 	// -->POINTS
812 	// <!ELEMENT POINTS (POINT*)>
813 	tmp = xmlTextReaderRead(reader);	//go to POINTS
814 	wxArrayInt x, y;
815 	if(getNodeName(reader).IsSameAs(_("POINTS")) && getNodeType(reader) == 1 && !xmlTextReaderIsEmptyElement(reader) )
816 	{
817 		tmp = xmlTextReaderRead(reader);	//go POINT
818 		do
819 		{
820 			// --> POINT
821 			//<!ELEMENT POINT (X,Y)>
822 			tmp = xmlTextReaderRead(reader);	//go X
823 			tmp = xmlTextReaderRead(reader);	//go X Value
824 			value = xmlTextReaderValue(reader);  //Value of X
825 			if(value)
826 			{
827 				tmpInt = WXSTRING_FROM_XML(value);
828 				x.Add(wxAtoi(tmpInt));
829 				xmlFree(value);
830 			}
831 			tmp = xmlTextReaderRead(reader);	//go to /X
832 
833 			tmp = xmlTextReaderRead(reader);	//go Y
834 			tmp = xmlTextReaderRead(reader);	//go Y Value
835 			value = xmlTextReaderValue(reader);  //Value of Y
836 			if(value)
837 			{
838 				tmpInt = WXSTRING_FROM_XML(value);
839 				y.Add(wxAtoi(tmpInt));
840 				xmlFree(value);
841 			}
842 			tmp = xmlTextReaderRead(reader);	//go to /Y
843 			tmp = xmlTextReaderRead(reader);	//go /POINT
844 			tmp = xmlTextReaderRead(reader);	//go POINT or /POINTS ?
845 		}
846 		while(getNodeName(reader).IsSameAs(_("POINT"), false));
847 	}
848 
849 	if(!getNodeName(reader).IsSameAs(_("POINTS"), false))
850 		processResult(-1);
851 
852 	// --> TITLE
853 	//<!ELEMENT TITLE (NAME,ALIAS?)>
854 	//<!ELEMENT NAME (#PCDATA)>
855 	//<!ELEMENT ALIAS (#PCDATA)>
856 	wxString tableName = wxEmptyString;
857 	wxString tableAlias = wxEmptyString;
858 
859 	tmp = xmlTextReaderRead(reader);	//go to TITLE
860 	tmp = xmlTextReaderRead(reader);	//go to NAME
861 	tmp = xmlTextReaderRead(reader);	//go to NAME Value
862 	value = xmlTextReaderValue(reader);  //Value of NAME
863 
864 	if(value)
865 	{
866 		tableName = WXSTRING_FROM_XML(value);
867 		xmlFree(value);
868 	}
869 	tmp = xmlTextReaderRead(reader);	//go to /NAME
870 	tmp = xmlTextReaderRead(reader);	//go to ALIAS or /TITLE
871 	if(getNodeName(reader).IsSameAs(_("ALIAS"), false))
872 	{
873 		tmp = xmlTextReaderRead(reader);	//go to ALIAS Value
874 		value = xmlTextReaderValue(reader);  //Value of ALIAS
875 		if(value)
876 		{
877 			tableAlias = WXSTRING_FROM_XML(value);
878 			xmlFree(value);
879 		}
880 		tmp = xmlTextReaderRead(reader);	//go to /ALIAS
881 		tmp = xmlTextReaderRead(reader);	//go to /TITLE
882 	}
883 
884 	// --> UKNAMES?
885 	//<!ELEMENT UKNAMES (UKNAME+)>
886 	//<!ELEMENT UKNAME (#PCDATA)>
887 	tmp = xmlTextReaderRead(reader);	//go to UKNAMES or PKNAMES?
888 	wxArrayString ukNames;
889 	if(getNodeName(reader).IsSameAs(_("UKNAMES"), false))
890 	{
891 		tmp = xmlTextReaderRead(reader);	//go UKNAME
892 		do
893 		{
894 			tmp = xmlTextReaderRead(reader);	//go UKNAME Value
895 			value = xmlTextReaderValue(reader);  //Value of UKNAME
896 			if(value)
897 			{
898 				ukNames.Add(WXSTRING_FROM_XML(value));
899 				xmlFree(value);
900 			}
901 			tmp = xmlTextReaderRead(reader);	//go to /UKNAME
902 			tmp = xmlTextReaderRead(reader);	//go to UKNAME or /UKNAMES ?
903 		}
904 		while(getNodeName(reader).IsSameAs(_("UKNAME"), false));
905 		tmp = xmlTextReaderRead(reader);	//go to PKNAME
906 	}
907 
908 	// --> PKNAME
909 	//<!ELEMENT PKNAME (#PCDATA)>
910 	wxString pkName;
911 	if(getNodeName(reader).IsSameAs(_("PKNAME")))
912 	{
913 		tmp = xmlTextReaderRead(reader);	//go to PKNAME Value or PKNAME node?
914 		if(!getNodeName(reader).IsSameAs(_("PKNAME")))
915 		{
916 			value = xmlTextReaderValue(reader);  //Value of PKNAME
917 			if(value)
918 			{
919 				pkName = WXSTRING_FROM_XML(value);
920 				xmlFree(value);
921 			}
922 			tmp = xmlTextReaderRead(reader);	//go to /PKNAME
923 		}
924 	}
925 
926 	int beginDrawCols, beginDrawIdxs, maxColIndex, minIdxIndex, maxIdxIndex, colsRowsSize, colsWindow, idxsRowsSize, idxsWindow;
927 	// --> BEGINDRAWCOLS
928 	//<!ELEMENT BEGINDRAWCOLS (#PCDATA)>
929 	tmp = xmlTextReaderRead(reader);	//go to BEGINDRAWCOLS
930 	tmp = xmlTextReaderRead(reader);	//go to BEGINDRAWCOLS Value
931 	value = xmlTextReaderValue(reader);  //Value
932 	if(value)
933 	{
934 		tmpInt = WXSTRING_FROM_XML(value);
935 		beginDrawCols = wxAtoi(tmpInt);
936 		xmlFree(value);
937 	}
938 	tmp = xmlTextReaderRead(reader);	//go to /BEGINDRAWCOLS
939 	tmp = xmlTextReaderRead(reader);	//go to BEGINDRAWIDXS
940 
941 	// --> BEGINDRAWIDXS
942 	//<!ELEMENT BEGINDRAWIDXS (#PCDATA)>
943 	tmp = xmlTextReaderRead(reader);	//go to BEGINDRAWIDXS Value
944 	value = xmlTextReaderValue(reader);  //Value
945 	if(value)
946 	{
947 		tmpInt = WXSTRING_FROM_XML(value);
948 		beginDrawIdxs = wxAtoi(tmpInt);
949 		xmlFree(value);
950 	}
951 	tmp = xmlTextReaderRead(reader);	//go to /BEGINDRAWIDXS
952 	tmp = xmlTextReaderRead(reader);	//go to MAXCOLINDEX
953 
954 	// --> MAXCOLINDEX
955 	//<!ELEMENT MAXCOLINDEX (#PCDATA)>
956 	tmp = xmlTextReaderRead(reader);	//go to MAXCOLINDEX Value
957 	value = xmlTextReaderValue(reader);  //Value
958 	if(value)
959 	{
960 		tmpInt = WXSTRING_FROM_XML(value);
961 		maxColIndex = wxAtoi(tmpInt);
962 		xmlFree(value);
963 	}
964 	tmp = xmlTextReaderRead(reader);	//go to /MAXCOLINDEX
965 	tmp = xmlTextReaderRead(reader);	//go to MINIDXINDEX
966 
967 	// --> MINIDXINDEX
968 	//<!ELEMENT MINIDXINDEX (#PCDATA)>
969 	tmp = xmlTextReaderRead(reader);	//go to MINIDXINDEX Value
970 	value = xmlTextReaderValue(reader);  //Value
971 	if(value)
972 	{
973 		tmpInt = WXSTRING_FROM_XML(value);
974 		minIdxIndex = wxAtoi(tmpInt);
975 		xmlFree(value);
976 	}
977 	tmp = xmlTextReaderRead(reader);	//go to /MINIDXINDEX
978 	tmp = xmlTextReaderRead(reader);	//go to MAXIDXINDEX
979 
980 	// --> MAXIDXINDEX
981 	//<!ELEMENT MAXIDXINDEX (#PCDATA)>
982 	tmp = xmlTextReaderRead(reader);	//go to MAXIDXINDEX Value
983 	value = xmlTextReaderValue(reader);  //Value
984 	if(value)
985 	{
986 		tmpInt = WXSTRING_FROM_XML(value);
987 		maxIdxIndex = wxAtoi(tmpInt);
988 		xmlFree(value);
989 	}
990 	tmp = xmlTextReaderRead(reader);	//go to /MAXIDXINDEX
991 	tmp = xmlTextReaderRead(reader);	//go to COLSROWSSIZE
992 
993 	// --> COLSROWSSIZE
994 	//<!ELEMENT COLSROWSSIZE (#PCDATA)>
995 	tmp = xmlTextReaderRead(reader);	//go to COLSROWSSIZE Value
996 	value = xmlTextReaderValue(reader);  //Value
997 	if(value)
998 	{
999 		tmpInt = WXSTRING_FROM_XML(value);
1000 		colsRowsSize = wxAtoi(tmpInt);
1001 		xmlFree(value);
1002 	}
1003 	tmp = xmlTextReaderRead(reader);	//go to /COLSROWSSIZE
1004 	tmp = xmlTextReaderRead(reader);	//go to COLSWINDOW
1005 
1006 	// --> COLSWINDOW
1007 	//<!ELEMENT COLSWINDOW (#PCDATA)>
1008 	tmp = xmlTextReaderRead(reader);	//go to COLSWINDOW Value
1009 	value = xmlTextReaderValue(reader);  //Value
1010 	if(value)
1011 	{
1012 		tmpInt = WXSTRING_FROM_XML(value);
1013 		colsWindow = wxAtoi(tmpInt);
1014 		xmlFree(value);
1015 	}
1016 	tmp = xmlTextReaderRead(reader);	//go to /COLSWINDOW
1017 	tmp = xmlTextReaderRead(reader);	//go to IDXSROWSSIZE
1018 
1019 	// --> IDXSROWSSIZE
1020 	//<!ELEMENT IDXSROWSSIZE (#PCDATA)>
1021 	tmp = xmlTextReaderRead(reader);	//go to IDXSROWSSIZE Value
1022 	value = xmlTextReaderValue(reader);  //Value
1023 	if(value)
1024 	{
1025 		tmpInt = WXSTRING_FROM_XML(value);
1026 		idxsRowsSize = wxAtoi(tmpInt);
1027 		xmlFree(value);
1028 	}
1029 	tmp = xmlTextReaderRead(reader);	//go to /IDXSROWSSIZE
1030 	tmp = xmlTextReaderRead(reader);	//go to IDXSWINDOW
1031 
1032 	// --> IDXSWINDOW
1033 	//<!ELEMENT IDXSWINDOW (#PCDATA)>*/
1034 	tmp = xmlTextReaderRead(reader);	//go to IDXSWINDOW Value
1035 	value = xmlTextReaderValue(reader);  //Value
1036 	if(value)
1037 	{
1038 		tmpInt = WXSTRING_FROM_XML(value);
1039 		idxsWindow = wxAtoi(tmpInt);
1040 		xmlFree(value);
1041 	}
1042 	tmp = xmlTextReaderRead(reader);	//go to /IDXSWINDOW
1043 	// --> COLUMNS
1044 	//<!ELEMENT COLUMNS (COLUMN*)>
1045 
1046 	tmp = xmlTextReaderRead(reader);	//go to COLUMNS
1047 
1048 	//Use empty table without columns created at preparsing to fill it with metadata
1049 
1050 	ddTableFigure *t = design->getTable(tableName);
1051 	if(t != NULL)
1052 		t->InitTableValues(ukNames, pkName, beginDrawCols, beginDrawIdxs, maxColIndex, minIdxIndex, maxIdxIndex, colsRowsSize, colsWindow, idxsRowsSize, idxsWindow);
1053 	else
1054 		wxMessageBox(_("Table initial metadata info not found"));
1055 
1056 
1057 	//CHANGE 300,300 for right value when displaybox metadata will be added
1058 
1059 
1060 	//COLUMNS node have COLUMN children?
1061 	if(getNodeName(reader).IsSameAs(_("COLUMNS")) && getNodeType(reader) == 1 && !xmlTextReaderIsEmptyElement(reader) )
1062 	{
1063 		ddColumnFigure *c;
1064 		do
1065 		{
1066 			c = getColumn(reader, t);
1067 			if(c)
1068 			{
1069 				t->addColumnFromStorage(c);
1070 				c->setRightIconForColumn();
1071 			}
1072 		}
1073 		while(c != NULL);
1074 		//now at </COLUMNS>
1075 	}
1076 
1077 	tmp = xmlTextReaderRead(reader);	//go to </TABLE>
1078 	t->syncInternalsPosAt(x, y); //synchronize positions
1079 	t->updateTableSize();
1080 	return t;
1081 }
1082 
getColumn(xmlTextReaderPtr reader,ddTableFigure * colOwner)1083 ddColumnFigure *ddXmlStorage::getColumn(xmlTextReaderPtr reader, ddTableFigure *colOwner)
1084 {
1085 	/*
1086 	<!ELEMENT COLUMN (Attribute*,NAME,OPTION,UKINDEX,ISPK,COLUMNTYPE,PRECISION?,SCALE?,GENERATEFKNAME)>
1087 	<!ELEMENT NAME (#PCDATA)>
1088 	<!ELEMENT OPTION (#PCDATA)>
1089 	<!ELEMENT UKINDEX (#PCDATA)>
1090 	<!ELEMENT ISPK (#PCDATA)>
1091 	<!ELEMENT COLUMNTYPE (#PCDATA)>
1092 	<!ELEMENT PRECISION (#PCDATA)>
1093 	<!ELEMENT SCALE (#PCDATA)>
1094 	<!ELEMENT GENERATEFKNAME (#PCDATA)>
1095 	*/
1096 
1097 	xmlChar *value;
1098 	int tmp;
1099 	tmp = xmlTextReaderRead(reader);	//go to COLUMN
1100 	if(getNodeName(reader).IsSameAs(_("COLUMN")) && getNodeType(reader) == 1 && !xmlTextReaderIsEmptyElement(reader) )
1101 	{
1102 		// --> ATTRIBUTE*
1103 		//Element(s) Attribute*
1104 		// NEED TO IMPLEMENT THIS
1105 
1106 		// --> NAME
1107 		//<!ELEMENT NAME (#PCDATA)>
1108 		wxString columnName;
1109 		tmp = xmlTextReaderRead(reader);	//go to NAME
1110 		tmp = xmlTextReaderRead(reader);	//go to NAME Value
1111 		value = xmlTextReaderValue(reader);  //Value of NAME
1112 		if(value)
1113 		{
1114 			columnName = WXSTRING_FROM_XML(value);
1115 			xmlFree(value);
1116 		}
1117 		tmp = xmlTextReaderRead(reader);	//go to /NAME
1118 		tmp = xmlTextReaderRead(reader);	//go to OPTION
1119 
1120 		// --> OPTION
1121 		//<!ELEMENT OPTION (#PCDATA)>
1122 		int option;
1123 		wxString tmpInt;
1124 		tmp = xmlTextReaderRead(reader);	//go to OPTION Value
1125 		value = xmlTextReaderValue(reader);  //Value
1126 		if(value)
1127 		{
1128 			tmpInt = WXSTRING_FROM_XML(value);
1129 			option = wxAtoi(tmpInt);
1130 			xmlFree(value);
1131 		}
1132 		tmp = xmlTextReaderRead(reader);	//go to /OPTION
1133 		tmp = xmlTextReaderRead(reader);	//go to UKINDEX
1134 
1135 		// --> UKINDEX
1136 		//<!ELEMENT UKINDEX (#PCDATA)>
1137 		int ukindex;
1138 		tmp = xmlTextReaderRead(reader);	//go to UKINDEX Value
1139 		value = xmlTextReaderValue(reader);  //Value
1140 		if(value)
1141 		{
1142 			tmpInt = WXSTRING_FROM_XML(value);
1143 			ukindex = wxAtoi(tmpInt);
1144 			xmlFree(value);
1145 		}
1146 		tmp = xmlTextReaderRead(reader);	//go to /UKINDEX
1147 		tmp = xmlTextReaderRead(reader);	//go to ISPK
1148 
1149 		// --> ISPK
1150 		//<!ELEMENT ISPK (#PCDATA)>
1151 		bool isPk = false;
1152 		tmp = xmlTextReaderRead(reader);	//go to ISPK Value
1153 		value = xmlTextReaderValue(reader);  //Value of ISPK
1154 		if(value)
1155 		{
1156 			tmpInt = WXSTRING_FROM_XML(value);
1157 			isPk = tmpInt.IsSameAs(_("T"));
1158 			xmlFree(value);
1159 		}
1160 		tmp = xmlTextReaderRead(reader);	//go to /ISPK
1161 
1162 		// --> COLUMNTYPE
1163 		//<!ELEMENT COLUMNTYPE (#PCDATA)>
1164 		wxString columnType;
1165 		tmp = xmlTextReaderRead(reader);	//go to COLUMNTYPE
1166 		tmp = xmlTextReaderRead(reader);	//go to COLUMNTYPE Value
1167 		value = xmlTextReaderValue(reader);  //Value of COLUMNTYPE
1168 		if(value)
1169 		{
1170 			columnType = WXSTRING_FROM_XML(value);
1171 			xmlFree(value);
1172 		}
1173 		tmp = xmlTextReaderRead(reader);	//go to /COLUMNTYPE
1174 
1175 		// --> PRECISION?
1176 		//<!ELEMENT PRECISION (#PCDATA)>
1177 		tmp = xmlTextReaderRead(reader);	//go to PRECISION? or SCALE? or ALIAS? or GENERATEFKNAME
1178 		int precision = -1;
1179 		if(getNodeName(reader).IsSameAs(_("PRECISION")))
1180 		{
1181 			tmp = xmlTextReaderRead(reader);	//go to PRECISION Value
1182 			value = xmlTextReaderValue(reader);  //Value of PRECISION
1183 			if(value)
1184 			{
1185 				tmpInt = WXSTRING_FROM_XML(value);
1186 				precision = wxAtoi(tmpInt);
1187 				xmlFree(value);
1188 			}
1189 			tmp = xmlTextReaderRead(reader);	//go to /PRECISION
1190 			tmp = xmlTextReaderRead(reader);	//go to SCALE? or ALIAS? or GENERATEFKNAME
1191 		}
1192 
1193 		// --> 	SCALE?
1194 		//<!ELEMENT SCALE (#PCDATA)>
1195 
1196 		int scale = -1;
1197 		if(getNodeName(reader).IsSameAs(_("SCALE")))
1198 		{
1199 			tmp = xmlTextReaderRead(reader);	//go to SCALE Value
1200 			value = xmlTextReaderValue(reader);  //Value of SCALE
1201 			if(value)
1202 			{
1203 				tmpInt = WXSTRING_FROM_XML(value);
1204 				scale = wxAtoi(tmpInt);
1205 				xmlFree(value);
1206 			}
1207 			tmp = xmlTextReaderRead(reader);	//go to /SCALE
1208 			tmp = xmlTextReaderRead(reader);	//go to ALIAS? or GENERATEFKNAME
1209 		}
1210 
1211 		// --> GENERATEFKNAME
1212 		//<!ELEMENT GENERATEFKNAME (#PCDATA)>
1213 		bool generateFkName = false;
1214 		tmp = xmlTextReaderRead(reader);	//go to GENERATEFKNAME Value
1215 		value = xmlTextReaderValue(reader);  //Value of GENERATEFKNAME
1216 		if(value)
1217 		{
1218 			tmpInt = WXSTRING_FROM_XML(value);
1219 			generateFkName = tmpInt.IsSameAs(_("T"));
1220 			xmlFree(value);
1221 		}
1222 		tmp = xmlTextReaderRead(reader);	//go to /GENERATEFKNAME
1223 		tmp = xmlTextReaderRead(reader);	//go to /COLUMN
1224 
1225 		return new ddColumnFigure(columnName, colOwner, (ddColumnOptionType)option, generateFkName, isPk, columnType, precision, scale, ukindex, NULL, NULL);
1226 	}
1227 	return NULL;   //found /COLUMNS node
1228 }
1229 
getRelationship(xmlTextReaderPtr reader)1230 ddRelationshipFigure *ddXmlStorage::getRelationship(xmlTextReaderPtr reader)
1231 {
1232 	/*
1233 	<!-- POINTSRELATION Element -->
1234 	<!ELEMENT POINTSRELATION (POINTS+)>
1235 	<!-- POINTS Element -->
1236 	<!ELEMENT POINTS (POINT*)>
1237 	<!-- POINT Element -->
1238 	<!ELEMENT POINT (X,Y)>
1239 	<!ELEMENT X (#PCDATA)>
1240 	<!ELEMENT Y (#PCDATA)>
1241 
1242 
1243 	<!-- Relationship Element -->
1244 	<!ELEMENT RELATIONSHIP (Attribute*,POINTSRELATION, UKINDEX, NAME?, ONUPDATE, ONDELETE, MATCHSIMPLE, IDENTIFYING, ONETOMANY, MANDATORY, FKFROMPK,RELATIONITEMS)>
1245 	<!ELEMENT RELATIONITEMS (RELATIONITEM*)>
1246 	<!ELEMENT ONUPDATE (#PCDATA)>
1247 	<!ELEMENT ONDELETE (#PCDATA)>
1248 	<!ELEMENT MATCHSIMPLE (#PCDATA)>
1249 	<!ELEMENT IDENTIFYING (#PCDATA)>
1250 	<!ELEMENT ONETOMANY (#PCDATA)>
1251 	<!ELEMENT MANDATORY (#PCDATA)>
1252 	<!ELEMENT FKFROMPK (#PCDATA)>
1253 
1254 	<!ATTLIST RELATIONSHIP	SourceTableID IDREF #REQUIRED >
1255 	<!ATTLIST RELATIONSHIP	DestTableID IDREF #REQUIRED >
1256 	*/
1257 
1258 	xmlChar *value;
1259 	wxString tmpInt;
1260 	int tmp;
1261 
1262 	//<!ATTLIST RELATIONSHIP SourceTableID IDREF #REQUIRED >
1263 	tmp = xmlTextReaderHasAttributes(reader);
1264 	wxString SourceTableID = _("SourceTableID");
1265 	if(tmp)
1266 	{
1267 		value = xmlTextReaderGetAttribute(reader, XML_FROM_WXSTRING(SourceTableID));
1268 	}
1269 
1270 	if(value)
1271 	{
1272 		SourceTableID = WXSTRING_FROM_XML(value);
1273 		xmlFree(value);
1274 	}
1275 
1276 	//<!ATTLIST RELATIONSHIP DestTableID IDREF #REQUIRED >
1277 	tmp = xmlTextReaderHasAttributes(reader);
1278 	wxString DestTableID = _("DestTableID");
1279 	if(tmp)
1280 	{
1281 		value = xmlTextReaderGetAttribute(reader, XML_FROM_WXSTRING(DestTableID));
1282 	}
1283 
1284 	if(value)
1285 	{
1286 		DestTableID = WXSTRING_FROM_XML(value);
1287 		xmlFree(value);
1288 	}
1289 
1290 	ddTableFigure *source = design->getTable(design->getTableName(SourceTableID));
1291 	ddTableFigure *destination = design->getTable(design->getTableName(DestTableID));
1292 
1293 	ddRelationshipFigure *relation = new ddRelationshipFigure();
1294 	relation->setStartTerminal(new ddRelationshipTerminal(relation, false));
1295 	relation->setEndTerminal(new ddRelationshipTerminal(relation, true));
1296 	relation->clearPoints(0);
1297 	bool firstPoint = true;
1298 	// --> ATTRIBUTE*
1299 	//Element(s) Attribute*
1300 	// NEED TO IMPLEMENT THIS
1301 
1302 	// --> POINTSRELATION
1303 	//<!ELEMENT POINTSRELATION (POINTS+)>
1304 	int x, y, posIdx = 0;
1305 
1306 	tmp = xmlTextReaderRead(reader);	//go to POINTSRELATION
1307 	if(getNodeName(reader).IsSameAs(_("POINTSRELATION"), false))
1308 	{
1309 		//only first time inside POINTSRELATION this is needed
1310 		tmp = xmlTextReaderRead(reader);	//go POINTS
1311 		do
1312 		{
1313 
1314 			if(!firstPoint)  //because at first time position for diagram exists at relationship yet
1315 			{
1316 				relation->AddPosForNewDiagram();
1317 			}
1318 			else
1319 			{
1320 				firstPoint = false;
1321 			}
1322 
1323 			if(getNodeName(reader).IsSameAs(_("POINTS")) && getNodeType(reader) == 1 && !xmlTextReaderIsEmptyElement(reader) )
1324 			{
1325 				//only first time inside POINTS this is needed
1326 				tmp = xmlTextReaderRead(reader);	//go POINT
1327 				do
1328 				{
1329 					tmp = xmlTextReaderRead(reader);	//go X
1330 					tmp = xmlTextReaderRead(reader);	//go X Value
1331 					value = xmlTextReaderValue(reader);  //Value of X
1332 					if(value)
1333 					{
1334 						tmpInt = WXSTRING_FROM_XML(value);
1335 						x = wxAtoi(tmpInt);
1336 						xmlFree(value);
1337 					}
1338 					tmp = xmlTextReaderRead(reader);	//go to /X
1339 
1340 					tmp = xmlTextReaderRead(reader);	//go Y
1341 					tmp = xmlTextReaderRead(reader);	//go Y Value
1342 					value = xmlTextReaderValue(reader);  //Value of Y
1343 					if(value)
1344 					{
1345 						tmpInt = WXSTRING_FROM_XML(value);
1346 						y = wxAtoi(tmpInt);
1347 						xmlFree(value);
1348 					}
1349 					tmp = xmlTextReaderRead(reader);	//go to /Y
1350 					tmp = xmlTextReaderRead(reader);	//go /POINT
1351 					relation->addPoint(posIdx, x, y);
1352 
1353 					tmp = xmlTextReaderRead(reader);	//go POINT or /POINTS?
1354 				}
1355 				while(getNodeName(reader).IsSameAs(_("POINT"), false) && getNodeType(reader) == 1);
1356 			}
1357 			else
1358 			{
1359 				if(! (getNodeName(reader).IsSameAs(_("POINTS")) && xmlTextReaderIsEmptyElement(reader))  )
1360 				{
1361 					processResult(-1);
1362 				}
1363 			}
1364 			posIdx++;  //change of points array then change view position index
1365 			tmp = xmlTextReaderRead(reader);	//go POINTS or /POINTSRELATION?
1366 		}
1367 		while(getNodeName(reader).IsSameAs(_("POINTS"), false) && getNodeType(reader) == 1);
1368 	}
1369 
1370 	if(!getNodeName(reader).IsSameAs(_("POINTSRELATION"), false))
1371 	{
1372 		processResult(-1);
1373 	}
1374 
1375 	// --> UKINDEX
1376 	//<!ELEMENT UKINDEX (#PCDATA)>
1377 	int ukindex;
1378 	tmp = xmlTextReaderRead(reader);	//go to UKINDEX
1379 	tmp = xmlTextReaderRead(reader);	//go to UKINDEX Value
1380 	value = xmlTextReaderValue(reader);  //Value
1381 	if(value)
1382 	{
1383 		tmpInt = WXSTRING_FROM_XML(value);
1384 		ukindex = wxAtoi(tmpInt);
1385 		xmlFree(value);
1386 	}
1387 	tmp = xmlTextReaderRead(reader);	//go to /UKINDEX
1388 
1389 	// --> NAME
1390 	//<!ELEMENT NAME (#PCDATA)>
1391 	tmp = xmlTextReaderRead(reader);	//go to NAME or ONUPDATE
1392 	wxString RelationshipName = wxEmptyString;
1393 	if(getNodeName(reader).IsSameAs(_("NAME"), false))
1394 	{
1395 
1396 		tmp = xmlTextReaderRead(reader);	//go to NAME Value
1397 		value = xmlTextReaderValue(reader);  //Value of NAME
1398 		if(value)
1399 		{
1400 			RelationshipName = WXSTRING_FROM_XML(value);
1401 			xmlFree(value);
1402 		}
1403 		tmp = xmlTextReaderRead(reader);	//go to /NAME
1404 		tmp = xmlTextReaderRead(reader);	//go to ONUPDATE
1405 	}
1406 
1407 	// --> ONUPDATE
1408 	//<!ELEMENT ONUPDATE (#PCDATA)>
1409 	int onUpdate;
1410 
1411 	tmp = xmlTextReaderRead(reader);	//go to ONUPDATE Value
1412 	value = xmlTextReaderValue(reader);  //Value
1413 	if(value)
1414 	{
1415 		tmpInt = WXSTRING_FROM_XML(value);
1416 		onUpdate = wxAtoi(tmpInt);
1417 		xmlFree(value);
1418 	}
1419 	tmp = xmlTextReaderRead(reader);	//go to /ONUPDATE
1420 	tmp = xmlTextReaderRead(reader);	//go to ONDELETE
1421 
1422 	// --> ONDELETE
1423 	//<!ELEMENT ONDELETE (#PCDATA)>
1424 	int onDelete;
1425 	tmp = xmlTextReaderRead(reader);	//go to ONDELETE Value
1426 	value = xmlTextReaderValue(reader);  //Value
1427 	if(value)
1428 	{
1429 		tmpInt = WXSTRING_FROM_XML(value);
1430 		onDelete = wxAtoi(tmpInt);
1431 		xmlFree(value);
1432 	}
1433 	tmp = xmlTextReaderRead(reader);	//go to /ONDELETE
1434 	tmp = xmlTextReaderRead(reader);	//go to MATCHSIMPLE
1435 
1436 	// --> MATCHSIMPLE
1437 	//<!ELEMENT MATCHSIMPLE (#PCDATA)>
1438 	bool matchSimple = false;
1439 	tmp = xmlTextReaderRead(reader);	//go to MATCHSIMPLE Value
1440 	value = xmlTextReaderValue(reader);  //Value of MATCHSIMPLE
1441 	if(value)
1442 	{
1443 		tmpInt = WXSTRING_FROM_XML(value);
1444 		matchSimple = tmpInt.IsSameAs(_("T"));
1445 		xmlFree(value);
1446 	}
1447 	tmp = xmlTextReaderRead(reader);	//go to /MATCHSIMPLE
1448 	tmp = xmlTextReaderRead(reader);	//go to IDENTIFYING
1449 
1450 	// --> IDENTIFYING
1451 	//<!ELEMENT IDENTIFYING (#PCDATA)>
1452 	bool identifying = false;
1453 	tmp = xmlTextReaderRead(reader);	//go to IDENTIFYING Value
1454 	value = xmlTextReaderValue(reader);  //Value of IDENTIFYING
1455 	if(value)
1456 	{
1457 		tmpInt = WXSTRING_FROM_XML(value);
1458 		identifying = tmpInt.IsSameAs(_("T"));
1459 		xmlFree(value);
1460 	}
1461 	tmp = xmlTextReaderRead(reader);	//go to /IDENTIFYING
1462 	tmp = xmlTextReaderRead(reader);	//go to ONETOMANY
1463 
1464 	// --> ONETOMANY
1465 	//<!ELEMENT ONETOMANY (#PCDATA)>
1466 	bool oneToMany = false;
1467 	tmp = xmlTextReaderRead(reader);	//go to ONETOMANY Value
1468 	value = xmlTextReaderValue(reader);  //Value of ONETOMANY
1469 	if(value)
1470 	{
1471 		tmpInt = WXSTRING_FROM_XML(value);
1472 		oneToMany = tmpInt.IsSameAs(_("T"));
1473 		xmlFree(value);
1474 	}
1475 	tmp = xmlTextReaderRead(reader);	//go to /ONETOMANY
1476 	tmp = xmlTextReaderRead(reader);	//go to MANDATORY
1477 
1478 	// --> MANDATORY
1479 	//<!ELEMENT MANDATORY (#PCDATA)>
1480 	bool mandatory = false;
1481 	tmp = xmlTextReaderRead(reader);	//go to MANDATORY Value
1482 	value = xmlTextReaderValue(reader);  //Value of MANDATORY
1483 	if(value)
1484 	{
1485 		tmpInt = WXSTRING_FROM_XML(value);
1486 		mandatory = tmpInt.IsSameAs(_("T"));
1487 		xmlFree(value);
1488 	}
1489 	tmp = xmlTextReaderRead(reader);	//go to /MANDATORY
1490 	tmp = xmlTextReaderRead(reader);	//go to FKFROMPK
1491 
1492 	// --> FKFROMPK
1493 	//<!ELEMENT FKFROMPK (#PCDATA)>
1494 	bool fkFromPk = false;
1495 	tmp = xmlTextReaderRead(reader);	//go to FKFROMPK Value
1496 	value = xmlTextReaderValue(reader);  //Value of FKFROMPK
1497 	if(value)
1498 	{
1499 		tmpInt = WXSTRING_FROM_XML(value);
1500 		fkFromPk = tmpInt.IsSameAs(_("T"));
1501 		xmlFree(value);
1502 	}
1503 	tmp = xmlTextReaderRead(reader);	//go to /FKFROMPK
1504 
1505 
1506 	//refresh relationship after all values were setted
1507 	relation->initRelationValues(source, destination, ukindex, RelationshipName, (actionKind) onUpdate, (actionKind) onDelete, matchSimple, identifying, oneToMany, mandatory, fkFromPk);
1508 
1509 
1510 	// --> RELATIONITEMS
1511 	//<!ELEMENT RELATIONITEMS (RELATIONITEM*)>
1512 	tmp = xmlTextReaderRead(reader);	//go to RELATIONITEMS
1513 	if(getNodeName(reader).IsSameAs(_("RELATIONITEMS")) && getNodeType(reader) == 1 && !xmlTextReaderIsEmptyElement(reader) )
1514 	{
1515 		tmp = xmlTextReaderRead(reader);	//go RELATIONITEM
1516 		do
1517 		{
1518 			//Now only add item to relationship
1519 			ddRelationshipItem *item = getRelationshipItem(reader, relation, source, destination);
1520 			relation->getItemsHashMap()[item->original->getColumnName()] = item;
1521 
1522 			tmp = xmlTextReaderRead(reader);	//go to RELATIONITEM or /RELATIONITEMS
1523 		}
1524 		while(getNodeName(reader).IsSameAs(_("RELATIONITEM"), false));
1525 	}
1526 
1527 	tmp = xmlTextReaderRead(reader);	//go to /RELATIONSHIP
1528 
1529 	relation->updateConnection(0);
1530 	return relation;
1531 }
1532 
getRelationshipItem(xmlTextReaderPtr reader,ddRelationshipFigure * itemOwner,ddTableFigure * source,ddTableFigure * destination)1533 ddRelationshipItem *ddXmlStorage::getRelationshipItem(xmlTextReaderPtr reader, ddRelationshipFigure *itemOwner, ddTableFigure *source, ddTableFigure *destination)
1534 {
1535 	/*
1536 	<!ELEMENT RELATIONITEM (AUTOGENFK, FKCOLNAME,SOURCECOLNAME, INITIALCOLNAME, INITIALALIASNAME )>
1537 	<!ELEMENT AUTOGENFK (#PCDATA)>
1538 	<!ELEMENT FKCOLNAME (#PCDATA)>
1539 	<!ELEMENT SOURCECOLNAME (#PCDATA)>
1540 	<!ELEMENT INITIALCOLNAME (#PCDATA)>
1541 	<!ELEMENT INITIALALIASNAME (#PCDATA)>
1542 	*/
1543 	xmlChar *value;
1544 	wxString tmpInt;
1545 	int tmp;
1546 
1547 	// --> AUTOGENFK
1548 	//<!ELEMENT AUTOGENFK (#PCDATA)>
1549 	bool autoGenFk = false;
1550 	tmp = xmlTextReaderRead(reader);	//go to AUTOGENFK
1551 	tmp = xmlTextReaderRead(reader);	//go to AUTOGENFK Value
1552 	value = xmlTextReaderValue(reader);  //Value of AUTOGENFK
1553 	if(value)
1554 	{
1555 		tmpInt = WXSTRING_FROM_XML(value);
1556 		autoGenFk = tmpInt.IsSameAs(_("T"));
1557 		xmlFree(value);
1558 	}
1559 	tmp = xmlTextReaderRead(reader);	//go to /AUTOGENFK
1560 
1561 	//<!ELEMENT FKCOLNAME (#PCDATA)>
1562 	wxString fkColName;
1563 	tmp = xmlTextReaderRead(reader);	//go to FKCOLNAME
1564 	tmp = xmlTextReaderRead(reader);	//go to FKCOLNAME Value
1565 	value = xmlTextReaderValue(reader);  //Value of FKCOLNAME
1566 	if(value)
1567 	{
1568 		fkColName = WXSTRING_FROM_XML(value);
1569 		xmlFree(value);
1570 	}
1571 	tmp = xmlTextReaderRead(reader);	//go to /FKCOLNAME
1572 
1573 	//<!ELEMENT SOURCECOLNAME (#PCDATA)>
1574 	wxString sourceColName;
1575 	tmp = xmlTextReaderRead(reader);	//go to SOURCECOLNAME
1576 	tmp = xmlTextReaderRead(reader);	//go to SOURCECOLNAME Value
1577 	value = xmlTextReaderValue(reader);  //Value of SOURCECOLNAME
1578 	if(value)
1579 	{
1580 		sourceColName = WXSTRING_FROM_XML(value);
1581 		xmlFree(value);
1582 	}
1583 	tmp = xmlTextReaderRead(reader);	//go to /SOURCECOLNAME
1584 
1585 	//<!ELEMENT INITIALCOLNAME (#PCDATA)>
1586 	wxString initialColName;
1587 	tmp = xmlTextReaderRead(reader);	//go to INITIALCOLNAME
1588 	tmp = xmlTextReaderRead(reader);	//go to INITIALCOLNAME Value
1589 	value = xmlTextReaderValue(reader);  //Value of INITIALCOLNAME
1590 	if(value)
1591 	{
1592 		initialColName = WXSTRING_FROM_XML(value);
1593 		xmlFree(value);
1594 	}
1595 	tmp = xmlTextReaderRead(reader);	//go to /INITIALCOLNAME
1596 
1597 	//<!ELEMENT INITIALALIASNAME (#PCDATA)>
1598 	tmp = xmlTextReaderRead(reader);	//go to INITIALALIASNAME
1599 	wxString initialAliasName = wxEmptyString;
1600 	if(getNodeName(reader).IsSameAs(_("INITIALALIASNAME"), false))
1601 	{
1602 		tmp = xmlTextReaderRead(reader);	//go to INITIALALIASNAME Value
1603 		value = xmlTextReaderValue(reader);  //Value of INITIALALIASNAME
1604 		if(value)
1605 		{
1606 			initialAliasName = WXSTRING_FROM_XML(value);
1607 			xmlFree(value);
1608 		}
1609 		tmp = xmlTextReaderRead(reader);	//go to /INITIALALIASNAME
1610 		tmp = xmlTextReaderRead(reader);	//go to /RELATIONITEM
1611 	}
1612 
1613 	ddRelationshipItem *item = new ddRelationshipItem();
1614 	ddColumnFigure *sourceCol = source->getColByName(sourceColName);
1615 	ddColumnFigure *destinationCol = destination->getColByName(fkColName);
1616 	item->initRelationshipItemValues(itemOwner, destination, autoGenFk, destinationCol, sourceCol, initialColName);
1617 
1618 	return item;
1619 
1620 }
1621 
initDiagrams(xmlTextReaderPtr reader)1622 void ddXmlStorage::initDiagrams(xmlTextReaderPtr reader)
1623 {
1624 	/*
1625 	<!-- DIAGRAMS Element -->
1626 	<!ELEMENT DIAGRAMS (DIAGRAM)>
1627 	<!-- DIAGRAM Element -->
1628 	<!ELEMENT DIAGRAM (NAME, TABLEREF*)>
1629 	<!-- TABLEREF Element -->
1630 	<!ELEMENT TABLEREF EMPTY>
1631 	<!ATTLIST TABLEREF TableID IDREF #REQUIRED >
1632 	*/
1633 
1634 	//At DIAGRAMS Element
1635 	xmlChar *value = NULL;
1636 	wxString diagramName;
1637 	hdDrawing *newDiagram;
1638 	int tmp;
1639 
1640 	//<!ELEMENT DIAGRAM (NAME, TABLEREF*)>
1641 	tmp = xmlTextReaderRead(reader);	//go to DIAGRAM
1642 	if(getNodeName(reader).IsSameAs(_("DIAGRAM")) && getNodeType(reader) == 1 && !xmlTextReaderIsEmptyElement(reader) )
1643 	{
1644 		do
1645 		{
1646 			//<!ELEMENT NAME (#PCDATA)>
1647 			tmp = xmlTextReaderRead(reader);	//go to NAME
1648 			tmp = xmlTextReaderRead(reader);	//go to NAME Value
1649 			value = xmlTextReaderValue(reader);  //Value of NAME
1650 			if(value)
1651 			{
1652 				diagramName = WXSTRING_FROM_XML(value);
1653 				xmlFree(value);
1654 			}
1655 			tmp = xmlTextReaderRead(reader);	//go to /NAME
1656 
1657 			if(tabs && design)
1658 			{
1659 				newDiagram = design->createDiagram(tabs, diagramName, true);
1660 				tabs->AddPage(newDiagram->getView(), diagramName);
1661 			}
1662 			else
1663 			{
1664 				processResult(-1);
1665 			}
1666 			//<!-- TABLEREF Element -->
1667 			//<!ELEMENT TABLEREF EMPTY>
1668 			tmp = xmlTextReaderRead(reader);	//go to TABLEREF
1669 			bool firstTime = true;
1670 			if(getNodeName(reader).IsSameAs(_("TABLEREF")) && xmlTextReaderIsEmptyElement(reader))
1671 			{
1672 				wxString TableID, tableName;
1673 				if(firstTime)
1674 				{
1675 					firstTime = false;
1676 				}
1677 				else
1678 				{
1679 					tmp = xmlTextReaderRead(reader);	//go to TABLEREF
1680 				}
1681 				do
1682 				{
1683 					//<!ATTLIST TABLEREF TableID IDREF #REQUIRED >
1684 					tmp = xmlTextReaderHasAttributes(reader);
1685 					TableID = _("TableID");
1686 					if(tmp)
1687 					{
1688 						value = xmlTextReaderGetAttribute(reader, XML_FROM_WXSTRING(TableID));
1689 					}
1690 
1691 					if(value)
1692 					{
1693 						TableID = WXSTRING_FROM_XML(value);
1694 						xmlFree(value);
1695 					}
1696 
1697 					tableName = design->getTableName(TableID);
1698 					//Add table to diagram
1699 					newDiagram->add(design->getTable(tableName));
1700 					tmp = xmlTextReaderRead(reader);	//go to TABLEREF or /DIAGRAM?
1701 				}
1702 				while(getNodeName(reader).IsSameAs(_("TABLEREF"), false));
1703 			}
1704 			//After adding a new diagram check for all needed relationships at diagram and add it.
1705 			if(design)
1706 			{
1707 				design->getEditor()->checkRelationshipsConsistency(newDiagram->getView()->getIdx());
1708 				newDiagram->getView()->Refresh();
1709 			}
1710 			else
1711 			{
1712 				processResult(-1);
1713 			}
1714 			tmp = xmlTextReaderRead(reader);	//go to DIAGRAM or /DIAGRAMS?
1715 		}
1716 		while(getNodeName(reader).IsSameAs(_("DIAGRAM"), false));
1717 	}
1718 
1719 
1720 
1721 }
1722 
1723 //Temporary DTD will change later
getModelDTD()1724 wxString ddXmlStorage::getModelDTD()
1725 {
1726 	wxString dtd = wxEmptyString;
1727 	dtd += _("<!ELEMENT MODEL (VERSION,TABLE+,RELATIONSHIP*,DIAGRAMS)>");
1728 	dtd += _("<!--Version Element-->");
1729 	dtd += _("<!ELEMENT VERSION EMPTY>");
1730 	dtd += _("<!ATTLIST VERSION VERIXLU CDATA #REQUIRED>");
1731 	dtd += _(" ");
1732 	dtd += _("<!--Atribute Element-->");
1733 	dtd += _("<!ELEMENT Attribute (#PCDATA)>");
1734 	dtd += _(" ");
1735 	dtd += _("<!ATTLIST Attribute");
1736 	dtd += _("	Name CDATA #REQUIRED");
1737 	dtd += _("	Kind (normal | selected) #REQUIRED");
1738 	dtd += _(">");
1739 	dtd += _("<!--Rectangle Element-->");
1740 	dtd += _("<!ELEMENT Rect (x,y,w,h)>");
1741 	dtd += _("<!ATTLIST Name");
1742 	dtd += _("	Name CDATA #REQUIRED");
1743 	dtd += _(">");
1744 	dtd += _("<!ELEMENT 	x (#PCDATA)>");
1745 	dtd += _("<!ELEMENT 	y (#PCDATA)>");
1746 	dtd += _("<!ELEMENT 	w (#PCDATA)>");
1747 	dtd += _("<!ELEMENT 	h (#PCDATA)>");
1748 	dtd += _(" ");
1749 	dtd += _("<!--Column Element-->");
1750 	dtd += _("<!ELEMENT COLUMN (Attribute*,NAME,OPTION,UKINDEX,ISPK,COLUMNTYPE,PRECISION?,SCALE?,GENERATEFKNAME)>");
1751 	dtd += _("<!ELEMENT NAME (#PCDATA)>");
1752 	dtd += _("<!ELEMENT OPTION (#PCDATA)>");
1753 	dtd += _("<!ELEMENT UKINDEX (#PCDATA)>");
1754 	dtd += _("<!ELEMENT ISPK (#PCDATA)>");
1755 	dtd += _("<!ELEMENT COLUMNTYPE (#PCDATA)>");
1756 	dtd += _("<!ELEMENT PRECISION (#PCDATA)>");
1757 	dtd += _("<!ELEMENT SCALE (#PCDATA)>");
1758 	dtd += _("<!ELEMENT GENERATEFKNAME (#PCDATA)>");
1759 	dtd += _(" ");
1760 	dtd += _(" ");
1761 	dtd += _("<!ELEMENT TITLE (NAME,ALIAS?)>");
1762 	dtd += _("<!ELEMENT ALIAS (#PCDATA)>");
1763 	dtd += _(" ");
1764 	dtd += _("<!-- Table Element -->");
1765 	dtd += _("<!ELEMENT TABLE (Attribute*,POINTS,TITLE,UKNAMES?, PKNAME, BEGINDRAWCOLS, BEGINDRAWIDXS, MAXCOLINDEX, MINIDXINDEX, MAXIDXINDEX, COLSROWSSIZE,");
1766 	dtd += _("COLSWINDOW,IDXSROWSSIZE, IDXSWINDOW, COLUMNS )>");
1767 	dtd += _("<!ELEMENT COLUMNS (COLUMN*)>");
1768 	dtd += _("<!ELEMENT UKNAMES (UKNAME+)>");
1769 	dtd += _("<!ELEMENT UKNAME (#PCDATA)>");
1770 	dtd += _("<!ELEMENT PKNAME (#PCDATA)>");
1771 	dtd += _("<!ELEMENT BEGINDRAWCOLS (#PCDATA)>");
1772 	dtd += _("<!ELEMENT BEGINDRAWIDXS (#PCDATA)>");
1773 	dtd += _("<!ELEMENT MAXCOLINDEX (#PCDATA)>");
1774 	dtd += _("<!ELEMENT MINIDXINDEX (#PCDATA)>");
1775 	dtd += _("<!ELEMENT MAXIDXINDEX (#PCDATA)>");
1776 	dtd += _("<!ELEMENT COLSROWSSIZE (#PCDATA)>");
1777 	dtd += _("<!ELEMENT COLSWINDOW (#PCDATA)>");
1778 	dtd += _("<!ELEMENT IDXSROWSSIZE (#PCDATA)>");
1779 	dtd += _("<!ELEMENT IDXSWINDOW (#PCDATA)>");
1780 	dtd += _(" ");
1781 	dtd += _("<!ATTLIST TABLE");
1782 	dtd += _("	TableID ID #REQUIRED");
1783 	dtd += _("	>");
1784 	dtd += _(" ");
1785 	dtd += _(" ");
1786 	dtd += _("<!-- Relationship Element -->");
1787 	dtd += _("<!ELEMENT RELATIONITEMS (RELATIONITEM*)>");
1788 	dtd += _("<!ELEMENT RELATIONITEM (AUTOGENFK, FKCOLNAME,SOURCECOLNAME, INITIALCOLNAME, INITIALALIASNAME? )>");
1789 	dtd += _("<!ELEMENT AUTOGENFK (#PCDATA)>");
1790 	dtd += _("<!ELEMENT FKCOLNAME (#PCDATA)>");
1791 	dtd += _("<!ELEMENT SOURCECOLNAME (#PCDATA)>");
1792 	dtd += _("<!ELEMENT INITIALCOLNAME (#PCDATA)>");
1793 	dtd += _("<!ELEMENT INITIALALIASNAME (#PCDATA)>");
1794 	dtd += _(" ");
1795 	dtd += _(" ");
1796 	dtd += _("<!-- POINTSRELATION Element -->");
1797 	dtd += _("<!ELEMENT POINTSRELATION (POINTS+)>");
1798 	dtd += _("<!-- POINTS Element -->");
1799 	dtd += _("<!ELEMENT POINTS (POINT*)>");
1800 	dtd += _("<!-- POINT Element -->");
1801 	dtd += _("<!ELEMENT POINT (X,Y)>");
1802 	dtd += _("<!ELEMENT X (#PCDATA)>");
1803 	dtd += _("<!ELEMENT Y (#PCDATA)>");
1804 	dtd += _(" ");
1805 	dtd += _(" ");
1806 	dtd += _("<!ELEMENT RELATIONSHIP (Attribute*, POINTSRELATION, UKINDEX, NAME?, ONUPDATE, ONDELETE, MATCHSIMPLE, IDENTIFYING, ONETOMANY, MANDATORY, FKFROMPK, RELATIONITEMS)>");
1807 	dtd += _("<!ELEMENT ONUPDATE (#PCDATA)>");
1808 	dtd += _("<!ELEMENT ONDELETE (#PCDATA)>");
1809 	dtd += _("<!ELEMENT MATCHSIMPLE (#PCDATA)>");
1810 	dtd += _("<!ELEMENT IDENTIFYING (#PCDATA)>");
1811 	dtd += _("<!ELEMENT ONETOMANY (#PCDATA)>");
1812 	dtd += _("<!ELEMENT MANDATORY (#PCDATA)>");
1813 	dtd += _("<!ELEMENT FKFROMPK (#PCDATA)>");
1814 	dtd += _(" ");
1815 	dtd += _("<!ATTLIST RELATIONSHIP SourceTableID IDREF #REQUIRED >");
1816 	dtd += _("<!ATTLIST RELATIONSHIP DestTableID IDREF #REQUIRED >");
1817 	dtd += _(" ");
1818 	dtd += _(" ");
1819 	dtd += _("<!-- DIAGRAMS Element -->");
1820 	dtd += _("<!ELEMENT DIAGRAMS (DIAGRAM*)>");
1821 	dtd += _("<!-- DIAGRAM Element -->");
1822 	dtd += _("<!ELEMENT DIAGRAM (NAME, TABLEREF*)>");
1823 	dtd += _("<!-- TABLEREF Element -->");
1824 	dtd += _("<!ELEMENT TABLEREF EMPTY>");
1825 	dtd += _("<!ATTLIST TABLEREF TableID IDREF #REQUIRED >");
1826 
1827 	return dtd;
1828 }
1829