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