~ubuntu-branches/ubuntu/hardy/libterralib/hardy

« back to all changes in this revision

Viewing changes to src/terralib/kernel/TeDatabase.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Daniel T Chen
  • Date: 2005-11-25 22:32:59 UTC
  • Revision ID: james.westby@ubuntu.com-20051125223259-3zubal8ux4ki4fjg
Tags: upstream-3.0.3b2
ImportĀ upstreamĀ versionĀ 3.0.3b2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/************************************************************************************
 
2
TerraLib - a library for developing GIS applications.
 
3
Copyright ļæ½ 2001-2004 INPE and Tecgraf/PUC-Rio.
 
4
 
 
5
This code is part of the TerraLib library.
 
6
This library is free software; you can redistribute it and/or
 
7
modify it under the terms of the GNU Lesser General Public
 
8
License as published by the Free Software Foundation; either
 
9
version 2.1 of the License, or (at your option) any later version.
 
10
 
 
11
You should have received a copy of the GNU Lesser General Public
 
12
License along with this library.
 
13
 
 
14
The authors reassure the license terms regarding the warranties.
 
15
They specifically disclaim any warranties, including, but not limited to,
 
16
the implied warranties of merchantability and fitness for a particular purpose.
 
17
The library provided hereunder is on an "as is" basis, and the authors have no
 
18
obligation to provide maintenance, support, updates, enhancements, or modifications.
 
19
In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
 
20
indirect, special, incidental, or consequential damages arising out of the use
 
21
of this library and its documentation.
 
22
*************************************************************************************/
 
23
 
 
24
#include "TeDecoderDatabase.h"
 
25
#include "TeRasterRemap.h"
 
26
#include "TeGeometryAlgorithms.h"
 
27
#include "TeSpatialOperations.h"
 
28
#include "TeImportRaster.h"
 
29
#include "TeDatabase.h"
 
30
 
 
31
#include <stdio.h>
 
32
 
 
33
typedef map<int,TeNode> TeNodeMap;
 
34
 
 
35
static const int scales [] =
 
36
{       150000,
 
37
        80000,
 
38
        40000,
 
39
        20000,
 
40
        10000,
 
41
        3000,
 
42
        1500,
 
43
        800,
 
44
        400,
 
45
        200,
 
46
        100,
 
47
        30,
 
48
        15,
 
49
        8,
 
50
        4,
 
51
        2,
 
52
        1
 
53
};
 
54
 
 
55
//-*********************
 
56
 
 
57
TeDatabase::TeDatabase() :
 
58
        isConnected_ (false),
 
59
        host_(""),
 
60
        user_(""),
 
61
        password_(""),
 
62
        database_(""),
 
63
        portNumber_(0),
 
64
        errorNumber_(0),
 
65
        errorMessage_("")
 
66
{
 
67
}
 
68
 
 
69
 
 
70
TeDatabase::~TeDatabase()
 
71
{
 
72
}
 
73
 
 
74
bool TeDatabase::validTable (TeTable& table)
 
75
{
 
76
        int cont=0;
 
77
        bool change = false;
 
78
        bool changeTable = false;
 
79
        bool uniqueName, linkName; 
 
80
        
 
81
        TeAttributeList::iterator it = table.attributeList().begin();
 
82
        TeAttributeList::iterator it2;  
 
83
        while(it != table.attributeList().end())
 
84
        {
 
85
                uniqueName = false;
 
86
                linkName = false;
 
87
 
 
88
                if((*it).rep_.name_==table.uniqueName())
 
89
                        uniqueName=true;
 
90
                
 
91
                if((*it).rep_.name_==table.linkName())
 
92
                        linkName=true;
 
93
 
 
94
                string errorMess;
 
95
                string temp = TeCheckName((*it).rep_.name_, change, errorMess);
 
96
                
 
97
                if(change)
 
98
                {
 
99
                        it2 = table.attributeList().begin();
 
100
                        while(it2!=table.attributeList().end())
 
101
                        {
 
102
                                if(temp==(*it2).rep_.name_)
 
103
                                {
 
104
                                        temp += Te2String(cont);
 
105
                                        it2 = table.attributeList().begin();
 
106
                                        ++cont;
 
107
                                }
 
108
                                else
 
109
                                        ++it2;
 
110
                        }
 
111
 
 
112
                        changeTable = true;
 
113
                }
 
114
 
 
115
                if(change && uniqueName)
 
116
                        table.setUniqueName(temp);
 
117
                if(change && linkName)
 
118
                        table.setLinkName (temp);
 
119
 
 
120
                (*it).rep_.name_ = temp;
 
121
                ++it;
 
122
                ++cont;
 
123
        }
 
124
        
 
125
        return changeTable;
 
126
}
 
127
 
 
128
string TeDatabase::getTableName(int tableId)
 
129
{
 
130
        string tableName;
 
131
 
 
132
        TeDatabasePortal* pt = getPortal();
 
133
        string q = "SELECT attr_table FROM te_layer_table";
 
134
        q += " WHERE table_id = " + Te2String(tableId);
 
135
        if (pt->query(q) == true && pt->fetchRow())
 
136
                tableName = pt->getData("attr_table");
 
137
        delete pt;
 
138
        return tableName;
 
139
}
 
140
 
 
141
bool TeDatabase::createTable(const string& table, TeAttributeList &attr)
 
142
{
 
143
        string  q ="CREATE TABLE " + table +" (";
 
144
        string  type;
 
145
        char    size[8];
 
146
        bool    first=true;
 
147
 
 
148
        string pkeys;
 
149
 
 
150
        TeAttributeList::iterator it;
 
151
        it = attr.begin();
 
152
        while ( it != attr.end() )
 
153
        {
 
154
                string name = (*it).rep_.name_;
 
155
                
 
156
                switch ((*it).rep_.type_)
 
157
                {
 
158
                        case TeSTRING:
 
159
                                type = "VARCHAR ";
 
160
                                sprintf (size,"(%d)",(*it).rep_.numChar_);
 
161
                                type += string (size);
 
162
                                break;
 
163
                        case TeREAL:
 
164
                                type = "DOUBLE";
 
165
                                sprintf (size,"(%d,%d)",(*it).rep_.numChar_, (*it).rep_.decimals_);
 
166
                                type += string (size);
 
167
                                break;
 
168
                        case TeINT:
 
169
                                type = "INT ";
 
170
                                break;
 
171
                        case TeCHARACTER:
 
172
                                type = "CHAR ";
 
173
                                break;
 
174
                        case TeDATETIME:
 
175
                                type = "DATETIME ";  //time
 
176
                                break;
 
177
                        case TeBLOB:
 
178
                                type = "BLOB ";
 
179
                                break;
 
180
                        default:
 
181
                                type = "VARCHAR ";
 
182
                                sprintf (size,"(%d)",(*it).rep_.numChar_);
 
183
                                type += string (size);
 
184
                                break;
 
185
                }
 
186
 
 
187
                if((*it).rep_.isAutoNumber_ && (*it).rep_.isPrimaryKey_)
 
188
                        type += " AUTO_INCREMENT ";
 
189
                                
 
190
                if (!first)
 
191
                        q += ",";
 
192
                else
 
193
                        first = false;
 
194
                
 
195
                q += name + " " + type;
 
196
 
 
197
                // check if column is part of primary key
 
198
                if ( (*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
 
199
                {
 
200
                        if (!pkeys.empty())
 
201
                                pkeys += ", ";
 
202
                        pkeys += (*it).rep_.name_;
 
203
                        q += " NOT NULL ";
 
204
                }
 
205
                
 
206
                ++it;
 
207
        }
 
208
 
 
209
        if (!pkeys.empty())
 
210
                q += ", PRIMARY KEY (" + pkeys + ") ";
 
211
        q += ")";
 
212
 
 
213
        return execute(q);
 
214
}
 
215
 
 
216
bool
 
217
TeDatabase::deleteTable (const string& table)
 
218
{
 
219
        int f = table.find ("te_collection", std::string::npos);
 
220
 
 
221
        if( table=="te_theme" ||
 
222
                table=="te_layer" ||
 
223
                table=="te_representation" ||
 
224
                table=="te_tables_relation" ||
 
225
                table=="te_layer_table" ||
 
226
                table=="te_raster_metadata" ||
 
227
                table=="te_projection" ||
 
228
                table=="te_view" ||
 
229
                table=="te_legend" ||
 
230
                table=="te_visual" ||
 
231
                table=="te_database" ||
 
232
                f == 0)
 
233
        {
 
234
                errorMessage_ = "Nļæ½o ļæ½ possļæ½vel deletar tabelas do modelo!";
 
235
                return false;
 
236
        }
 
237
 
 
238
        string del = "DROP TABLE " + table;
 
239
        if(!execute(del))
 
240
                return false;
 
241
 
 
242
        return true;
 
243
}
 
244
 
 
245
 
 
246
bool 
 
247
TeDatabase::deleteColumn (const string& table, const string& colName)
 
248
{
 
249
        if (!tableExist(table))
 
250
                return false;
 
251
        TeAttribute attr;
 
252
        if (!columnExist(table,colName,attr))
 
253
                return true;
 
254
        string drop = "ALTER  TABLE " + table + " DROP COLUMN " + colName;
 
255
        if(execute(drop) == false)
 
256
                return false;
 
257
 
 
258
        string tableId;
 
259
        TeDatabasePortal* portal = getPortal();
 
260
        string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + table + "'";
 
261
        if(portal->query(sql) && portal->fetchRow())
 
262
                tableId = portal->getData(0);
 
263
 
 
264
        delete portal;
 
265
        if(tableId.empty() == false)
 
266
        {
 
267
                // delete relation
 
268
                sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
 
269
                sql += " AND related_attr = '" + colName + "')";
 
270
                sql += " OR (external_table_name = '" + table + "'";
 
271
                sql += " AND external_attr = '" + colName + "')";
 
272
                if(execute(sql) == false)
 
273
                        return false;
 
274
 
 
275
                // delete grouping
 
276
                TeDatabasePortal* portal = getPortal();
 
277
                sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + table + "." + colName + "'";
 
278
                if(portal->query(sql) && portal->fetchRow())
 
279
                {
 
280
                        string themeId = portal->getData(0);
 
281
 
 
282
                        sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
 
283
                        if(execute(sql) == false)
 
284
                        {
 
285
                                delete portal;
 
286
                                return false;
 
287
                        }
 
288
                }
 
289
                delete portal;
 
290
 
 
291
                sql = "DELETE FROM te_grouping";
 
292
                sql += " WHERE grouping_attr = '" + table + "." + colName + "'";
 
293
                if(execute(sql) == false)
 
294
                        return false;
 
295
        }
 
296
        return true;
 
297
}
 
298
 
 
299
 
 
300
bool 
 
301
TeDatabase::defineIntegrity(void)
 
302
{
 
303
        if (existRelation("te_layer","fk_layer_proj_id") == TeNoRelation )
 
304
                if (!createRelation("fk_layer_proj_id", "te_layer", "projection_id", "te_projection", "projection_id", false))
 
305
                        return false;
 
306
        
 
307
        if (existRelation("te_representation","fk_rep_layer_id") == TeNoRelation )
 
308
                if (!createRelation("fk_rep_layer_id", "te_representation", "layer_id", "te_layer", "layer_id", true))
 
309
                        return false;
 
310
 
 
311
        if (existRelation("te_view","fk_view_proj_id") == TeNoRelation )
 
312
                if (!createRelation("fk_view_proj_id", "te_view", "projection_id", "te_projection", "projection_id", false))
 
313
                        return false;
 
314
 
 
315
        if (existRelation("te_theme","fk_theme_layer_id") == TeNoRelation )
 
316
                if (!createRelation("fk_theme_layer_id", "te_theme", "layer_id", "te_layer", "layer_id", true))
 
317
                        return false;
 
318
 
 
319
        if (existRelation("te_theme","fk_theme_view_id") == TeNoRelation )
 
320
                if (!createRelation("fk_theme_view_id", "te_theme", "view_id", "te_view", "view_id", true))
 
321
                        return false;
 
322
 
 
323
        if (existRelation("te_theme_table","fk_thmtable_theme_id") == TeNoRelation )
 
324
                if (!createRelation("fk_thmtable_theme_id", "te_theme_table", "theme_id", "te_theme", "theme_id", true))
 
325
                        return false;
 
326
 
 
327
        if (existRelation("te_theme_table","fk_thmtable_lytable_id") == TeNoRelation )
 
328
                if (!createRelation("fk_thmtable_lytable_id", "te_theme_table", "table_id", "te_layer_table", "table_id", true))
 
329
                        return false;
 
330
 
 
331
        if (existRelation("te_theme_table","fk_thmtable_relation_id") == TeNoRelation )
 
332
                if (!createRelation("fk_thmtable_relation_id", "te_theme_table", "relation_id", "te_tables_relation", "relation_id", true))
 
333
                        return false;
 
334
 
 
335
        if (existRelation("te_grouping","fk_group_theme_id") == TeNoRelation )
 
336
                if (!createRelation("fk_group_theme_id", "te_grouping", "theme_id", "te_theme", "theme_id", true))
 
337
                        return false;
 
338
 
 
339
        if (existRelation("te_legend","fk_legend_theme_id") == TeNoRelation )
 
340
                if (!createRelation("fk_legend_theme_id", "te_legend", "theme_id", "te_theme", "theme_id", true))
 
341
                        return false;
 
342
 
 
343
        if (existRelation("te_visual","fk_visual_legend_id") == TeNoRelation )
 
344
                if (!createRelation("fk_visual_legend_id", "te_visual", "legend_id", "te_legend", "legend_id", true))
 
345
                        return false;
 
346
        
 
347
        if (existRelation("te_layer_table","fk_laytable_layer_id") == TeNoRelation )
 
348
                if (!createRelation ("fk_laytable_layer_id", "te_layer_table", "layer_id", "te_layer", "layer_id", true))
 
349
                        return false;
 
350
        
 
351
        if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") == TeNoRelation )
 
352
                if (!createRelation("fk_tabrelation_laytable_id", "te_tables_relation", "related_table_id", "te_layer_table", "table_id", true))
 
353
                        return false;
 
354
 
 
355
        if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
 
356
                if (!createRelation("fk_visrast_theme_id", "te_visual_raster", "theme_id", "te_theme", "theme_id", true))
 
357
                        return false;
 
358
 
 
359
        return true;
 
360
}
 
361
 
 
362
bool 
 
363
TeDatabase::createConceptualModel(bool withIntegrity, bool newDatabase, bool /* createIndex */)
 
364
{
 
365
        bool status = true;
 
366
        bool createMainTables = false;
 
367
        
 
368
        if (!this->tableExist("te_projection"))
 
369
        {
 
370
                status = this->createProjectionTable();
 
371
                if (!status)
 
372
                        return false;   
 
373
                createMainTables = true;
 
374
        }
 
375
 
 
376
        if (!this->tableExist("te_layer"))
 
377
        {
 
378
                status = this->createLayerTable();
 
379
                if (!status)
 
380
                        return false;
 
381
                createMainTables = true;
 
382
        }
 
383
 
 
384
        if (!this->tableExist("te_layer_table"))
 
385
        {
 
386
                status = this->createLayerTableTable();
 
387
                if (!status)
 
388
                        return false;
 
389
                createMainTables = true;
 
390
        }
 
391
 
 
392
        if (!this->tableExist("te_tables_relation"))
 
393
        {
 
394
                status = this->createTablesRelationTable();
 
395
                if (!status)
 
396
                        return false;
 
397
        }
 
398
        
 
399
        if (!this->tableExist("te_representation"))
 
400
        {
 
401
                status = this->createRepresentationTable();
 
402
                if (!status)
 
403
                        return false;
 
404
                createMainTables = true;
 
405
        }
 
406
 
 
407
        if (!this->tableExist("te_view"))
 
408
        {
 
409
                status = this->createViewTable();
 
410
                if (!status)
 
411
                        return false;
 
412
                createMainTables = true;
 
413
        }
 
414
 
 
415
        if (!this->tableExist("te_theme"))
 
416
        {
 
417
                status = this->createThemeTable();
 
418
                if (!status)
 
419
                        return false;
 
420
        }
 
421
 
 
422
        if (!this->tableExist("te_grouping"))
 
423
        {
 
424
                status = this->createGroupingTable();
 
425
                if (!status)
 
426
                        return false;
 
427
        }
 
428
 
 
429
        if (!this->tableExist("te_theme_table"))
 
430
        {
 
431
                status = this->createThemeTablesTable();
 
432
                if (!status)
 
433
                        return false;
 
434
        }
 
435
 
 
436
        if (!this->tableExist("te_legend"))
 
437
        {
 
438
                status = this->createLegendTable();
 
439
                if (!status)
 
440
                        return false;   
 
441
        }
 
442
 
 
443
        if (!this->tableExist("te_visual"))
 
444
        {
 
445
                status = this->createVisualTable();
 
446
                if (!status)
 
447
                        return false;   
 
448
        }
 
449
 
 
450
        if (!this->tableExist("te_visual_raster"))
 
451
        {
 
452
                status = this->createVisualRasterTable();
 
453
                if (!status)
 
454
                        return false;   
 
455
        }
 
456
 
 
457
        if (!this->tableExist("te_database"))
 
458
        {
 
459
                status = this->createDatabaseTable();
 
460
                if (!status)
 
461
                        return false;
 
462
        }
 
463
 
 
464
        if(newDatabase || createMainTables)
 
465
        {
 
466
                string ins = "INSERT INTO te_database (db_version) VALUES ('3.0.2')";
 
467
                if (!execute(ins))
 
468
                        return false;
 
469
        }
 
470
 
 
471
        if (withIntegrity)
 
472
                status = defineIntegrity();
 
473
 
 
474
        return status;
 
475
}
 
476
 
 
477
bool
 
478
TeDatabase::createIndex(const string& tableName, const string& indexName, const string& columnsName)
 
479
{
 
480
        string sql = "CREATE INDEX " + indexName + " ON " + tableName + "(" + columnsName + ")";        
 
481
        return execute (sql);
 
482
}
 
483
 
 
484
bool 
 
485
TeDatabase::createDatabaseTable()
 
486
{
 
487
        string create = "CREATE TABLE te_database (";
 
488
        create += "db_version           VARCHAR(50) NOT NULL,";
 
489
        create += "db_creation          DATETIME,";
 
490
        create += "PRIMARY KEY (db_version))";
 
491
        return execute (create);
 
492
}
 
493
 
 
494
 
 
495
bool 
 
496
TeDatabase::createProjectionTable ()
 
497
{
 
498
        string create = "CREATE TABLE te_projection (";
 
499
        create += "projection_id        INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
500
        create += "name                         VARCHAR(50) NOT NULL,";
 
501
        create += "long0                        DOUBLE(24,15) DEFAULT '0.0',";
 
502
        create += "lat0                         DOUBLE(24,15) DEFAULT '0.0',";
 
503
        create += "offx                         DOUBLE(24,15) DEFAULT '0.0',";
 
504
        create += "offy                         DOUBLE(24,15) DEFAULT '0.0',";
 
505
        create += "stlat1                       DOUBLE(24,15) DEFAULT '0.0',";
 
506
        create += "stlat2                       DOUBLE(24,15) DEFAULT '0.0',";
 
507
        create += "unit                         VARCHAR(50) NOT NULL,";
 
508
        create += "scale                        DOUBLE(24,15) DEFAULT '0.0',";
 
509
        create += "hemis                        INT(4) NOT NULL,";
 
510
        create += "datum                        VARCHAR(50) NOT NULL,";
 
511
        create += "radius                       DOUBLE(24,15) DEFAULT '0.0',";
 
512
        create += "flattening           DOUBLE(24,15) DEFAULT '0.0',";
 
513
        create += "dx                           DOUBLE(24,15) DEFAULT '0.0',";
 
514
        create += "dy                           DOUBLE(24,15) DEFAULT '0.0',";
 
515
        create += "dz                           DOUBLE(24,15) DEFAULT '0.0',";
 
516
        create += "PRIMARY KEY (projection_id))";
 
517
        return execute (create);
 
518
}
 
519
 
 
520
bool TeDatabase::createLayerTable ()
 
521
{
 
522
        string create = "CREATE TABLE te_layer (";
 
523
        create += "layer_id                     INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
524
        create += "projection_id        INT(10) UNSIGNED NOT NULL,";
 
525
        create += "name                         VARCHAR(255) NOT NULL,";
 
526
        create += "lower_x                      DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
 
527
        create += "lower_y                      DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
 
528
        create += "upper_x                      DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
 
529
        create += "upper_y                      DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
 
530
        create += "initial_time         DATETIME,";
 
531
        create += "final_time           DATETIME, ";
 
532
        create += "PRIMARY KEY (layer_id))";
 
533
        return execute (create);
 
534
}
 
535
 
 
536
bool TeDatabase::createLayerTableTable()
 
537
{
 
538
        string create = "CREATE TABLE te_layer_table (";
 
539
        create += "table_id                             INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
540
        create += "layer_id                             INT(10) UNSIGNED,";
 
541
        create += "attr_table                   VARCHAR(255) NOT NULL,";
 
542
        create += "unique_id                    VARCHAR(255), ";
 
543
        create += "attr_link                    VARCHAR(255), ";
 
544
        create += "attr_initial_time    VARCHAR(255), ";
 
545
        create += "attr_final_time              VARCHAR(255), ";
 
546
        create += "attr_time_unit               INT(4) UNSIGNED, ";
 
547
        create += "attr_table_type              INT(4) UNSIGNED, ";
 
548
        create += "user_name                    VARCHAR(255),";
 
549
        create += "initial_time                 DATETIME,";
 
550
        create += "final_time                   DATETIME, ";
 
551
        create += "PRIMARY KEY (table_id))";
 
552
        return execute (create);
 
553
}
 
554
 
 
555
bool 
 
556
TeDatabase::updateTableInfo(int layerId, TeTable &table, const string user)
 
557
{
 
558
        if (table.id() <= 0 )  // table information doesnļæ½t exist in database yet
 
559
                return this->insertTableInfo(layerId,table,user);
 
560
        string sql;
 
561
        sql = "UPDATE te_layer_table SET ";
 
562
        sql += "unique_id='" + table.uniqueName() + "', ";
 
563
        sql += "attr_link='" + table.linkName() + "', ";
 
564
        sql += "attr_initial_time='" + table.attInitialTime() + "', ";
 
565
        sql += "attr_final_time='" + table.attFinalTime() + "', ";
 
566
        sql += "attr_time_unit=" + Te2String(table.attTimeUnit()) + ", ";
 
567
        sql += "attr_table_type="+ Te2String(table.tableType()) + ", ";
 
568
        sql += "user_name='" + user + "' WHERE ";
 
569
        sql += "layer_id=" + Te2String(layerId) + " AND ";
 
570
        sql += "attr_table_name='" + table.name() + "'";
 
571
        return execute (sql);
 
572
}
 
573
 
 
574
bool 
 
575
TeDatabase::loadTableInfo(TeTable& table)
 
576
{
 
577
        if (table.name().empty())
 
578
                return false;
 
579
 
 
580
        TeDatabasePortal* portal = this->getPortal();
 
581
        if(!portal)
 
582
        {
 
583
                this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
 
584
                return false;
 
585
        }
 
586
        
 
587
        string get =  "SELECT * FROM te_layer_table WHERE attr_table = '" + table.name() + "'";
 
588
        if (!portal->query(get) || !portal->fetchRow())
 
589
        {       
 
590
                delete portal;
 
591
                return false;
 
592
        }
 
593
 
 
594
        table.setId(portal->getInt("table_id"));
 
595
        table.setLinkName(portal->getData("attr_link"));
 
596
        table.setUniqueName(portal->getData("unique_id"));
 
597
        table.setTableType(TeAttrTableType(portal->getInt("attr_table_type")));
 
598
        TeAttributeList attrList;
 
599
        getAttributeList(table.name(), attrList);
 
600
        table.setAttributeList(attrList);
 
601
        table.attInitialTime(portal->getData("attr_initial_time"));
 
602
        table.attFinalTime(portal->getData("attr_final_time"));
 
603
        table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
 
604
        delete portal;
 
605
        return true;
 
606
}
 
607
 
 
608
 
 
609
bool TeDatabase::createLUTTable(const string& name)
 
610
{
 
611
        string create = "CREATE TABLE " + name + "(";
 
612
        create += "index_id             INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
613
        create += "r_val                INT(10) UNSIGNED NOT NULL,";
 
614
        create += "g_val                INT(10) NOT NULL,";
 
615
        create += "b_val                INT(10) NOT NULL,";
 
616
        create += "PRIMARY KEY (index_id))";
 
617
        return execute (create);
 
618
}
 
619
 
 
620
bool TeDatabase::createTablesRelationTable()
 
621
{
 
622
        string create = "CREATE TABLE te_tables_relation (";
 
623
        create += "relation_id                  INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
624
        create += "related_table_id             INT(10) NOT NULL,";
 
625
        create += "related_attr                 VARCHAR(255) NOT NULL,";
 
626
        create += "external_table_name  VARCHAR(255) NOT NULL,";
 
627
        create += "external_attr                VARCHAR(255) NOT NULL,";
 
628
        create += "PRIMARY KEY (relation_id))";
 
629
        return execute (create);
 
630
}
 
631
 
 
632
bool TeDatabase::createRepresentationTable ()
 
633
{
 
634
        string create = "CREATE TABLE te_representation (";
 
635
        create += "repres_id                    INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
 
636
        create += "layer_id                             INT(10) UNSIGNED NOT NULL, ";
 
637
        create += "geom_type                    INT(10) NOT NULL, ";
 
638
        create += "geom_table                   VARCHAR(255) NOT NULL, ";
 
639
        create += "description                  VARCHAR(255), ";
 
640
        create += "lower_x                              DOUBLE(24,15) DEFAULT '0.0', ";
 
641
        create += "lower_y                              DOUBLE(24,15) DEFAULT '0.0', ";
 
642
        create += "upper_x                              DOUBLE(24,15) DEFAULT '0.0', ";
 
643
        create += "upper_y                              DOUBLE(24,15) DEFAULT '0.0', ";
 
644
        create += "res_x                                DOUBLE(24,15) DEFAULT '0.0', ";
 
645
        create += "res_y                                DOUBLE(24,15) DEFAULT '0.0', ";
 
646
        create += "num_cols                             INT(10), ";
 
647
        create += "num_rows                             INT(10), ";
 
648
        create += "initial_time                 DATETIME, ";
 
649
        create += "final_time                   DATETIME, ";
 
650
        create += "PRIMARY KEY (repres_id), ";
 
651
        create += "INDEX representation_index (layer_id,geom_type))";
 
652
        return execute (create);
 
653
}
 
654
 
 
655
bool TeDatabase::createRasterMetadataTable(const string& tableName)
 
656
{
 
657
        if (tableName.empty())
 
658
                return false;
 
659
 
 
660
        string create = "CREATE TABLE " + tableName + " (";
 
661
        create += " geom_id                             INT(10) UNSIGNED NOT NULL, ";
 
662
        create += " band_id                             INT(10) UNSIGNED NOT NULL, ";
 
663
        create += " min_value                   DOUBLE(24,15) DEFAULT '0.0', ";
 
664
        create += " max_value                   DOUBLE(24,15) DEFAULT '0.0', ";
 
665
        create += " num_bits                    INT(10), ";
 
666
        create += " data_type                   INT(4), ";
 
667
        create += " photometric_type    INT(4), ";
 
668
        create += " compression_type    INT(4), ";
 
669
        create += " dummy                               DOUBLE(24,15), ";
 
670
        create += " PRIMARY KEY (geom_id, band_id))";
 
671
        return execute (create);
 
672
}
 
673
 
 
674
 
 
675
bool TeDatabase::createRasterGeometry(const string& tableName)
 
676
{
 
677
        if (tableName.empty())
 
678
                return false;
 
679
 
 
680
        string create = "CREATE TABLE " + tableName + " (";
 
681
        create += "geom_id                      INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
 
682
        create += "object_id            VARCHAR(255) NOT NULL, ";
 
683
        create += "raster_table         VARCHAR(255) NOT NULL, ";
 
684
        create += "lut_table            VARCHAR(255), ";
 
685
        create += "res_x                        DOUBLE(24,15) DEFAULT '0.0', ";
 
686
        create += "res_y                        DOUBLE(24,15) DEFAULT '0.0', ";
 
687
        create += "num_bands            INT(10), ";
 
688
        create += "num_cols                     INT(10), ";
 
689
        create += "num_rows                     INT(10), ";
 
690
        create += "block_height         INT(10), ";
 
691
        create += "block_width          INT(10), ";
 
692
        create += "lower_x                      DOUBLE(24,15) DEFAULT '0.0', ";
 
693
        create += "lower_y                      DOUBLE(24,15) DEFAULT '0.0', ";
 
694
        create += "upper_x                      DOUBLE(24,15) DEFAULT '0.0', ";
 
695
        create += "upper_y                      DOUBLE(24,15) DEFAULT '0.0', ";
 
696
        create += "tiling_type      INT(4), ";
 
697
        create += "PRIMARY KEY (geom_id), ";
 
698
        create += "INDEX " + tableName + "_index(object_id))";
 
699
        return execute (create);
 
700
}
 
701
 
 
702
bool TeDatabase::createViewTable ()
 
703
{
 
704
        string create = "CREATE TABLE te_view (";
 
705
        create += "view_id                      INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
706
        create += "projection_id        INT(10) UNSIGNED NOT NULL,";
 
707
        create += "name                         VARCHAR(255) NOT NULL,";
 
708
        create += "user_name            VARCHAR(255),";
 
709
        create += "visibility           INT(4),";
 
710
        create += "PRIMARY KEY (view_id))";
 
711
        return execute (create);
 
712
}
 
713
 
 
714
bool TeDatabase::createThemeTable ()
 
715
{
 
716
        string create = "CREATE TABLE te_theme (";
 
717
        create += " theme_id                    INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
718
        create += " layer_id                    INT(10) UNSIGNED,";
 
719
        create += " view_id                             INT(10) UNSIGNED NOT NULL,";
 
720
        create += " name                                VARCHAR(255) NOT NULL,";
 
721
        create += " parent_id                   INT(10) UNSIGNED NOT NULL,";
 
722
        create += " priority                    INT(10) UNSIGNED NOT NULL,";
 
723
        create += " node_type                   INT(4) UNSIGNED NOT NULL,";
 
724
        create += " min_scale                   DOUBLE(24,15),";
 
725
        create += " max_scale                   DOUBLE(24,15),";
 
726
        create += " generate_attribute_where    VARCHAR(255),";
 
727
        create += " generate_spatial_where              VARCHAR(255),";
 
728
        create += " generate_temporal_where             VARCHAR(255),";
 
729
        create += " collection_table                    VARCHAR(255),";
 
730
        create += " visible_rep                                 INT(10) UNSIGNED,";
 
731
        create += " enable_visibility                   INT(10) UNSIGNED,";
 
732
        create += " PRIMARY KEY (theme_id),";
 
733
        create += " INDEX view_id_idx(view_id))";
 
734
        return execute (create);
 
735
}
 
736
 
 
737
bool TeDatabase::createGroupingTable()
 
738
{
 
739
        string create = "CREATE TABLE te_grouping (";
 
740
        create += " theme_id                    INT(10) UNSIGNED NOT NULL,";
 
741
        create += " grouping_number             INT(10) UNSIGNED,";
 
742
        create += " grouping_attr               VARCHAR(255),";
 
743
        create += " grouping_attr_type  INT(4) UNSIGNED,";
 
744
        create += " grouping_mode               INT(4) UNSIGNED,";
 
745
        create += " grouping_norm_attr  VARCHAR(255),";
 
746
        create += " grouping_std_dev    DOUBLE(24,15) DEFAULT '0.0',";
 
747
        create += " grouping_precision  INT(10) UNSIGNED,";
 
748
        create += " grouping_function   VARCHAR(20),";
 
749
        create += " PRIMARY KEY (theme_id))";
 
750
        return execute (create);
 
751
}
 
752
 
 
753
bool TeDatabase::createThemeTablesTable()
 
754
{
 
755
        string create = "CREATE TABLE te_theme_table  (";
 
756
        create += " theme_table_id              INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
757
        create += " theme_id                    INT(10) UNSIGNED NOT NULL,";
 
758
        create += " table_id                    INT(10) UNSIGNED NOT NULL,";
 
759
        create += " relation_id                 INT(10) UNSIGNED,";
 
760
        create += " table_order                 INT(10) UNSIGNED,";
 
761
        create += " PRIMARY KEY (theme_table_id), ";
 
762
        create += " INDEX theme_table_index(theme_id))";
 
763
 
 
764
        return execute (create);
 
765
}
 
766
 
 
767
bool TeDatabase::createLegendTable ()
 
768
{
 
769
        string create = "CREATE TABLE te_legend (";
 
770
        create += " legend_id           INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
771
        create += " theme_id            INT(10) UNSIGNED NOT NULL,";
 
772
        create += " group_id            INT(10) ,";
 
773
        create += " num_objs            INT(10) UNSIGNED,";
 
774
        create += " lower_value         VARCHAR(255),";
 
775
        create += " upper_value         VARCHAR(255),";
 
776
        create += " label                       VARCHAR(255), ";
 
777
        create += " PRIMARY KEY (legend_id),";
 
778
        create += " INDEX legend_index (theme_id))";
 
779
        return execute (create);
 
780
}
 
781
 
 
782
 
 
783
bool TeDatabase::createVisualTable()
 
784
{
 
785
        string create = "CREATE TABLE te_visual (";
 
786
        create += " legend_id           INT(10) UNSIGNED NOT NULL,";
 
787
        create += " geom_type           INT(4) UNSIGNED NOT NULL,";
 
788
        create += " lib_name            VARCHAR(255), ";
 
789
        create += " symb_id                     INT(10), ";
 
790
        create += " red                         INT(4) UNSIGNED,";
 
791
        create += " green                       INT(4) UNSIGNED,";
 
792
        create += " blue                        INT(4) UNSIGNED,";
 
793
        create += " transparency        INT(4) UNSIGNED,";
 
794
        create += " width                       INT(4) UNSIGNED,";
 
795
        create += " contour_lib_name    VARCHAR(255), ";
 
796
        create += " contour_symb_id             INT(10), ";
 
797
        create += " contour_red                 INT(4) UNSIGNED,";
 
798
        create += " contour_green               INT(4) UNSIGNED,";
 
799
        create += " contour_blue                INT(4) UNSIGNED,";
 
800
        create += " contour_transp              INT(4) UNSIGNED,";
 
801
        create += " contour_width               INT(10) UNSIGNED,";
 
802
        create += " size_value                  INT(10) UNSIGNED,";
 
803
        create += " pt_angle                    INT(4) UNSIGNED,";
 
804
        create += " family                              VARCHAR(255),";
 
805
        create += " bold                                INT(4) UNSIGNED,";
 
806
        create += " italic                              INT(4) UNSIGNED,";
 
807
        create += " alignment_vert              DOUBLE(24,15),";
 
808
        create += " alignment_horiz             DOUBLE(24,15),";
 
809
        create += " tab_size                    INT(4) UNSIGNED,";
 
810
        create += " line_space                  INT(4) UNSIGNED,";
 
811
        create += " fixed_size                  INT(4) UNSIGNED,";
 
812
        create += " PRIMARY KEY (legend_id, geom_type))";
 
813
        return execute (create);
 
814
}
 
815
 
 
816
bool TeDatabase::createVisualRasterTable()
 
817
{
 
818
        string create = "CREATE TABLE te_visual_raster (";
 
819
        create += " theme_id            INT(10) UNSIGNED NOT NULL,";
 
820
        create += " band_in                     INT(4) UNSIGNED NOT NULL,";
 
821
        create += " band_out            INT(4) UNSIGNED, ";
 
822
        create += " transf_type         INT(4), ";
 
823
        create += " param1                      DOUBLE(24,15),";
 
824
        create += " param2                      DOUBLE(24,15),";
 
825
        create += " lut_table           VARCHAR(255), ";
 
826
        create += " PRIMARY KEY (theme_id, band_in))";
 
827
        return execute (create);
 
828
}
 
829
 
 
830
bool TeDatabase::insertVisual (TeLegendEntry *legend)
 
831
{
 
832
        TeGeomRepVisualMap mapVis = legend->getVisualMap();
 
833
        TeGeomRepVisualMap::iterator it =  mapVis.begin();
 
834
        while ( it != mapVis.end())
 
835
        { 
 
836
                TeGeomRep rep = it->first;
 
837
                TeVisual vis = it->second;
 
838
                
 
839
                string style, contourStyle, sizeValue, width;
 
840
 
 
841
                if(rep == TePOLYGONS || rep == TeCELLS)
 
842
                {
 
843
                        sizeValue = Te2String(0);
 
844
                        contourStyle = Te2String(vis.contourStyle());
 
845
                        width =  Te2String(0);
 
846
                        style = Te2String(vis.style());
 
847
                }
 
848
                else if(rep == TeLINES)
 
849
                {
 
850
                        sizeValue = Te2String(0);
 
851
                        contourStyle = Te2String(0);
 
852
                        width = Te2String(vis.width());
 
853
                        style = Te2String(vis.style());
 
854
                }
 
855
                else if(rep == TePOINTS)
 
856
                {
 
857
                        sizeValue = Te2String(vis.size());
 
858
                        contourStyle = Te2String(0);
 
859
                        width = Te2String(0);
 
860
                        style = Te2String(vis.style());
 
861
                }
 
862
                else if(rep == TeTEXT)
 
863
                {
 
864
                        sizeValue = Te2String(vis.size());
 
865
                        contourStyle = Te2String(0);
 
866
                        width = Te2String(0);
 
867
                        style = Te2String(0);
 
868
                }
 
869
                
 
870
                string insert = "INSERT INTO te_visual(legend_id, geom_type, ";
 
871
                insert += "lib_name, symb_id, "; 
 
872
                insert += "red, green, blue, transparency, width, ";
 
873
                insert += "contour_lib_name, contour_symb_id, "; 
 
874
                insert += "contour_red, contour_green,";
 
875
                insert += "contour_blue, contour_transp, contour_width, size_value,";
 
876
                insert += "pt_angle, family, bold, italic, ";
 
877
                insert += "alignment_vert, alignment_horiz, tab_size, line_space, fixed_size) ";
 
878
                insert += " VALUES (";  
 
879
                insert += Te2String(legend->id()) + ", ";
 
880
                insert += Te2String(rep)+ ", ";
 
881
 
 
882
                TeColor cor = vis.color();                              // filling color
 
883
                TeColor contourCor = vis.contourColor();// contour color
 
884
                
 
885
                insert += "'"+ vis.libName() + "', ";
 
886
                insert += style + ", ";
 
887
                insert += Te2String(cor.red_) + ", ";
 
888
                insert += Te2String(cor.green_) + ", ";
 
889
                insert += Te2String(cor.blue_) + ", ";
 
890
                insert += Te2String(vis.transparency()) + ", ";
 
891
                insert += width +",";
 
892
 
 
893
                insert += "'"+ vis.contourLibName() + "', ";
 
894
                insert += contourStyle + ", ";
 
895
                insert += Te2String(contourCor.red_) + ", ";
 
896
                insert += Te2String(contourCor.green_) + ", ";
 
897
                insert += Te2String(contourCor.blue_) + ", ";
 
898
                insert += Te2String(vis.contourTransparency()) + ", ";  
 
899
                insert += Te2String(vis.contourWidth()) + ", ";
 
900
 
 
901
                insert += sizeValue +",";
 
902
                insert += Te2String(vis.ptAngle()) +", ";
 
903
 
 
904
                insert += "'" + vis.family() + "', ";
 
905
                if (vis.bold())
 
906
                        insert += "1, ";
 
907
                else
 
908
                        insert += "0, ";
 
909
                if (vis.italic())
 
910
                        insert += "1, ";
 
911
                else
 
912
                        insert += "0, ";
 
913
                insert += Te2String(vis.alignmentVert()) + ",";
 
914
                insert += Te2String(vis.alignmentHoriz()) + ",";
 
915
                insert += Te2String(vis.tabSize()) + ",";
 
916
                insert += Te2String(vis.lineSpace()) +",";
 
917
                if (vis.fixedSize())
 
918
                        insert += "1 ";
 
919
                else
 
920
                        insert += "0";                  
 
921
                insert += ")";
 
922
 
 
923
                if (!execute(insert))
 
924
                        return false;
 
925
                ++it;
 
926
        }
 
927
        return true;
 
928
}
 
929
 
 
930
bool TeDatabase::createCollectionTable(const string& tableName)
 
931
{
 
932
        string create = "CREATE TABLE " + tableName + " (";
 
933
        create += " c_object_id                 VARCHAR(255) NOT NULL, ";
 
934
        create += " c_legend_id                 INT(10), ";
 
935
        create += " label_x                             DOUBLE(24,9), ";
 
936
        create += " label_y                             DOUBLE(24,9), ";
 
937
        create += " c_legend_own                INT(10), ";
 
938
        create += " c_object_status             INT(10), ";
 
939
        create += " PRIMARY KEY (c_object_id))";
 
940
        return execute (create);
 
941
}
 
942
 
 
943
bool TeDatabase::createCellGeometry (const string& table)
 
944
{
 
945
        string q ="CREATE TABLE " + table +"(";
 
946
        q += "geom_id                           INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
947
        q += "object_id                         VARCHAR(255) NOT NULL ,";
 
948
        q += "lower_x                           double(24,15) NOT NULL ,";
 
949
        q += "lower_y                           double(24,15) NOT NULL ,";
 
950
        q += "upper_x                           double(24,15) NOT NULL ,";
 
951
        q += "upper_y                           double(24,15) NOT NULL ,";
 
952
        q += "col_number                        INT(10) NOT NULL ,";
 
953
        q += "row_number                        INT(10) NOT NULL ,";
 
954
        q += "PRIMARY KEY (geom_id),";
 
955
        q += "INDEX (object_id),";
 
956
        q += "INDEX box_idx (lower_x, lower_y,upper_x, upper_y),";
 
957
        q += "INDEX lc (row_number, col_number))";
 
958
        return execute(q);
 
959
}
 
960
 
 
961
bool TeDatabase::createTextGeometry(const string& table)
 
962
{
 
963
        string q ="CREATE TABLE " + table +"(";
 
964
        q += " geom_id                  INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
965
        q += " object_id                VARCHAR(255) NOT NULL ,";
 
966
        q += " x                                DOUBLE(24,9) DEFAULT '0.0',";
 
967
        q += " y                                DOUBLE(24,9) DEFAULT '0.0',";
 
968
        q += " text_value               VARCHAR(255),";
 
969
        q += " angle                    DOUBLE(24,9) DEFAULT '0.0',";
 
970
        q += " height                   DOUBLE(24,9) DEFAULT '0.0',";
 
971
        q += " alignment_vert   DOUBLE(24,9),";
 
972
        q += " alignment_horiz  DOUBLE(24,9),";
 
973
        q += "PRIMARY KEY (geom_id),";
 
974
        q += "INDEX (object_id),";
 
975
        q += "INDEX pos_idx(x,y))";
 
976
        return execute(q);
 
977
}
 
978
 
 
979
bool TeDatabase::createNodeGeometry(const string& table)
 
980
{
 
981
        string q ="CREATE TABLE " + table +"(";
 
982
        q += "geom_id           INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
983
        q += "object_id         VARCHAR(255) NOT NULL ,";
 
984
        q += "x                         DOUBLE(24,15) DEFAULT '0.0',";
 
985
        q += "y                         DOUBLE(24,15) DEFAULT '0.0',";
 
986
        q += "PRIMARY KEY (geom_id),";
 
987
        q += "INDEX (object_id),";
 
988
        q += "INDEX pos_idx(x,y))";
 
989
        return execute(q);
 
990
}
 
991
 
 
992
bool TeDatabase::createPointGeometry(const string& table)
 
993
{
 
994
        string q ="CREATE TABLE " + table +"(";
 
995
        q += "geom_id           INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
996
        q += "object_id         VARCHAR(255) NOT NULL ,";
 
997
        q += "x                         DOUBLE(24,15) DEFAULT '0.0',";
 
998
        q += "y                         DOUBLE(24,15) DEFAULT '0.0',";
 
999
        q += "PRIMARY KEY (geom_id),";
 
1000
        q += "INDEX (object_id),";
 
1001
        q += "INDEX pos_idx(x,y))";
 
1002
        return execute(q);
 
1003
}
 
1004
 
 
1005
bool TeDatabase::createArcGeometry(const string& table)
 
1006
{
 
1007
        string q ="CREATE TABLE " + table +"(";
 
1008
        q += "geom_id           INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
 
1009
        q += "object_id         VARCHAR(255) NOT NULL ,";
 
1010
        q += "from_node         INT(10),";
 
1011
        q += "to_node           INT(10),";
 
1012
        q += "PRIMARY KEY (geom_id),";
 
1013
        q += "INDEX (object_id),";
 
1014
        q += "INDEX (from_node),";
 
1015
        q += "INDEX (to_node))";
 
1016
        return execute(q);
 
1017
}
 
1018
 
 
1019
 
 
1020
bool
 
1021
TeDatabase::insertTable (TeTable &table)
 
1022
{
 
1023
        string tableName = table.name();
 
1024
        TeAttributeList att = table.attributeList();
 
1025
        TeAttributeList::iterator it = att.begin();
 
1026
 
 
1027
        TeTableRow row;
 
1028
        unsigned int i;
 
1029
        unsigned int j;
 
1030
        for ( i = 0; i < table.size(); i++  )
 
1031
        {
 
1032
                row = table[i];
 
1033
                it = att.begin();
 
1034
                string q =      "INSERT INTO "+tableName+" values(";
 
1035
                j = 1;
 
1036
                int jj = 0;
 
1037
                string dt = "";
 
1038
                while ( it != att.end() )
 
1039
                {
 
1040
                        if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
 
1041
                        {
 
1042
                                const string temp_dt = string(row[jj].c_str());
 
1043
                                TeTime t(temp_dt, (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_, (*it).timeSeparator_, (*it).indicatorPM_);
 
1044
                                dt=t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-");
 
1045
                        }
 
1046
 
 
1047
                        switch ((*it).rep_.type_)
 
1048
                        {
 
1049
                                case TeSTRING:
 
1050
                                        q += "'"+this->escapeSequence(row[jj])+"'";
 
1051
                                break;
 
1052
                                case TeREAL:
 
1053
                                        q += "'"+row[jj]+"'";
 
1054
                                break;
 
1055
                                case TeINT:
 
1056
                                        q += "'"+row[jj]+"'";
 
1057
                                break;
 
1058
                                case TeDATETIME:
 
1059
                                        q += "'"+dt+"'";   
 
1060
                                break;
 
1061
                                default:
 
1062
                                        q += "'"+this->escapeSequence(row[jj])+"'";
 
1063
                                break;
 
1064
                        }
 
1065
                        if (j<att.size())
 
1066
                                q+= ",";
 
1067
                        ++it;
 
1068
                        j++;
 
1069
                        jj++;
 
1070
                }
 
1071
                q += ")";
 
1072
                if (!this->execute(q))
 
1073
//                      return false;
 
1074
                        continue;
 
1075
        }
 
1076
        return true;
 
1077
}
 
1078
 
 
1079
bool 
 
1080
TeDatabase::alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName)
 
1081
{
 
1082
        if(!tableExist(tableName))
 
1083
                return false;
 
1084
 
 
1085
        string tab;
 
1086
 
 
1087
        if(oldColName.empty())
 
1088
        {
 
1089
                tab = " ALTER TABLE " + tableName + " MODIFY ";
 
1090
                tab += rep.name_ +"  ";
 
1091
        }
 
1092
        else
 
1093
        {
 
1094
                tab = " ALTER TABLE " + tableName + " CHANGE ";
 
1095
                tab += oldColName +" "+ rep.name_ +"  ";
 
1096
        }
 
1097
 
 
1098
        switch (rep.type_)
 
1099
        {
 
1100
                case TeSTRING:
 
1101
                        tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
 
1102
                        break;
 
1103
                        
 
1104
                case TeREAL:
 
1105
                        tab += "DOUBLE";        
 
1106
                        break;
 
1107
                        
 
1108
                case TeINT:
 
1109
                        tab += "INT";
 
1110
                        break;
 
1111
 
 
1112
                case TeDATETIME:
 
1113
                        tab += "DATETIME";
 
1114
                        break;
 
1115
 
 
1116
                case TeCHARACTER:
 
1117
                        tab += "CHAR";
 
1118
                        break;
 
1119
 
 
1120
                case TeBLOB:
 
1121
                        tab += "LONGBLOB";
 
1122
                        break; 
 
1123
                
 
1124
                default:
 
1125
                        tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
 
1126
                        break;
 
1127
        }
 
1128
 
 
1129
        tab += " NULL ";
 
1130
 
 
1131
        if(!execute(tab))
 
1132
        {
 
1133
                if(errorMessage_.empty())
 
1134
                        errorMessage_ = "Error alter table " + tableName + " !";
 
1135
                return false;
 
1136
        }
 
1137
 
 
1138
        string tableId;
 
1139
        TeDatabasePortal* portal = getPortal();
 
1140
        string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + tableName + "'";
 
1141
        if(portal->query(sql) && portal->fetchRow())
 
1142
                tableId = portal->getData(0);
 
1143
 
 
1144
        delete portal;
 
1145
 
 
1146
        if(tableId.empty() == false)
 
1147
        {
 
1148
                if(oldColName.empty() == false) // column name changed
 
1149
                {
 
1150
                         // update relation
 
1151
                        sql = "UPDATE te_tables_relation SET related_attr = '" + rep.name_ + "'";
 
1152
                        sql += " WHERE related_table_id = " + tableId;
 
1153
                        sql += " AND related_attr = '" + oldColName + "'";
 
1154
                        if(execute(sql) == false)
 
1155
                                return false;
 
1156
 
 
1157
                        sql = "UPDATE te_tables_relation SET external_attr = '" + rep.name_ + "'";
 
1158
                        sql += " WHERE external_table_name = '" + tableName + "'";
 
1159
                        sql += " AND external_attr = '" + oldColName + "'";
 
1160
                        if(execute(sql) == false)
 
1161
                                return false;
 
1162
 
 
1163
                         // update grouping
 
1164
                        sql = "UPDATE te_grouping SET grouping_attr = '" + tableName + "." + rep.name_ + "'";
 
1165
                        sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
 
1166
                        if(execute(sql) == false)
 
1167
                                return false;
 
1168
                }
 
1169
                else // column type changed
 
1170
                {
 
1171
                        // delete relation
 
1172
                        sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
 
1173
                        sql += " AND related_attr = '" + rep.name_ + "')";
 
1174
                        sql += " OR (external_table_name = '" + tableName + "'";
 
1175
                        sql += " AND external_attr = '" + rep.name_ + "')";
 
1176
                        if(execute(sql) == false)
 
1177
                                return false;
 
1178
 
 
1179
                        // delete grouping
 
1180
                        TeDatabasePortal* portal = getPortal();
 
1181
                        sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
 
1182
                        if(portal->query(sql) && portal->fetchRow())
 
1183
                        {
 
1184
                                string themeId = portal->getData(0);
 
1185
 
 
1186
                                sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
 
1187
                                if(execute(sql) == false)
 
1188
                                {
 
1189
                                        delete portal;
 
1190
                                        return false;
 
1191
                                }
 
1192
                        }
 
1193
                        delete portal;
 
1194
 
 
1195
                        sql = "DELETE FROM te_grouping";
 
1196
                        sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
 
1197
                        if(execute(sql) == false)
 
1198
                                return false;
 
1199
                }
 
1200
        }
 
1201
        return true;
 
1202
}
 
1203
 
 
1204
bool 
 
1205
TeDatabase::getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType)
 
1206
{
 
1207
        TeDatabasePortal* portal = this->getPortal();
 
1208
        if(!portal)
 
1209
        {
 
1210
                this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
 
1211
                return false;
 
1212
        }
 
1213
        
 
1214
        // Get layer tables     
 
1215
        string get =  " SELECT * FROM te_layer_table"; 
 
1216
        if (attType != TeAllAttrTypes)
 
1217
                get += " WHERE attr_table_type = " + Te2String(attType);
 
1218
        if (!portal->query(get))
 
1219
        {       
 
1220
                delete portal;
 
1221
                return false;
 
1222
        }
 
1223
 
 
1224
        while (portal->fetchRow())
 
1225
        {
 
1226
                string tableName = portal->getData("attr_table");
 
1227
                int    tableId = portal->getInt("table_id");
 
1228
                string indexName = portal->getData("attr_link");
 
1229
 
 
1230
                TeAttributeList attrList;
 
1231
                getAttributeList(tableName, attrList);
 
1232
 
 
1233
                TeTable attTable(tableName,attrList,
 
1234
                                         portal->getData("unique_id"), indexName,
 
1235
                                                 TeAttrTableType(portal->getInt("attr_table_type")));
 
1236
 
 
1237
                attTable.setId(tableId);
 
1238
                attTable.attInitialTime(portal->getData("attr_initial_time"));
 
1239
                attTable.attFinalTime(portal->getData("attr_final_time"));
 
1240
                attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
 
1241
                atts.push_back(attTable);
 
1242
        }
 
1243
        delete portal;
 
1244
        return (atts.size() > 0);
 
1245
}
 
1246
 
 
1247
bool
 
1248
TeDatabase::updateTable (TeTable &table)
 
1249
{
 
1250
        string tableName = table.name();
 
1251
        TeAttributeList att = table.attributeList();
 
1252
        TeAttributeList::iterator it = att.begin();
 
1253
 
 
1254
        TeTableRow row;
 
1255
        unsigned int i;
 
1256
        string uniqueName = table.uniqueName();
 
1257
        string uniqueVal;
 
1258
        bool isUniqueValString = false;
 
1259
 
 
1260
        for ( i = 0; i < table.size(); i++  )
 
1261
        {
 
1262
                row = table[i];
 
1263
                it = att.begin();
 
1264
                string q =      "UPDATE "+tableName+" SET ";
 
1265
                unsigned int jj = 0;
 
1266
                while ( it != att.end() )
 
1267
                {
 
1268
                        string val = row[jj];
 
1269
                        if(row[jj].empty())
 
1270
                                val = " NULL ";
 
1271
                        
 
1272
                        if ((*it).rep_.name_ != uniqueName)
 
1273
                        {
 
1274
                                q += (*it).rep_.name_ + "=";
 
1275
                                switch ((*it).rep_.type_)
 
1276
                                {
 
1277
                                        case TeSTRING:
 
1278
                                                q += "'"+escapeSequence(row[jj])+"'";
 
1279
                                        break;
 
1280
                                        case TeREAL:
 
1281
                                                q += val;
 
1282
                                        break;
 
1283
                                        case TeINT:
 
1284
                                                q += val;
 
1285
                                        break;
 
1286
                                        default:
 
1287
                                                q += "'"+escapeSequence(row[jj])+"'";
 
1288
                                        break;
 
1289
                                }
 
1290
                                if (jj < att.size()-1)
 
1291
                                        q+= ",";
 
1292
                        }
 
1293
                        else
 
1294
                        {
 
1295
                                if((*it).rep_.type_ == TeSTRING)
 
1296
                                        isUniqueValString = true;
 
1297
                                uniqueVal = row[jj];
 
1298
                        }
 
1299
 
 
1300
                        ++it;
 
1301
                        jj++;
 
1302
                }
 
1303
                
 
1304
                if(isUniqueValString)
 
1305
                        q += " WHERE " + uniqueName + " = '" + uniqueVal +"'";
 
1306
                else
 
1307
                        q += " WHERE " + uniqueName + " = " + uniqueVal;
 
1308
                
 
1309
                if (!this->execute(q))
 
1310
                        continue;
 
1311
        }
 
1312
        return true;
 
1313
}
 
1314
 
 
1315
 
 
1316
bool 
 
1317
TeDatabase::loadTable(const string& tableName, TeTable &table)
 
1318
{
 
1319
        TeDatabasePortal* portal = this->getPortal();
 
1320
        if (!portal)
 
1321
                return false;
 
1322
 
 
1323
        string q ="SELECT * FROM " + tableName;
 
1324
        if (!portal->query(q))
 
1325
        {       
 
1326
                delete portal;
 
1327
                return false;
 
1328
        }
 
1329
        table.name(tableName);
 
1330
        table.setAttributeList(portal->AttributeList());
 
1331
 
 
1332
        while (portal->fetchRow())
 
1333
        {
 
1334
                TeTableRow row;
 
1335
                for (int j = 0; j < portal->numFields(); j++)
 
1336
                        row.push_back (portal->getData (j)); 
 
1337
                table.add(row);
 
1338
        }
 
1339
        delete portal;
 
1340
        return true;
 
1341
}
 
1342
 
 
1343
bool 
 
1344
TeDatabase::selectTable (const string& tableName, const string& criteria, TeTable &table)
 
1345
{
 
1346
        TeDatabasePortal* portal = this->getPortal();
 
1347
        if (!portal)
 
1348
                return false;
 
1349
 
 
1350
        string q ="SELECT * FROM " + tableName;
 
1351
        if (!criteria.empty())
 
1352
                q += " WHERE " + criteria;
 
1353
 
 
1354
        if (!portal->query(q))
 
1355
        {       
 
1356
                delete portal;
 
1357
                return false;
 
1358
        }
 
1359
        table.name(tableName);
 
1360
        table.setAttributeList(portal->AttributeList());
 
1361
 
 
1362
        while (portal->fetchRow())
 
1363
        {
 
1364
                TeTableRow row;
 
1365
                for(int i = 0; i < portal->numFields(); i++)
 
1366
                        row.push_back(portal->getData(i));
 
1367
                table.add(row);
 
1368
        }
 
1369
        delete portal;
 
1370
        return true;
 
1371
}
 
1372
 
 
1373
bool 
 
1374
TeDatabase::updateView (TeView *view)
 
1375
{
 
1376
        TeProjection* proj = view->projection();
 
1377
        if (proj)
 
1378
        {
 
1379
                if (proj->id() <= 0)
 
1380
                        this->insertProjection(view->projection());
 
1381
                else
 
1382
                        this->updateProjection(view->projection());
 
1383
        }
 
1384
        else
 
1385
        {
 
1386
                errorMessage_ = "Nļæ½o ļæ½ possļæ½vel atualizar vista sem projeļæ½ļæ½o!";
 
1387
                return false;
 
1388
        }
 
1389
 
 
1390
        string sql = "UPDATE te_view SET projection_id=" + Te2String(proj->id());
 
1391
        sql+= ", name='" + view->name() + "'";
 
1392
        sql+= ", user_name='" + view->user() + "'";
 
1393
        sql+= ", visibility= " + Te2String((int)view->isVisible());
 
1394
        sql +=" WHERE view_id = " + Te2String(view->id());
 
1395
 
 
1396
        if (!this->execute (sql))
 
1397
                return false;
 
1398
 
 
1399
        TeViewTree* tree = view->root();
 
1400
        if (tree) 
 
1401
                return  updateViewTree(tree);
 
1402
        return true;
 
1403
}
 
1404
 
 
1405
 
 
1406
bool 
 
1407
TeDatabase::loadViewSet (const string& user)
 
1408
{
 
1409
        TeViewMap::iterator it = viewMap_.begin();
 
1410
        while (it != viewMap_.end())
 
1411
        {
 
1412
                delete it->second;
 
1413
                ++it;
 
1414
        }
 
1415
        viewMap_.clear();
 
1416
        
 
1417
        TeDatabasePortal* portal = this->getPortal();
 
1418
        if (!portal)
 
1419
                return false;
 
1420
 
 
1421
        string sql;
 
1422
        if (!user.empty())
 
1423
                sql = "SELECT * FROM te_view WHERE user_name = '" + user + "'";
 
1424
        else
 
1425
                sql = "SELECT * FROM te_view WHERE user_name = '" + this->user() + "'";
 
1426
 
 
1427
        if (!portal->query(sql))
 
1428
        {       
 
1429
                delete portal;
 
1430
                return false;
 
1431
        }
 
1432
        while (portal->fetchRow())
 
1433
        {
 
1434
                TeView *view = new TeView();
 
1435
                view->id (portal->getInt("view_id"));
 
1436
                loadView (view);
 
1437
        }
 
1438
        delete portal;
 
1439
        return true;
 
1440
}
 
1441
 
 
1442
TeViewTree* 
 
1443
TeDatabase::loadViewTree(TeView* view, int id)
 
1444
{
 
1445
        if( view == 0) 
 
1446
                return 0;
 
1447
        
 
1448
        TeDatabasePortal* portal = this->getPortal();
 
1449
        if (!portal)
 
1450
                return 0;
 
1451
 
 
1452
        string q;
 
1453
        TeViewTree *node = 0;
 
1454
 
 
1455
        if (id != 0)
 
1456
        {
 
1457
                q = "SELECT * FROM te_theme";
 
1458
                q += " WHERE view_id = " + Te2String (view->id());
 
1459
                q += " AND theme_id = " + Te2String(id);
 
1460
 
 
1461
                if (!portal->query(q) || !portal->fetchRow())
 
1462
                {
 
1463
                        delete portal;
 
1464
                        return 0;
 
1465
                }
 
1466
 
 
1467
                TeViewNodeType type = (TeViewNodeType)portal->getInt("node_type");
 
1468
                if(type != TeTREE)
 
1469
                {
 
1470
                        portal->freeResult();
 
1471
                        delete portal;
 
1472
                        return NULL;
 
1473
                }
 
1474
 
 
1475
                node = portal->getViewTree();
 
1476
                portal->freeResult();
 
1477
        }
 
1478
 
 
1479
        q ="SELECT * FROM te_theme";
 
1480
        q += " WHERE view_id = " + Te2String (view->id());
 
1481
        q += " AND parent_id = " + Te2String(id);
 
1482
        q += " ORDER BY priority ASC";
 
1483
 
 
1484
        if (!portal->query(q))
 
1485
        {
 
1486
                delete portal;
 
1487
                return node;
 
1488
        }
 
1489
 
 
1490
        while (portal->fetchRow())
 
1491
        {
 
1492
                TeViewNodeType childType = (TeViewNodeType)portal->getInt("node_type");
 
1493
                TeViewNode *childNode;
 
1494
                if (childType == TeTHEME)
 
1495
                {
 
1496
                        childNode = new TeTheme();
 
1497
                        childNode->id(portal->getInt(0));
 
1498
                        this->loadTheme((TeTheme*)childNode);
 
1499
                } 
 
1500
                else
 
1501
                {
 
1502
                        childNode = loadViewTree(view, portal->getInt("theme_id"));
 
1503
                }
 
1504
 
 
1505
                if(id == 0)
 
1506
                {
 
1507
                        view->add(childNode);
 
1508
                } 
 
1509
                else
 
1510
                {
 
1511
//                      view->addTheme(childNode);
 
1512
                        node->add(childNode);
 
1513
                }
 
1514
        }
 
1515
        delete portal;
 
1516
        return node;
 
1517
}
 
1518
 
 
1519
bool 
 
1520
TeDatabase::loadView (TeView* view)
 
1521
{
 
1522
        string q;
 
1523
        if (view->id() > 0)
 
1524
                q = "SELECT * FROM te_view WHERE view_id=" + Te2String(view->id());
 
1525
        else if (!view->name().empty())
 
1526
        {
 
1527
                q = "SELECT * FROM te_view WHERE name='" + view->name() + "'";
 
1528
                
 
1529
                if(!view->user().empty())
 
1530
                        q += " AND user_name='" + view->user() + "'"; 
 
1531
        }
 
1532
        else
 
1533
                return false;
 
1534
                
 
1535
        TeDatabasePortal* portal = getPortal();
 
1536
        if (!portal)
 
1537
        {
 
1538
                this->errorMessage_ = "Erro ao tentar abrir um portal";
 
1539
                return false;
 
1540
        }
 
1541
 
 
1542
        if (!portal->query(q))
 
1543
        {
 
1544
                delete portal;
 
1545
                this->errorMessage_ = "Erro ao submeter query: \"" + q + "\"";
 
1546
                return false;
 
1547
        }
 
1548
 
 
1549
        if (!portal->fetchRow())
 
1550
        {
 
1551
                delete portal;
 
1552
                return false;
 
1553
        }
 
1554
        
 
1555
        int projId = portal->getInt("projection_id");
 
1556
        TeProjection* proj = loadProjection(projId);
 
1557
        if (proj != 0)
 
1558
                view->projection(proj);
 
1559
        view->name(portal->getData("name"));
 
1560
        view->user(portal->getData("user_name"));
 
1561
        view->isVisible (portal->getBool("visibility"));
 
1562
        view->id(portal->getInt("view_id"));
 
1563
        portal->freeResult();
 
1564
 
 
1565
        loadViewTree(view, 0);
 
1566
 
 
1567
        delete portal;
 
1568
 
 
1569
        vector<TeViewNode*> &themes = view->themes();
 
1570
        for (unsigned int i = 0; i < themes.size() ; i++)
 
1571
        {
 
1572
                TeTheme *theme = (TeTheme*)themes[i];
 
1573
                int id = theme->layerId();
 
1574
                TeLayerMap::iterator it = layerMap_.find(id);
 
1575
                if (it == layerMap_.end())
 
1576
                {
 
1577
                        layerMap_.clear();
 
1578
                        loadLayerSet();
 
1579
                }
 
1580
                theme->layer(layerMap_[id]);
 
1581
                if (!loadLegend (theme))        // retrieve associated legend
 
1582
                        return false;
 
1583
        }
 
1584
        viewMap_[view->id()] = view;
 
1585
        return true;
 
1586
}
 
1587
 
 
1588
 
 
1589
void
 
1590
TeDatabase::clear()
 
1591
{
 
1592
        TeViewMap::iterator viewIt;
 
1593
        for (viewIt = viewMap_.begin(); viewIt != viewMap_.end(); ++viewIt)
 
1594
                delete viewIt->second;
 
1595
 
 
1596
        TeLayerMap::iterator layerIt;
 
1597
        for (layerIt = layerMap_.begin(); layerIt != layerMap_.end(); ++layerIt)
 
1598
                delete layerIt->second;
 
1599
 
 
1600
        legendMap_.clear();
 
1601
        themeMap_.clear();
 
1602
        viewMap_.clear();
 
1603
        layerMap_.clear();
 
1604
}
 
1605
 
 
1606
bool 
 
1607
TeDatabase::deleteView (int viewId)
 
1608
{
 
1609
        TeDatabasePortal* portal = this->getPortal();
 
1610
 
 
1611
        // view projection should be deleted manually
 
1612
        string sql =  "SELECT projection_id FROM te_view WHERE view_id=" + Te2String(viewId);
 
1613
        portal->freeResult();
 
1614
        if (!portal->query(sql))
 
1615
        {
 
1616
                delete portal;
 
1617
                return false;
 
1618
        }
 
1619
        if (!portal->fetchRow())
 
1620
        {
 
1621
                delete portal;
 
1622
                return false;
 
1623
        }
 
1624
        string projId = portal->getData("projection_id");
 
1625
        portal->freeResult();
 
1626
        
 
1627
        // delete themes belonging to this view 
 
1628
        sql = "SELECT theme_id FROM te_theme WHERE view_id=" + Te2String(viewId);
 
1629
        if (!portal->query(sql))
 
1630
        {
 
1631
                delete portal;
 
1632
                return false;
 
1633
        }
 
1634
        while (portal->fetchRow())
 
1635
        {
 
1636
                int id = atoi(portal->getData(0));
 
1637
                if(deleteTheme(id) == false)
 
1638
                {       
 
1639
                        delete portal;
 
1640
                        return false;
 
1641
                }
 
1642
        }
 
1643
        // delete view
 
1644
        sql = "DELETE FROM te_view WHERE view_id = " + Te2String(viewId);
 
1645
        if (!this->execute (sql))
 
1646
        {
 
1647
                delete portal;
 
1648
                return false;
 
1649
        }
 
1650
 
 
1651
        sql = "DELETE FROM te_projection WHERE  projection_id = " + projId;
 
1652
        if (!this->execute (sql))
 
1653
        {
 
1654
                delete portal;
 
1655
                return false;
 
1656
        }
 
1657
 
 
1658
        // Delete the view and its themes
 
1659
        TeView* view = viewMap_[viewId];
 
1660
        viewMap_.erase(viewId);
 
1661
        delete view;
 
1662
        delete portal;
 
1663
        return true;
 
1664
}
 
1665
 
 
1666
bool
 
1667
TeDatabase::updateViewTree (TeViewTree *tree)
 
1668
{
 
1669
        if(tree->id() > 0)
 
1670
        {
 
1671
                string sql;
 
1672
                sql = "UPDATE te_theme SET ";
 
1673
                sql += "name='" + tree->name()+"'";
 
1674
                sql += ", parent_id=" + Te2String (tree->parentId());
 
1675
                sql += ", node_type=" + Te2String (tree->type());
 
1676
                sql += " ,priority=" + Te2String (tree->priority());
 
1677
                sql += " WHERE theme_id = " + Te2String(tree->id());
 
1678
 
 
1679
                if(!this->execute (sql)) return false;
 
1680
        }
 
1681
 
 
1682
        for (unsigned int th=0; th<tree->size(); th++)
 
1683
        {
 
1684
                TeViewNode* node = tree->retrieve(th);
 
1685
                if (node->type() == TeTHEME)
 
1686
                {
 
1687
                        TeTheme *theme = (TeTheme*)node;
 
1688
                        if(!updateTheme(theme)) return false;
 
1689
                }
 
1690
                else
 
1691
                {
 
1692
                        TeViewTree* tree = (TeViewTree*)node;
 
1693
                        if(!updateViewTree(tree)) return false;
 
1694
                }
 
1695
        }
 
1696
        return true;
 
1697
}
 
1698
 
 
1699
bool 
 
1700
TeDatabase::viewExist(string viewName)
 
1701
{
 
1702
        TeDatabasePortal* portal = this->getPortal();
 
1703
        if (!portal)
 
1704
                return false;
 
1705
 
 
1706
        viewName = TeConvertToUpperCase(viewName);
 
1707
 
 
1708
        string sql = "SELECT name FROM te_view";
 
1709
        if (!portal->query(sql))
 
1710
        {       
 
1711
                delete portal;
 
1712
                return false;
 
1713
        }
 
1714
        while (portal->fetchRow())
 
1715
        {
 
1716
                string name = portal->getData(0);
 
1717
                name = TeConvertToUpperCase(name);
 
1718
                if (viewName == name)
 
1719
                {
 
1720
                        delete portal;
 
1721
                        return true;
 
1722
                }
 
1723
        }
 
1724
        delete portal;
 
1725
        return false;
 
1726
}
 
1727
 
 
1728
 
 
1729
bool
 
1730
TeDatabase::updateTheme (TeTheme *theme)
 
1731
{
 
1732
        string sql;
 
1733
 
 
1734
        if (theme->id() <= 0 )  // theme doesnļæ½t exist in the database yet
 
1735
        {
 
1736
                return this->insertTheme(theme);
 
1737
        }
 
1738
        
 
1739
        // update theme metadata
 
1740
        sql = "UPDATE te_theme SET ";
 
1741
        sql += " layer_id=" + Te2String (theme->layerId());
 
1742
        sql += ", view_id=" + Te2String (theme->view());
 
1743
        sql += ", name='" + escapeSequence(theme->name())+"'";
 
1744
        sql += ", parent_id=" + Te2String (theme->parentId());
 
1745
        sql += ", priority=" + Te2String (theme->priority());
 
1746
        sql += ", node_type=" + Te2String (theme->type());
 
1747
        sql += ", min_scale=" + Te2String (theme->minScale(),5);
 
1748
        sql += ", max_scale=" + Te2String (theme->maxScale(),5);
 
1749
        sql += ", generate_attribute_where='" + escapeSequence(theme->attributeRest())+"'";
 
1750
        sql += ", generate_spatial_where='" + escapeSequence(theme->spatialRest())+"'";
 
1751
        sql += ", generate_temporal_where='" + escapeSequence(theme->temporalRest())+"'";
 
1752
        sql += ", collection_table='" + theme->collectionTable() + "'";
 
1753
        sql += ", visible_rep= " + Te2String(theme->visibleRep ());
 
1754
        sql += ", enable_visibility= " + Te2String(theme->visibility()); 
 
1755
        sql += " WHERE theme_id=" + Te2String (theme->id());
 
1756
 
 
1757
        if (!this->execute (sql))
 
1758
                return false;
 
1759
         
 
1760
        //delete grouping 
 
1761
        sql = "DELETE FROM te_grouping WHERE theme_id= "+ Te2String(theme->id());
 
1762
        this->execute (sql);
 
1763
                
 
1764
        if(theme->grouping())
 
1765
        {
 
1766
                if(!insertGrouping(theme->id(), theme->grouping()))
 
1767
                        return false;
 
1768
        }
 
1769
        
 
1770
        // update each of its legends
 
1771
        bool status = true;
 
1772
        
 
1773
        if(theme->legend().size() == 0)
 
1774
        {
 
1775
                if(!deleteLegend(theme->id()))
 
1776
                        return false;
 
1777
        }
 
1778
        else
 
1779
        {
 
1780
                for (unsigned int i = 0; i < theme->legend().size() ; i++)
 
1781
                {
 
1782
                        status = updateLegend(&(theme->legend()[i]));
 
1783
                        if (!status)
 
1784
                                return status;
 
1785
                }
 
1786
        }
 
1787
 
 
1788
        status = updateLegend(&(theme->withoutDataConnectionLegend()));
 
1789
        if (!status)
 
1790
                return status;
 
1791
 
 
1792
        status = updateLegend(&(theme->outOfCollectionLegend()));
 
1793
        if (!status)
 
1794
                return status;
 
1795
 
 
1796
        status = updateLegend(&(theme->defaultLegend()));
 
1797
        if (!status)
 
1798
                return status;
 
1799
 
 
1800
        status = updateLegend(&(theme->pointingLegend()));
 
1801
        if (!status)
 
1802
                return status;
 
1803
 
 
1804
        status = updateLegend(&(theme->queryLegend()));
 
1805
        if (!status)
 
1806
                return status;
 
1807
 
 
1808
        status = updateLegend(&(theme->queryAndPointingLegend()));
 
1809
        if (!status)
 
1810
                return status;
 
1811
 
 
1812
        // theme tables
 
1813
        return updateThemeTable (theme);
 
1814
}
 
1815
 
 
1816
bool
 
1817
TeDatabase::loadTheme (TeTheme* theme)
 
1818
{
 
1819
        if (theme == 0)
 
1820
                return false;
 
1821
 
 
1822
        string get = "SELECT te_theme.* FROM te_view INNER JOIN te_theme ON te_view.view_id = te_theme.view_id WHERE ";
 
1823
        if (theme->id() > 0)
 
1824
                get += " te_theme.theme_id = "+  Te2String(theme->id());
 
1825
        else if (!theme->name().empty())
 
1826
                get += " te_theme.name = '"+  theme->name() + "'";
 
1827
        else
 
1828
        {
 
1829
                this->errorMessage_ = "Theme procurado nļæ½o possui nem id nem nome";
 
1830
                return false;
 
1831
        }
 
1832
        get += " AND te_view.user_name = \'" + this->user() +"\'";
 
1833
 
 
1834
        TeDatabasePortal* portal = this->getPortal();
 
1835
        if(!portal)
 
1836
        {
 
1837
                this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
 
1838
                return false;
 
1839
        }
 
1840
 
 
1841
        if (!portal->query (get))
 
1842
        {       
 
1843
                delete portal;
 
1844
                return false;
 
1845
        }
 
1846
        if (!portal->fetchRow())
 
1847
        {       
 
1848
                delete portal;
 
1849
                return false;
 
1850
        }
 
1851
 
 
1852
        //theme information
 
1853
        theme->id(atoi (portal->getData(0)));
 
1854
        theme->layerId (atoi(portal->getData(1)));
 
1855
        theme->view (atoi(portal->getData (2)));
 
1856
        theme->name(string (portal->getData("name")));
 
1857
        theme->parentId( atoi(portal->getData ("parent_id")));
 
1858
        theme->type (TeViewNodeType(atoi(portal->getData ("node_type"))));
 
1859
        theme->priority(portal->getInt("priority"));
 
1860
        theme->minScale (portal->getDouble ("min_scale"));
 
1861
        theme->maxScale (portal->getDouble ("max_scale"));
 
1862
        theme->attributeRest(string(portal->getData ("generate_attribute_where")));
 
1863
        theme->spatialRest(string(portal->getData ("generate_spatial_where")));
 
1864
        theme->temporalRest(string(portal->getData ("generate_temporal_where")));
 
1865
        theme->collectionTable(string(portal->getData ("collection_table")));
 
1866
        theme->collectionAuxTable(theme->collectionTable() + "_aux");
 
1867
        theme->visibleRep(atoi(portal->getData ("visible_rep")));
 
1868
        theme->visibility(atoi(portal->getData ("enable_visibility")));
 
1869
        
 
1870
        //load layer
 
1871
        int id = theme->layerId();
 
1872
        TeLayerMap::iterator it = layerMap_.find(id);
 
1873
        if (it == layerMap_.end())
 
1874
        {
 
1875
                layerMap_.clear();
 
1876
                loadLayerSet();
 
1877
        }
 
1878
        theme->layer(layerMap_[id]);
 
1879
        portal->freeResult();
 
1880
 
 
1881
        // load them grouping
 
1882
        get = "SELECT * FROM te_grouping  WHERE theme_id = " + Te2String(theme->id());
 
1883
        if (portal->query (get) && portal->fetchRow())
 
1884
        {       
 
1885
                TeAttributeRep atRep;
 
1886
                string attname = portal->getData ("grouping_attr");
 
1887
                string norname = portal->getData ("grouping_norm_attr");
 
1888
                int f = attname.find("(");
 
1889
                if(f >= 0)
 
1890
                {
 
1891
                        string alias = attname;
 
1892
                        attname.erase(f, attname.size()-f);
 
1893
                        alias.erase(0, f+1);
 
1894
                        alias.erase(alias.size()-1, 1);
 
1895
                        map<string, string>& m = mapThemeAlias_[theme->id()];
 
1896
                        m[attname] = alias;
 
1897
                }
 
1898
                f = norname.find("(");
 
1899
                if(f >= 0)
 
1900
                {
 
1901
                        string alias = norname;
 
1902
                        norname.erase(f, norname.size()-f);
 
1903
                        alias.erase(0, f+1);
 
1904
                        alias.erase(alias.size()-1, 1);
 
1905
                        map<string, string>& m = mapThemeAlias_[theme->id()];
 
1906
                        m[norname] = alias;
 
1907
                }
 
1908
 
 
1909
                if(attname=="NONE")
 
1910
                        attname = "";
 
1911
                
 
1912
                if(norname=="NONE")
 
1913
                        norname = "";
 
1914
                
 
1915
                atRep.name_ = attname;
 
1916
                atRep.type_ = TeAttrDataType(atoi(portal->getData ("grouping_attr_type")));
 
1917
                
 
1918
                TeGrouping* g = new TeGrouping ( atRep, norname, 
 
1919
                                                TeGroupingMode(atoi(portal->getData ("grouping_mode"))),
 
1920
                                                atoi(portal->getData ("grouping_number")),
 
1921
                                                atoi(portal->getData ("grouping_precision")),
 
1922
                                                portal->getDouble("grouping_std_dev"), 
 
1923
                                                portal->getData("grouping_function") );
 
1924
 
 
1925
                theme->grouping(g);
 
1926
        }
 
1927
        portal->freeResult();
 
1928
 
 
1929
        // load theme tables
 
1930
        if(!loadThemeTable(theme))
 
1931
        {
 
1932
                delete portal;
 
1933
                return false;
 
1934
        }
 
1935
 
 
1936
        get = "SELECT * FROM te_visual_raster  WHERE theme_id = " + Te2String(theme->id());
 
1937
        if (portal->query (get) && portal->fetchRow())
 
1938
        {
 
1939
                TeRasterTransform* vis = new TeRasterTransform();
 
1940
                vis->setSrcBand(portal->getInt(1));
 
1941
                vis->setDestBand(portal->getInt(2));
 
1942
                vis->setTransfFunction(static_cast<TeRasterTransform::TeRasterTransfFunctions>(portal->getInt(3)));
 
1943
                if (vis->getTransfFunction() == TeRasterTransform::TeExtractRGB || 
 
1944
                        vis->getTransfFunction() == TeRasterTransform::TeExtractBands)
 
1945
                {
 
1946
                        do
 
1947
                        {
 
1948
                                vis->setBChannelMapping(portal->getInt(1),static_cast<TeRasterTransform::TeRGBChannels>(portal->getInt(2)));
 
1949
                        }while (portal->fetchRow());
 
1950
                }
 
1951
                theme->rasterVisual(vis);
 
1952
        }
 
1953
 
 
1954
        // load theme legends  
 
1955
        loadLegend(theme);
 
1956
 
 
1957
        themeMap_[theme->id()] = theme;
 
1958
 
 
1959
        delete portal;
 
1960
        return true;
 
1961
}
 
1962
 
 
1963
 
 
1964
bool
 
1965
TeDatabase::loadThemeTable (TeTheme* theme)
 
1966
{
 
1967
        TeDatabasePortal* portal = this->getPortal();
 
1968
        if(!portal)
 
1969
        {
 
1970
                this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
 
1971
                return false;
 
1972
        }
 
1973
        
 
1974
        //theme tables
 
1975
        string sel = "SELECT te_theme_table.*, te_tables_relation.*, te_layer_table.*";
 
1976
        sel += " FROM (te_theme_table LEFT JOIN te_tables_relation";
 
1977
        sel += " ON te_theme_table.relation_id = te_tables_relation.relation_id)";
 
1978
        sel += " LEFT JOIN te_layer_table ON te_theme_table.table_id = te_layer_table.table_id";
 
1979
        sel += " WHERE  te_theme_table.theme_id = " + Te2String(theme->id());
 
1980
        sel += " ORDER BY table_order";
 
1981
        
 
1982
        if (!portal->query (sel))
 
1983
        {       
 
1984
                delete portal;
 
1985
                return false;
 
1986
        }
 
1987
 
 
1988
        while(portal->fetchRow ())
 
1989
        {
 
1990
                string tableName = portal->getData("attr_table");
 
1991
                TeAttributeList attrList;
 
1992
                getAttributeList(tableName, attrList);
 
1993
                string uniqueId = portal->getData("unique_id");
 
1994
                string linkName = portal->getData("attr_link");
 
1995
 
 
1996
                TeTable table(tableName, attrList, uniqueId, linkName);
 
1997
                table.setId(portal->getInt("te_theme_table.table_id"));
 
1998
                table.setOrder(portal->getInt("table_order"));
 
1999
                table.attInitialTime(portal->getData("attr_initial_time"));
 
2000
                table.attFinalTime(portal->getData("attr_final_time"));
 
2001
                table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
 
2002
 
 
2003
                int tableType = portal->getInt("attr_table_type");
 
2004
                if (tableType == TeAttrExternal)
 
2005
                {
 
2006
                        int relatedTableId = portal->getInt("related_table_id");
 
2007
                        table.relatedTableName(getTableName(relatedTableId));
 
2008
                        int relationId = portal->getInt("te_theme_table.relation_id");
 
2009
                        relationMSet_.insert(relationId);
 
2010
 
 
2011
                        string relatedAttr = portal->getData("related_attr");
 
2012
                        table.setTableType(TeAttrExternal, relatedTableId, relatedAttr);
 
2013
 
 
2014
                        table.setLinkName(portal->getData("external_attr"));
 
2015
                }
 
2016
                else
 
2017
                        table.setTableType((TeAttrTableType)tableType);
 
2018
 
 
2019
                theme->addThemeTable(table);
 
2020
        }
 
2021
 
 
2022
        delete portal;
 
2023
        return true;
 
2024
}
 
2025
 
 
2026
 
 
2027
bool
 
2028
TeDatabase::insertThemeTable(TeTheme *theme, TeTable& inputTable)
 
2029
{
 
2030
        int themeId = theme->id();
 
2031
        int     tableOrder = 0;
 
2032
        int     relationId;
 
2033
        bool status;
 
2034
        string qString;
 
2035
 
 
2036
        // Get the order of the last theme table
 
2037
        qString = "SELECT MAX(table_order) FROM te_theme_table";
 
2038
        qString += " WHERE theme_id = " + Te2String(themeId);
 
2039
 
 
2040
        TeDatabasePortal* portal = getPortal();
 
2041
        if (portal->query(qString) == false || portal->fetchRow() == false)
 
2042
                return false;
 
2043
 
 
2044
        string data = portal->getData(0);
 
2045
        if (data.empty())
 
2046
                tableOrder = 0;
 
2047
        else
 
2048
        {
 
2049
                tableOrder = atoi(portal->getData(0));
 
2050
                ++tableOrder;
 
2051
        }
 
2052
        inputTable.setOrder(tableOrder);
 
2053
        delete portal;
 
2054
 
 
2055
        if (inputTable.tableType() == TeAttrExternal)
 
2056
        {
 
2057
                status = insertRelationInfo(inputTable.relatedTableId(),inputTable.relatedAttribute(),
 
2058
                                                                        inputTable.name(),inputTable.linkName(),relationId);
 
2059
                if (status == false)
 
2060
                        return false;
 
2061
                relationMSet_.insert(relationId);
 
2062
 
 
2063
                status = insertThemeTable(themeId, inputTable.id(), relationId, tableOrder);
 
2064
        }
 
2065
        else
 
2066
        {
 
2067
                // Insert the table in the te_theme_table
 
2068
                status = insertThemeTable(themeId, inputTable.id(), 0, tableOrder);
 
2069
        }
 
2070
        return status;
 
2071
}
 
2072
 
 
2073
bool
 
2074
TeDatabase::removeThemeTable(TeTheme *theme, int tableOrder)
 
2075
{
 
2076
        if (tableOrder < 0)
 
2077
                return false;
 
2078
 
 
2079
        int relationId = -1;
 
2080
        string qString;
 
2081
 
 
2082
        TeAttrTableVector attrTableVector; 
 
2083
        theme->getAttTables(attrTableVector);
 
2084
 
 
2085
        // If the table is external, find the relation id
 
2086
        qString = "SELECT relation_id FROM te_theme_table";
 
2087
        qString += " WHERE theme_id = " + Te2String(theme->id());
 
2088
        qString += " AND relation_id IS NOT NULL";
 
2089
        qString += " AND table_order = " + Te2String(tableOrder);
 
2090
 
 
2091
        TeDatabasePortal* portal = getPortal();
 
2092
        if (portal->query(qString) && portal->fetchRow())
 
2093
                relationId = portal->getInt("relation_id");
 
2094
        else
 
2095
        {
 
2096
                delete portal;
 
2097
                return false;
 
2098
        }
 
2099
        delete portal;
 
2100
 
 
2101
        // Remove the relation from the te_tables_relation
 
2102
        // table if only this theme is using it
 
2103
        if (relationId > 0)
 
2104
        {
 
2105
                if (relationMSet_.count(relationId) == 1)
 
2106
                {
 
2107
                        qString = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
 
2108
                        if (execute(qString) == false)
 
2109
                                return false;
 
2110
                        relationMSet_.erase(relationId);
 
2111
                }
 
2112
                else
 
2113
                        relationMSet_.erase(relationMSet_.find(relationId));
 
2114
        }
 
2115
 
 
2116
        // Remove the table from the te_theme_table
 
2117
        qString = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
 
2118
        qString += " AND table_order = " + Te2String(tableOrder);
 
2119
 
 
2120
        if (execute(qString) == false)
 
2121
                return false;
 
2122
 
 
2123
        return true;
 
2124
}
 
2125
 
 
2126
 
 
2127
bool 
 
2128
TeDatabase::updateThemeTable(TeTheme *theme)
 
2129
{
 
2130
        //Initially remove from te_theme_table all the records of this theme
 
2131
        string q = "SELECT * FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
 
2132
        TeDatabasePortal *portal = getPortal();
 
2133
 
 
2134
        if (portal->query(q) == false)
 
2135
        {
 
2136
                delete portal;
 
2137
                return false;
 
2138
        }
 
2139
 
 
2140
        while (portal->fetchRow())
 
2141
        {
 
2142
                int relationId;
 
2143
                int themeTableId = portal->getInt("theme_table_id");
 
2144
 
 
2145
                string data = portal->getData("relation_id");
 
2146
                if (data.empty())
 
2147
                        relationId = -1;
 
2148
                else
 
2149
                        relationId = atoi(data.c_str());
 
2150
 
 
2151
                // Remove the relation from the te_tables_relation
 
2152
                // table if only this theme is using it
 
2153
                if (relationId > 0)
 
2154
                {
 
2155
                        if (relationMSet_.count(relationId) == 1)
 
2156
                        {
 
2157
                                q = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
 
2158
                                if (execute(q) == false)
 
2159
                                {
 
2160
                                        delete portal;
 
2161
                                        return false;
 
2162
                                }
 
2163
                                relationMSet_.erase(relationId);
 
2164
                        }
 
2165
                        else
 
2166
                                relationMSet_.erase(relationMSet_.find(relationId));
 
2167
                }
 
2168
 
 
2169
                // Remove the table from the te_theme_table
 
2170
                q = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
 
2171
                q += " AND theme_table_id = " + Te2String(themeTableId);
 
2172
                if (execute(q) == false)
 
2173
                {
 
2174
                        delete portal;
 
2175
                        return false;
 
2176
                }
 
2177
        }
 
2178
        delete portal;
 
2179
 
 
2180
        // Update te_theme_table and te_tables_relation(if there are any external tables)
 
2181
        // with the information provided from the new vector of theme tables
 
2182
        TeAttrTableVector tablesVector; 
 
2183
        theme->getAttTables(tablesVector);
 
2184
        for (unsigned i = 0; i < tablesVector.size(); ++i)
 
2185
                insertThemeTable(theme, tablesVector[i]);
 
2186
 
 
2187
        return true;
 
2188
}
 
2189
 
 
2190
 
 
2191
bool 
 
2192
TeDatabase::insertGrouping (int themeId, TeGrouping* grouping)
 
2193
{
 
2194
        if((themeId < 1) || (!grouping) )
 
2195
                return false;
 
2196
 
 
2197
        string ins = " INSERT INTO te_grouping (theme_id, grouping_number, ";
 
2198
        ins += " grouping_attr, grouping_attr_type, grouping_mode, "; 
 
2199
        ins += " grouping_norm_attr, grouping_std_dev, grouping_precision, grouping_function )"; 
 
2200
        ins += " VALUES ( ";
 
2201
        ins += Te2String(themeId);
 
2202
        ins += ", "+ Te2String(grouping->groupNumSlices_);
 
2203
 
 
2204
        string attname = grouping->groupAttribute_.name_;
 
2205
        if(attname.empty() || (attname=="NONE") )
 
2206
                attname = "";
 
2207
        
 
2208
        string norname = grouping->groupNormAttribute_;
 
2209
        if(norname.empty() || (norname=="NONE"))
 
2210
                norname = "";
 
2211
 
 
2212
        map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
 
2213
        if(it != mapThemeAlias_.end())
 
2214
        {
 
2215
                map<string, string>::iterator tit = it->second.find(attname);
 
2216
                if(tit != it->second.end())
 
2217
                {
 
2218
                        string alias = tit->second;
 
2219
                        attname += "(" + alias + ")";
 
2220
                }
 
2221
                if(norname.empty() == false)
 
2222
                {
 
2223
                        map<string, string>::iterator tit = it->second.find(norname);
 
2224
                        if(tit != it->second.end())
 
2225
                        {
 
2226
                                string nalias = tit->second;
 
2227
                                norname += "(" + nalias + ")";
 
2228
                        }
 
2229
                }
 
2230
        }
 
2231
 
 
2232
        ins += ", '"+ attname +"'";
 
2233
        ins += ", "+ Te2String(grouping->groupAttribute_.type_);
 
2234
        ins += ", "+ Te2String(grouping->groupMode_);
 
2235
        ins += ", '"+ norname +"'";
 
2236
        ins += ", "+ Te2String(grouping->groupStdDev_); 
 
2237
        ins += ", "+ Te2String(grouping->groupPrecision_);
 
2238
        ins += ", '"+ grouping->groupFunction_ +"'";
 
2239
        ins += ")";
 
2240
 
 
2241
        return (execute(ins));
 
2242
}
 
2243
 
 
2244
bool 
 
2245
TeDatabase::updateGrouping (int themeId, TeGrouping* grouping)
 
2246
{
 
2247
        if((themeId < 1) || (!grouping))
 
2248
                return false;
 
2249
 
 
2250
        string up = " UPDATE te_grouping SET ";
 
2251
        up += "  grouping_number = "+ Te2String(grouping->groupNumSlices_);
 
2252
 
 
2253
        string attname = grouping->groupAttribute_.name_;
 
2254
        if(attname.empty() || (attname=="NONE"))
 
2255
                attname = "";
 
2256
 
 
2257
        string norname = grouping->groupNormAttribute_;
 
2258
        if(norname.empty()|| (norname=="NONE"))
 
2259
                norname = "";
 
2260
 
 
2261
        map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
 
2262
        if(it != mapThemeAlias_.end())
 
2263
        {
 
2264
                map<string, string>::iterator tit = it->second.find(attname);
 
2265
                if(tit != it->second.end())
 
2266
                {
 
2267
                        string alias = tit->second;
 
2268
                        attname += "(" + alias + ")";
 
2269
                }
 
2270
                if(norname.empty() == false)
 
2271
                {
 
2272
                        map<string, string>::iterator tit = it->second.find(norname);
 
2273
                        if(tit != it->second.end())
 
2274
                        {
 
2275
                                string nalias = tit->second;
 
2276
                                norname += "(" + nalias + ")";
 
2277
                        }
 
2278
                }
 
2279
        }
 
2280
 
 
2281
        up += ", grouping_attr = '"+ attname +"'";
 
2282
        up += ", grouping_attr_type = "+ Te2String(grouping->groupAttribute_.type_);
 
2283
        up += ", grouping_mode = "+ Te2String(grouping->groupMode_);
 
2284
        up += ", grouping_norm_attr = '"+ norname +"'";
 
2285
        up += ", grouping_std_dev = "+ Te2String(grouping->groupStdDev_); 
 
2286
        up += ", grouping_precision = "+ Te2String(grouping->groupPrecision_);
 
2287
        up += ", grouping_function = '"+ grouping->groupFunction_ +"'";
 
2288
        up += " WHERE theme_id = "+ Te2String(themeId);
 
2289
 
 
2290
        return (execute(up));
 
2291
}
 
2292
 
 
2293
bool 
 
2294
TeDatabase::generateLabelPositions(TeTheme *theme)
 
2295
{
 
2296
        string  piebar, geomTable, upd;
 
2297
        string  collTable = theme->collectionTable();
 
2298
        
 
2299
        if((collTable.empty()) || (!tableExist(collTable)))
 
2300
                return false;
 
2301
 
 
2302
        if (theme->layer()->hasGeometry(TeCELLS) )
 
2303
        {
 
2304
                geomTable = theme->layer()->tableName(TeCELLS);
 
2305
 
 
2306
                piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
 
2307
                piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
 
2308
                piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
 
2309
 
 
2310
                upd = " UPDATE (" + piebar + ") SET";
 
2311
                upd += " label_x = lower_x + (upper_x-lower_x)/2,";
 
2312
                upd += " label_y = lower_y + (upper_y-lower_y)/2";
 
2313
 
 
2314
                if(!execute(upd))
 
2315
                        return false;
 
2316
        }
 
2317
 
 
2318
        if( theme->layer()->hasGeometry(TePOLYGONS))
 
2319
        {
 
2320
                geomTable = theme->layer()->tableName(TePOLYGONS);
 
2321
 
 
2322
                piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
 
2323
                piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
 
2324
                piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
 
2325
                piebar += " WHERE label_x is null OR label_y is null";
 
2326
                piebar += " ORDER BY c_object_id ASC, ext_max ASC";
 
2327
                
 
2328
                upd = " UPDATE (" + piebar + ") SET";
 
2329
                upd += " label_x = lower_x + (upper_x-lower_x)/2,";
 
2330
                upd += " label_y = lower_y + (upper_y-lower_y)/2";
 
2331
 
 
2332
                if(!execute(upd))
 
2333
                        return false;
 
2334
        }
 
2335
        
 
2336
        if (theme->layer()->hasGeometry(TePOINTS))
 
2337
        {
 
2338
                geomTable = theme->layer()->tableName(TePOINTS);
 
2339
 
 
2340
                piebar = "SELECT label_x, label_y, x, y";
 
2341
                piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
 
2342
                piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
 
2343
                piebar += " WHERE label_x is null OR label_y is null";
 
2344
                upd = " UPDATE (" + piebar + ") SET";
 
2345
                upd += " label_x = x,";
 
2346
                upd += " label_y = y";
 
2347
 
 
2348
                if(!execute(upd))
 
2349
                        return false;
 
2350
        }
 
2351
        
 
2352
        if(theme->layer()->hasGeometry(TeLINES))
 
2353
        {
 
2354
                geomTable = theme->layer()->tableName(TeLINES);
 
2355
 
 
2356
                piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
 
2357
                piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
 
2358
                piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
 
2359
                piebar += " WHERE label_x is null OR label_y is null";
 
2360
                piebar += " ORDER BY c_object_id ASC, ext_max ASC";
 
2361
                
 
2362
                upd = " UPDATE (" + piebar + ") SET";
 
2363
                upd += " label_x = lower_x + (upper_x-lower_x)/2,";
 
2364
                upd += " label_y = lower_y + (upper_y-lower_y)/2";
 
2365
 
 
2366
                if(!execute(upd))
 
2367
                        return false;
 
2368
        }
 
2369
 
 
2370
        return true;
 
2371
}
 
2372
 
 
2373
bool 
 
2374
TeDatabase::themeExist(string themeName)
 
2375
{
 
2376
        TeDatabasePortal* portal = this->getPortal();
 
2377
        if (!portal)
 
2378
                return false;
 
2379
 
 
2380
        themeName = TeConvertToUpperCase(themeName);
 
2381
 
 
2382
        string sql = "SELECT name FROM te_theme";
 
2383
        if (!portal->query(sql))
 
2384
        {       
 
2385
                delete portal;
 
2386
                return false;
 
2387
        }
 
2388
        while (portal->fetchRow())
 
2389
        {
 
2390
                string name = portal->getData(0);
 
2391
                name = TeConvertToUpperCase(name);
 
2392
                if (themeName == name)
 
2393
                {
 
2394
                        delete portal;
 
2395
                        return true;
 
2396
                }
 
2397
        }
 
2398
        delete portal;
 
2399
        return false;
 
2400
}
 
2401
 
 
2402
bool
 
2403
TeDatabase::deleteTheme(int themeId)
 
2404
{
 
2405
        string sql;
 
2406
 
 
2407
        // delete the collection table associated to this theme
 
2408
        TeDatabasePortal* portal = this->getPortal();
 
2409
        if(!portal)
 
2410
                return false;
 
2411
 
 
2412
        sql = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
 
2413
        if(!portal->query(sql))
 
2414
        {       
 
2415
                delete portal;
 
2416
                return false;
 
2417
        }
 
2418
        if (!portal->fetchRow())
 
2419
        {
 
2420
                delete portal;
 
2421
                return false;
 
2422
        }
 
2423
        string colTab = portal->getData("collection_table");
 
2424
        //delete collection table
 
2425
        if (this->tableExist(colTab))   
 
2426
        {
 
2427
                sql = "DROP TABLE " + colTab;
 
2428
                if (!this->execute(sql) )
 
2429
                {       
 
2430
                        delete portal;
 
2431
                        return false;
 
2432
                }
 
2433
        }
 
2434
        //delete auxiliar collection table
 
2435
        if (this->tableExist(colTab +"_aux"))   
 
2436
        {
 
2437
                sql = "DROP TABLE " +colTab +"_aux";
 
2438
                if (!this->execute(sql) )
 
2439
                {       
 
2440
                        delete portal;
 
2441
                        return false;
 
2442
                }
 
2443
        }
 
2444
 
 
2445
        portal->freeResult();
 
2446
 
 
2447
        //delete the visual associated to this theme
 
2448
        if (existRelation("te_visual","fk_visual_legend_id") != TeRICascadeDeletion)
 
2449
        {
 
2450
                sql = "SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
 
2451
                if(!portal->query(sql))
 
2452
                {       
 
2453
                        delete portal;
 
2454
                        return false;
 
2455
                }
 
2456
                string wherec;
 
2457
                int c = 0;
 
2458
                while (portal->fetchRow())
 
2459
                {
 
2460
                        if (c)
 
2461
                                wherec += ",";
 
2462
                        c++;
 
2463
                        wherec += portal->getData(0);
 
2464
                }
 
2465
                portal->freeResult();
 
2466
                sql = "DELETE FROM te_visual WHERE legend_id IN (" + wherec + ")";
 
2467
                if (!this->execute(sql))
 
2468
                {       
 
2469
                        delete portal;
 
2470
                        return false;
 
2471
                }
 
2472
        }
 
2473
 
 
2474
        //delete all visuals of raster associated to this theme
 
2475
        if (existRelation("te_visual_raster","fk_visrast_theme_id") != TeRICascadeDeletion)
 
2476
        {
 
2477
                sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
 
2478
                if (!this->execute (sql))
 
2479
                {       
 
2480
                        delete portal;
 
2481
                        return false;
 
2482
                }
 
2483
        }
 
2484
        
 
2485
        //delete all legends associated to this theme
 
2486
        if (existRelation("te_legend","fk_legend_theme_id") != TeRICascadeDeletion)
 
2487
        {
 
2488
                sql = "DELETE FROM te_legend WHERE theme_id =" + Te2String(themeId);
 
2489
                if (!this->execute (sql))
 
2490
                {       
 
2491
                        delete portal;
 
2492
                        return false;
 
2493
                }
 
2494
        }
 
2495
        
 
2496
        //select the view of this theme
 
2497
        sql = "SELECT view_id FROM te_theme WHERE theme_id = " + Te2String(themeId);
 
2498
        portal->freeResult();
 
2499
        if(!portal->query(sql))
 
2500
        {       
 
2501
                delete portal;
 
2502
                return false;
 
2503
        }
 
2504
        if (!portal->fetchRow())
 
2505
        {
 
2506
                delete portal;
 
2507
                return false;
 
2508
        }
 
2509
 
 
2510
        int viewId = portal->getInt("view_id");
 
2511
        TeView* view = viewMap_[viewId];
 
2512
        TeTheme* tema = (TeTheme*)view->remove(themeId); 
 
2513
        if(!tema)
 
2514
        {
 
2515
                delete portal;
 
2516
                return false;
 
2517
        }
 
2518
 
 
2519
        unsigned int i;
 
2520
        TeLegendEntryVector& legendVector = tema->legend();
 
2521
        for (i = 0; i < legendVector.size(); ++i)
 
2522
                legendMap_.erase(legendVector[i].id());
 
2523
        themeMap_.erase(themeId);
 
2524
 
 
2525
        delete tema;
 
2526
        delete portal;
 
2527
 
 
2528
        //delete the tables associated to this theme
 
2529
        if (existRelation("te_theme_table","fk_thmtable_theme_id") != TeRICascadeDeletion)
 
2530
        {
 
2531
                sql = "DELETE FROM te_theme_table WHERE theme_id =" + Te2String(themeId);
 
2532
                if (!this->execute (sql))
 
2533
                        return false;
 
2534
        }
 
2535
                
 
2536
        //delete the grouping
 
2537
        if (existRelation("te_grouping","fk_group_theme_id")  != TeRICascadeDeletion)
 
2538
        {
 
2539
                sql = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
 
2540
                if (!this->execute (sql))
 
2541
                        return false;
 
2542
        }
 
2543
 
 
2544
        // delete raster visual
 
2545
        if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
 
2546
        {
 
2547
                sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
 
2548
                if (!this->execute (sql))
 
2549
                        return false;
 
2550
        }
 
2551
 
 
2552
        // delete the theme
 
2553
        sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
 
2554
        if (!this->execute (sql))
 
2555
                return false;
 
2556
 
 
2557
        return true;
 
2558
}
 
2559
 
 
2560
bool
 
2561
TeDatabase::deleteThemeGroup(int themeId)
 
2562
{
 
2563
        string sql;
 
2564
        // delete the theme
 
2565
        sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
 
2566
        if (!this->execute (sql))
 
2567
                return false;
 
2568
        return true;
 
2569
}
 
2570
 
 
2571
bool
 
2572
TeDatabase::deleteLegend(int themeId)
 
2573
{
 
2574
        // If there is a collection table update legend of the objects in it
 
2575
        TeDatabasePortal* portal = this->getPortal();
 
2576
        if(!portal)
 
2577
                return false;
 
2578
        string sel = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
 
2579
        string TC;
 
2580
        if (portal->query(sel) && portal->fetchRow())
 
2581
                TC = portal->getData(0);
 
2582
        delete portal;
 
2583
 
 
2584
        if (!TC.empty() && this->tableExist(TC))
 
2585
        {
 
2586
                string up = "UPDATE " + TC + " SET c_legend_id = 0";
 
2587
                if (!execute(up))
 
2588
                        return false;
 
2589
        }
 
2590
 
 
2591
        // Delete visual of the legends
 
2592
        string del = "DELETE FROM te_visual WHERE legend_id IN ";
 
2593
        del += "(SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
 
2594
        del += " AND group_id > -1)";
 
2595
        if (!execute(del))
 
2596
                return false;
 
2597
 
 
2598
        del = "DELETE FROM te_legend WHERE theme_id = " + Te2String(themeId);
 
2599
        del += " AND group_id > -1";
 
2600
        if (!execute(del))
 
2601
                return false;
 
2602
 
 
2603
        // Delete from memory the legends of the theme
 
2604
        unsigned int i;
 
2605
        TeTheme *theme = themeMap_[themeId];
 
2606
        TeLegendEntryVector& legendVector = theme->legend();
 
2607
        for (i = 0; i < legendVector.size(); ++i)
 
2608
                legendMap_.erase(legendVector[i].id());
 
2609
        legendVector.clear();
 
2610
 
 
2611
        //delete grouping
 
2612
        del = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
 
2613
        if (!execute (del))
 
2614
                return false;
 
2615
                
 
2616
        return true;
 
2617
}
 
2618
 
 
2619
bool
 
2620
TeDatabase::updateLayer(TeLayer *layer)
 
2621
{
 
2622
        if (!layer)
 
2623
                return false;
 
2624
 
 
2625
        string sql;
 
2626
        sql = "UPDATE te_layer SET ";
 
2627
        sql += "name = '" + layer->name() + "' ";
 
2628
        sql += ", lower_x = " + Te2String(layer->box().x1(),15) + " ";
 
2629
        sql += ", lower_y = " + Te2String(layer->box().y1(),15) + " ";
 
2630
        sql += ", upper_x = " + Te2String(layer->box().x2(),15) + " ";
 
2631
        sql += ", upper_y = " + Te2String(layer->box().y2(),15) + " ";
 
2632
        sql += " WHERE layer_id = " + Te2String(layer->id());
 
2633
 
 
2634
        if (layer->projection())
 
2635
                updateProjection(layer->projection());
 
2636
        return (this->execute (sql));
 
2637
}
 
2638
 
 
2639
bool
 
2640
TeDatabase::loadLayerSet()
 
2641
{
 
2642
        TeDatabasePortal* portal = this->getPortal();
 
2643
        if(!portal)
 
2644
                return false;
 
2645
 
 
2646
        string get = "SELECT * FROM te_layer";
 
2647
        if (!portal->query(get))
 
2648
        {       
 
2649
                layerMap_.clear();
 
2650
                delete portal;
 
2651
                return false;
 
2652
        }
 
2653
 
 
2654
        int lid;
 
2655
        while (portal->fetchRow())
 
2656
        {
 
2657
                TeLayer* layer = 0;
 
2658
                lid = portal->getInt("layer_id");
 
2659
                
 
2660
                TeLayerMap::iterator it = layerMap_.find(lid);
 
2661
                // if layer is not in the cache yet load it in a new pointer
 
2662
                if (it == layerMap_.end())
 
2663
                {
 
2664
                        layer = new TeLayer();
 
2665
                        layer->id(lid);
 
2666
                        loadLayer(layer);
 
2667
                }
 
2668
                // else just refresh the pointer
 
2669
                else
 
2670
                {
 
2671
                        it->second->id(lid);
 
2672
                        loadLayer(it->second);
 
2673
                }
 
2674
        }
 
2675
        delete portal;
 
2676
        return true;
 
2677
}
 
2678
 
 
2679
string
 
2680
TeDatabase::getRasterTable(int layerId, const string& objectId)
 
2681
{
 
2682
        if (layerId <=0 )
 
2683
                return "";
 
2684
 
 
2685
        TeDatabasePortal* portal = this->getPortal();
 
2686
        if(!portal)
 
2687
                return "";
 
2688
 
 
2689
        string get;
 
2690
        // get the raster representation
 
2691
        get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
 
2692
        get += " AND geom_type= " + Te2String((int)TeRASTER);
 
2693
        
 
2694
        // error executing query or no there is no raster representation 
 
2695
        if (!portal->query(get) || !portal->fetchRow())
 
2696
        {
 
2697
                delete portal;
 
2698
                return "";
 
2699
        }
 
2700
 
 
2701
        string tableName = portal->getData(0);
 
2702
        portal->freeResult();
 
2703
        if (tableName.empty())
 
2704
        {
 
2705
                delete portal;
 
2706
                return "";
 
2707
        }
 
2708
 
 
2709
        // check if a specific object is being looked for
 
2710
        get = "SELECT raster_table FROM " + tableName + " WHERE object_id='" + objectId + "'";
 
2711
        if (!portal->query(get) || !portal->fetchRow())
 
2712
        {
 
2713
                delete portal;
 
2714
                return "";
 
2715
        }
 
2716
        tableName = portal->getData(0);
 
2717
        delete portal;
 
2718
        return tableName;
 
2719
}
 
2720
 
 
2721
 
 
2722
TeRaster*
 
2723
TeDatabase::loadLayerRaster(int layerId, const string& objectId, const char& mode)
 
2724
{
 
2725
        if (layerId <=0 )
 
2726
                return 0;
 
2727
 
 
2728
        TeDatabasePortal* portal = this->getPortal();
 
2729
        if(!portal)
 
2730
                return 0;
 
2731
 
 
2732
        TeRaster* raster = 0;
 
2733
        string get;
 
2734
        // get the raster representation
 
2735
        get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
 
2736
        get += " AND geom_type= " + Te2String((int)TeRASTER);
 
2737
        
 
2738
        // error executing query or no there is no raster representation 
 
2739
        if (!portal->query(get) || !portal->fetchRow())
 
2740
        {
 
2741
                delete portal;
 
2742
                return 0;
 
2743
        }
 
2744
 
 
2745
        string tableName = portal->getData(0);
 
2746
        portal->freeResult();
 
2747
        if (tableName.empty())
 
2748
        {
 
2749
                delete portal;
 
2750
                return 0;
 
2751
        }
 
2752
 
 
2753
        //--- this check is made for compatibility reasons with older terralib databases
 
2754
        TeAttributeRep  attrRep;
 
2755
        attrRep.name_ = "tiling_type";
 
2756
        attrRep.type_ = TeINT;
 
2757
                
 
2758
        TeAttribute att;
 
2759
        if(!columnExist(tableName, attrRep.name_,att))
 
2760
        {
 
2761
                addColumn (tableName, attrRep);
 
2762
                string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
 
2763
                this->execute(sql);
 
2764
        }
 
2765
 
 
2766
        // ---
 
2767
 
 
2768
        // check if a specific object is being looked for
 
2769
        get = "SELECT * FROM " + tableName;
 
2770
        if (!objectId.empty())
 
2771
                get += " WHERE object_id='" + objectId + "'"; 
 
2772
        if (!portal->query(get) || !portal->fetchRow())
 
2773
        {
 
2774
                delete portal;
 
2775
                return 0;
 
2776
        }
 
2777
                
 
2778
        string oid = portal->getData("object_id");
 
2779
        int geomId = portal->getInt("geom_id"); // get raster representation id
 
2780
 
 
2781
        // get raster parameters from te_raster_table table
 
2782
        TeRasterParams params;
 
2783
        params.fileName_ = portal->getData("raster_table");
 
2784
        params.lutName_ = portal->getData("lut_table");
 
2785
        params.nBands(portal->getInt("num_bands"));
 
2786
        params.boundingBoxResolution(portal->getDouble("lower_x"),portal->getDouble("lower_y"),
 
2787
                                                                 portal->getDouble("upper_x"),portal->getDouble("upper_y"),
 
2788
                                                             portal->getDouble("res_x"),portal->getDouble("res_y"));
 
2789
        params.blockHeight_ = portal->getInt("block_height");
 
2790
        params.blockWidth_ = portal->getInt("block_width");
 
2791
        params.tiling_type_ = static_cast<TeRasterTilingType>(portal->getInt("tiling_type"));
 
2792
 
 
2793
        portal->freeResult();
 
2794
 
 
2795
        // get extra information from te_raster_metadata table
 
2796
        string metadatatable = tableName + "_metadata"; 
 
2797
        unsigned int nb = params.nBands();
 
2798
        unsigned int i;
 
2799
        for (i=0; i<nb; i++)
 
2800
        {
 
2801
                get = "SELECT * FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
 
2802
                get += " AND band_id=" + Te2String(i);
 
2803
                if (portal->query(get) && portal->fetchRow()) 
 
2804
                {
 
2805
                        params.vmax_[i] = portal->getDouble("max_value");
 
2806
                        params.vmin_[i] = portal->getDouble("min_value");
 
2807
                        params.nbitsperPixel_[i] = portal->getInt("num_bits");
 
2808
                        params.dataType_[i] = TeDataType(portal->getInt("data_type"));
 
2809
                        params.compression_[i] = TeCompressionMode(portal->getInt("compression_type"));
 
2810
                        params.photometric_[i] = portal->getInt("photometric_type");
 
2811
                }
 
2812
                portal->freeResult();
 
2813
        }
 
2814
 
 
2815
        // if raster is pallete get the associated LUT
 
2816
        if ((params.photometric_[0] == TeRASTERPALETTE) ||  
 
2817
    (params.photometric_[0] == TeRASTERKERNEL))
 
2818
                this->loadRasterLUT(&params);
 
2819
 
 
2820
        // raster has the same projection as its layer
 
2821
        get = "SELECT projection_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
 
2822
        int projId; 
 
2823
        TeProjection* proj=0;
 
2824
        if (portal->query(get) && portal->fetchRow())
 
2825
        {
 
2826
                projId = portal->getInt("projection_id");
 
2827
                proj = this->loadProjection(projId);
 
2828
        }
 
2829
        portal->freeResult();
 
2830
 
 
2831
        params.projection(proj);
 
2832
        if (proj)
 
2833
                delete proj;
 
2834
        params.nTilesInMemory_ = 0;
 
2835
        params.database_ = this;
 
2836
 
 
2837
        bool hasDummy = false;
 
2838
 
 
2839
        get = "SELECT band_id, dummy FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
 
2840
        get += " AND NOT (dummy IS NULL)";
 
2841
        if (portal->query(get))
 
2842
        {
 
2843
                while (portal->fetchRow())
 
2844
                {
 
2845
                        int b = portal->getInt(0);
 
2846
                        double d = portal->getDouble("dummy");
 
2847
                        params.setDummy(d,b);
 
2848
                        hasDummy = true;
 
2849
                }
 
2850
        }
 
2851
        params.useDummy_ = hasDummy;
 
2852
        params.mode_ = mode;
 
2853
        delete portal;
 
2854
 
 
2855
        // builds a raster from the parameters
 
2856
        TeDecoderDatabase* dec = new TeDecoderDatabase(params);
 
2857
        dec->init();
 
2858
        raster = new TeRaster();
 
2859
        raster->setDecoder(dec);
 
2860
        raster->objectId(oid);
 
2861
        return raster;
 
2862
}
 
2863
 
 
2864
bool 
 
2865
TeDatabase::loadRasterLUT(TeRasterParams* par)
 
2866
{
 
2867
        if (par->lutName_.empty())              
 
2868
                return false;
 
2869
        
 
2870
        TeDatabasePortal* portal = this->getPortal();
 
2871
        if (!portal)
 
2872
                return false;
 
2873
 
 
2874
        string get = "SELECT COUNT(index_id) FROM " + par->lutName_;
 
2875
        if (!portal->query(get) || !portal->fetchRow())  // if there is no table, or table is empty
 
2876
        {
 
2877
                delete portal;
 
2878
                return false;
 
2879
        }
 
2880
        int nentries = atoi(portal->getData(0));
 
2881
        if (nentries <= 0)
 
2882
        {
 
2883
                delete portal;
 
2884
                return false;
 
2885
        }
 
2886
 
 
2887
        par->setNumberPalleteEntries(nentries);
 
2888
        portal->freeResult();
 
2889
 
 
2890
        get = "SELECT * FROM " + par->lutName_ + " ORDER BY index_id ASC ";
 
2891
 
 
2892
        if (!portal->query(get) || !portal->fetchRow())  // if there is no table, or table is empty
 
2893
        {
 
2894
                delete portal;
 
2895
                return false;
 
2896
        }
 
2897
        do
 
2898
        {
 
2899
                int index = atoi(portal->getData(0));
 
2900
                par->lutr_[index] = atoi(portal->getData(1));
 
2901
                par->lutg_[index] = atoi(portal->getData(2));
 
2902
                par->lutb_[index] = atoi(portal->getData(3));
 
2903
        }while (portal->fetchRow());
 
2904
 
 
2905
        delete portal;
 
2906
        return true;
 
2907
}
 
2908
 
 
2909
 
 
2910
bool
 
2911
TeDatabase::loadLayer(TeLayer* layer)
 
2912
{
 
2913
        if (layer == 0)
 
2914
                return false;
 
2915
 
 
2916
        string get;
 
2917
        if (layer->id() > 0)
 
2918
                get = "SELECT * FROM te_layer WHERE layer_id = "+  Te2String(layer->id());
 
2919
        else if (!layer->name().empty())
 
2920
                get = "SELECT * FROM te_layer WHERE name = '"+  layer->name() + "'";
 
2921
        else
 
2922
        {
 
2923
                this->errorMessage_ = "Layer procurado nļæ½o possui nem id nem nome";
 
2924
                return false;
 
2925
        }
 
2926
 
 
2927
        TeDatabasePortal* portal = this->getPortal();
 
2928
        if(!portal)
 
2929
        {
 
2930
                this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
 
2931
                return false;
 
2932
        }
 
2933
 
 
2934
        if (!portal->query (get))
 
2935
        {       
 
2936
                delete portal;
 
2937
                return false;
 
2938
        }
 
2939
        if (!portal->fetchRow())
 
2940
        {       
 
2941
                delete portal;
 
2942
                return false;
 
2943
        }
 
2944
        
 
2945
        layer->id(atoi (portal->getData("layer_id")));
 
2946
        layer->name(string (portal->getData("name")));
 
2947
        layer->setLayerBox(TeBox(portal->getDouble("lower_x"),
 
2948
                                                portal->getDouble("lower_y"),
 
2949
                                                portal->getDouble("upper_x"),
 
2950
                                                portal->getDouble("upper_y")));
 
2951
        
 
2952
        int projId = portal->getInt("projection_id");
 
2953
        portal->freeResult();
 
2954
 
 
2955
    layer->setDatabase(this);
 
2956
 
 
2957
        // Load layer projection
 
2958
        TeProjection* proj = loadProjection (projId);
 
2959
        if (proj)
 
2960
                layer->setProjection (proj);
 
2961
 
 
2962
        // Load layer representations
 
2963
        get = "SELECT * FROM te_representation WHERE layer_id = "+Te2String(layer->id());
 
2964
        if (portal->query (get))
 
2965
        {
 
2966
                while (portal->fetchRow())
 
2967
                {
 
2968
                        TeRepresentation* repp = new TeRepresentation();
 
2969
                        repp->id_ = atoi(portal->getData(0));
 
2970
                        TeGeomRep g = (TeGeomRep)atoi (portal->getData(2));
 
2971
                        repp->geomRep_ = g;
 
2972
                        repp->tableName_ = portal->getData(3);
 
2973
                        repp->description_ = portal->getData(4);
 
2974
                        repp->box_ = TeBox(portal->getDouble(5),
 
2975
                                                portal->getDouble(6),
 
2976
                                                portal->getDouble(7),
 
2977
                                                portal->getDouble(8));
 
2978
                        repp->resX_ = portal->getDouble(9);
 
2979
                        repp->resY_ = portal->getDouble(10);
 
2980
                        repp->nCols_ = portal->getInt(11);
 
2981
                        repp->nLins_ = portal->getInt(12);
 
2982
                        layer->addVectRepres(repp);
 
2983
                }
 
2984
        }
 
2985
        
 
2986
        delete portal;
 
2987
        if(!loadLayerTable(layer))
 
2988
                return false;
 
2989
 
 
2990
        layerMap_[layer->id()] = layer;
 
2991
        return true; 
 
2992
}
 
2993
 
 
2994
bool
 
2995
TeDatabase::loadLayerTable(TeLayer* layer)
 
2996
{
 
2997
        TeDatabasePortal* portal = this->getPortal();
 
2998
        if(!portal)
 
2999
        {
 
3000
                this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
 
3001
                return false;
 
3002
        }
 
3003
        
 
3004
        // Get layer tables     
 
3005
        string get =  " SELECT * FROM te_layer_table"; 
 
3006
        get += " WHERE layer_id = " + Te2String(layer->id());
 
3007
        get += " ORDER BY attr_table_type, table_id";
 
3008
 
 
3009
        if (!portal->query (get))
 
3010
        {       
 
3011
                delete portal;
 
3012
                return false;
 
3013
        }
 
3014
 
 
3015
        while (portal->fetchRow())
 
3016
        {
 
3017
                string tableName = portal->getData("attr_table");
 
3018
                int    tableId = portal->getInt("table_id");
 
3019
                string indexName = portal->getData("attr_link");
 
3020
 
 
3021
                TeAttributeList attrList;
 
3022
                getAttributeList(tableName, attrList);
 
3023
 
 
3024
                TeTable attTable(tableName,attrList,
 
3025
                                         portal->getData("unique_id"), indexName,
 
3026
                                                 TeAttrTableType(portal->getInt("attr_table_type")));
 
3027
 
 
3028
                attTable.setId(tableId);
 
3029
                attTable.attInitialTime(portal->getData("attr_initial_time"));
 
3030
                attTable.attFinalTime(portal->getData("attr_final_time"));
 
3031
                attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
 
3032
 
 
3033
                layer->addAttributeTable(attTable);
 
3034
        }
 
3035
 
 
3036
        delete portal;
 
3037
        return true;
 
3038
}
 
3039
 
 
3040
bool 
 
3041
TeDatabase::layerExist(int layerId)
 
3042
{
 
3043
        TeDatabasePortal* portal = this->getPortal();
 
3044
        if (!portal)
 
3045
                return false;
 
3046
 
 
3047
        string sql = "SELECT layer_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
 
3048
        if (!portal->query(sql))
 
3049
        {       
 
3050
                delete portal;
 
3051
                return false;
 
3052
        }
 
3053
        if (!portal->fetchRow())
 
3054
        {
 
3055
                delete portal;
 
3056
                return false;
 
3057
        }
 
3058
        delete portal;
 
3059
        return true;
 
3060
}
 
3061
 
 
3062
bool 
 
3063
TeDatabase::layerExist(string layerName)
 
3064
{
 
3065
        TeDatabasePortal* portal = this->getPortal();
 
3066
        if (!portal)
 
3067
                return false;
 
3068
 
 
3069
        layerName = TeConvertToUpperCase(layerName);
 
3070
 
 
3071
        string sql = "SELECT name FROM te_layer";
 
3072
        if (!portal->query(sql))
 
3073
        {       
 
3074
                delete portal;
 
3075
                return false;
 
3076
        }
 
3077
        while (portal->fetchRow())
 
3078
        {
 
3079
                string name = portal->getData(0);
 
3080
                name = TeConvertToUpperCase(name);
 
3081
                if (layerName == name)
 
3082
                {
 
3083
                        delete portal;
 
3084
                        return true;
 
3085
                }
 
3086
        }
 
3087
        delete portal;
 
3088
        return false;
 
3089
}
 
3090
 
 
3091
 
 
3092
bool
 
3093
TeDatabase::deleteLayer(int layerId)
 
3094
{
 
3095
        //Delete attributes tables
 
3096
        if(!deleteLayerTable(layerId))
 
3097
                return false;
 
3098
 
 
3099
        TeDatabasePortal* portal = this->getPortal();
 
3100
        if (!portal)
 
3101
                return false;
 
3102
 
 
3103
        
 
3104
        string sql = "SELECT projection_id FROM te_layer WHERE layer_id = ";
 
3105
        sql += Te2String(layerId);
 
3106
 
 
3107
        if (!portal->query(sql))
 
3108
        {       
 
3109
                delete portal;
 
3110
                return false;
 
3111
        }
 
3112
 
 
3113
        if (!portal->fetchRow())
 
3114
        {
 
3115
                delete portal;
 
3116
                return false;
 
3117
        }
 
3118
        string projId = portal->getData("projection_id");
 
3119
        portal->freeResult();
 
3120
 
 
3121
        // Get all representations that are associated to this layer
 
3122
        sql = "SELECT * FROM te_representation WHERE layer_id = "+ Te2String(layerId);
 
3123
        if (!portal->query (sql))
 
3124
        {
 
3125
                delete portal;
 
3126
                return false;
 
3127
        }
 
3128
 
 
3129
        while (portal->fetchRow())
 
3130
        {       
 
3131
                // Save the name of the geometry table
 
3132
                string geomTable = portal->getData("geom_table");
 
3133
 
 
3134
                // Delete lut table
 
3135
                TeGeomRep rep = TeGeomRep(portal->getInt("geom_type"));
 
3136
                if (rep == TeRASTER)
 
3137
                {
 
3138
                        TeDatabasePortal* portal2 = this->getPortal();
 
3139
                        sql = "SELECT lut_table, raster_table FROM " + geomTable;
 
3140
                        string tabName;
 
3141
                        if (!portal2->query (sql))
 
3142
                        {
 
3143
                                delete portal2;
 
3144
                                continue;
 
3145
                        }
 
3146
 
 
3147
                        while (portal2->fetchRow())
 
3148
                        {
 
3149
                                // remove lut table
 
3150
                                tabName = portal2->getData(0);
 
3151
                                if (!tabName.empty() && this->tableExist(tabName))
 
3152
                                {
 
3153
                                        sql = "DROP TABLE " + tabName;
 
3154
                                        this->execute(sql);
 
3155
                                }
 
3156
                                // remove raster table
 
3157
                                tabName = portal2->getData(1);
 
3158
                                if (!tabName.empty() && this->tableExist(tabName))
 
3159
                                {
 
3160
                                        sql = "DROP TABLE " + tabName;
 
3161
                                        this->execute(sql);
 
3162
                                }
 
3163
                        }
 
3164
                        delete portal2;
 
3165
                        // remove raster metadata table
 
3166
                        tabName = geomTable + "_metadata";
 
3167
                        if (!tabName.empty() && this->tableExist(tabName))
 
3168
                        {
 
3169
                                sql = "DROP TABLE " + tabName;
 
3170
                                this->execute(sql);
 
3171
                        }
 
3172
                }
 
3173
                if (this->tableExist(geomTable))
 
3174
                {
 
3175
                        sql = "DROP TABLE " + geomTable;
 
3176
                        if (!this->execute(sql) )
 
3177
                        {
 
3178
                                delete portal;
 
3179
                                return false;
 
3180
                        }
 
3181
                }
 
3182
        }
 
3183
        portal->freeResult();
 
3184
 
 
3185
        if (existRelation("te_representation","fk_rep_layer_id") != TeRICascadeDeletion)
 
3186
        {
 
3187
                // Delete entries into representations table
 
3188
                sql = "DELETE FROM te_representation WHERE layer_id = " +Te2String(layerId);
 
3189
                if (!this->execute(sql) )
 
3190
                {
 
3191
                        delete portal;
 
3192
                        return false;
 
3193
                }
 
3194
        }
 
3195
 
 
3196
        // delete layer themes
 
3197
        sql = "SELECT theme_id FROM te_theme WHERE layer_id=" + Te2String(layerId);
 
3198
        if (!portal->query (sql))
 
3199
        {
 
3200
                delete portal;
 
3201
                return false;
 
3202
        }
 
3203
        
 
3204
        int themeId;
 
3205
        while (portal->fetchRow())
 
3206
        {       
 
3207
                themeId = portal->getInt("theme_id");
 
3208
                this->deleteTheme(themeId);
 
3209
        }
 
3210
        
 
3211
        sql = "DELETE FROM te_layer WHERE layer_id=" + Te2String(layerId);
 
3212
        if (!this->execute(sql))
 
3213
        {
 
3214
                delete portal;
 
3215
                return false;
 
3216
        }
 
3217
 
 
3218
        // delete layer projection
 
3219
        sql = "DELETE FROM te_projection WHERE projection_id = "+ projId;
 
3220
        if (!this->execute(sql))
 
3221
        {       
 
3222
                delete portal;
 
3223
                return false;
 
3224
        }
 
3225
 
 
3226
        // remove all the itemsļæ½ themes associated to the layer to be removed
 
3227
        TeThemeMap::iterator it;
 
3228
        for (it = themeMap_.begin(); it != themeMap_.end(); ++it)
 
3229
        {
 
3230
                TeTheme *theme = it->second;
 
3231
                if (theme && theme->layer() && (theme->layer()->id() == layerId))
 
3232
                {
 
3233
                        themeMap_.erase(theme->id());
 
3234
                        delete theme;
 
3235
                }
 
3236
        }
 
3237
 
 
3238
        // delete layer and its entry in the layer map
 
3239
        TeLayer* layer = layerMap_[layerId];
 
3240
        layerMap_.erase(layerId);
 
3241
        delete layer;
 
3242
 
 
3243
        delete portal;
 
3244
        return true;
 
3245
}
 
3246
 
 
3247
 
 
3248
bool
 
3249
TeDatabase::deleteLayerTable (int layerId, TeAttrTableType ttype)
 
3250
{
 
3251
        TeDatabasePortal* portal = this->getPortal();
 
3252
        if(!portal)
 
3253
                return false;
 
3254
 
 
3255
        //tables of the type 1 can be relationed with other layer ??? Conferir
 
3256
        string query = "SELECT attr_table, table_id FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
 
3257
        query += " AND attr_table_type = " + Te2String(static_cast<int>(ttype));
 
3258
        if(!portal->query(query))
 
3259
        {
 
3260
                delete portal;
 
3261
                return false;
 
3262
        }
 
3263
                
 
3264
        vector<int> tableIds;
 
3265
        string attrTable;
 
3266
        string tableId;
 
3267
        string drop;
 
3268
        while (portal->fetchRow())
 
3269
        {
 
3270
                attrTable = portal->getData(0);
 
3271
                tableId = portal->getData(1);
 
3272
                drop = "DROP TABLE " + attrTable;
 
3273
                if(!execute(drop))
 
3274
                {
 
3275
                        delete portal;
 
3276
                        return false;
 
3277
                }
 
3278
                tableIds.push_back(atoi(tableId.c_str()));
 
3279
 
 
3280
                string del  = "DELETE FROM te_address_locator WHERE table_id = "+ tableId;
 
3281
                execute(del);
 
3282
        }
 
3283
 
 
3284
        delete portal;
 
3285
        string del;
 
3286
        if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") != TeRICascadeDeletion)
 
3287
        {
 
3288
                for (unsigned int i=0; i<tableIds.size();i++)
 
3289
                {
 
3290
                        del = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(tableIds[i]);
 
3291
                        if (!execute (del))
 
3292
                                return false;
 
3293
                }
 
3294
        }
 
3295
        del = "DELETE FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
 
3296
        if (!execute (del))
 
3297
                return false;
 
3298
        return true;
 
3299
}
 
3300
 
 
3301
bool 
 
3302
TeDatabase::updateRepresentation (int layerId, TeRepresentation& rep)
 
3303
{
 
3304
        if (layerId <= 0)
 
3305
                return false;
 
3306
 
 
3307
        string sql;
 
3308
        sql  = "UPDATE te_representation SET ";
 
3309
        sql += " lower_x= " + Te2String(rep.box_.x1(),15);
 
3310
        sql += ", lower_y= " + Te2String(rep.box_.y1(),15);
 
3311
        sql += ", upper_x= " + Te2String(rep.box_.x2(),15);
 
3312
        sql += ", upper_y= " + Te2String(rep.box_.y2(),15);
 
3313
        sql += ", description= '" + rep.description_ + "'";
 
3314
        sql += ", res_x= " + Te2String(rep.resX_);
 
3315
        sql += ", res_y= " + Te2String(rep.resY_);
 
3316
        sql += ", num_cols=" + Te2String(rep.nCols_);
 
3317
        sql += ", num_rows=" + Te2String(rep.nLins_);
 
3318
 
 
3319
        if (rep.geomRep_ != TeTEXT)
 
3320
                sql += ", geom_table='" + rep.tableName_ + "'";
 
3321
 
 
3322
        sql += " WHERE layer_id=" + Te2String(layerId);
 
3323
        sql += " AND geom_type= " + Te2String(rep.geomRep_);
 
3324
 
 
3325
        if (rep.geomRep_ == TeTEXT)
 
3326
                sql += " AND geom_table='" + rep.tableName_ + "'";
 
3327
 
 
3328
        return this->execute(sql);
 
3329
}
 
3330
 
 
3331
bool 
 
3332
TeDatabase::insertRasterGeometry(const string& tableName, TeRasterParams& par, const string& objectId)
 
3333
{
 
3334
        if (tableName.empty())
 
3335
                return false;
 
3336
        
 
3337
        string objId; 
 
3338
        if (objectId.empty())
 
3339
                objId = "O1";
 
3340
        else
 
3341
                objId = objectId;
 
3342
 
 
3343
        //------ this check is made for compatibility reasons with old versions of TerraLib databases
 
3344
        TeAttributeRep  attrRep;
 
3345
        attrRep.name_ = "tiling_type";
 
3346
        attrRep.type_ = TeINT;
 
3347
                
 
3348
        TeAttribute att;
 
3349
        if(!columnExist(tableName, attrRep.name_,att))
 
3350
        {
 
3351
                addColumn (tableName, attrRep);
 
3352
                string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
 
3353
                this->execute(sql);
 
3354
        }
 
3355
        //------
 
3356
 
 
3357
        // finds the name of the raster geometry table
 
3358
        TeDatabasePortal* portal = this->getPortal();
 
3359
        if(!portal)
 
3360
                return false;
 
3361
 
 
3362
        TeBox box = par.boundingBox();
 
3363
 
 
3364
        string ins = "INSERT INTO " + tableName + " (object_id, raster_table, lut_table, ";
 
3365
        ins += "res_x, res_y, num_bands, num_cols, num_rows, block_height, block_width, ";
 
3366
        ins += "lower_x, lower_y, upper_x, upper_y, tiling_type) ";
 
3367
        ins += " VALUES ('" + objId + "', '" + par.fileName_+ "', '" +  par.lutName_ + "', ";
 
3368
        ins += Te2String(par.resx_) + ", " + Te2String(par.resy_) + ", ";
 
3369
        ins += Te2String(par.nBands()) + ", " + Te2String(par.ncols_) + ", " + Te2String(par.nlines_) + ", ";
 
3370
        ins += Te2String(par.blockHeight_) + ", " + Te2String(par.blockWidth_) + ", ";
 
3371
        ins += Te2String(box.x1_,15) +", " + Te2String(box.y1_,15) + ", ";
 
3372
        ins += Te2String(box.x2_,15) +", " + Te2String(box.y2_,15) + ", ";
 
3373
        ins     += Te2String(par.tiling_type_) + ")";
 
3374
        if (!this->execute(ins))
 
3375
        {
 
3376
                delete portal;
 
3377
                return false;
 
3378
        }
 
3379
 
 
3380
        // save the pallete associated to the raster
 
3381
        // if it doesnļæ½t exist yet
 
3382
        if ((par.photometric_[0] == TeRASTERPALETTE ||
 
3383
         par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty()) 
 
3384
        {
 
3385
 
 
3386
                 if (!this->tableExist(par.lutName_))
 
3387
                 {
 
3388
                         if (this->createLUTTable(par.lutName_))
 
3389
                        {
 
3390
                                for (unsigned int i=0; i<par.lutb_.size(); i++)
 
3391
                                {
 
3392
                                        string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
 
3393
                                        sql += Te2String(i) + ", ";
 
3394
                                        sql += Te2String(par.lutr_[i]) + ", ";
 
3395
                                        sql += Te2String(par.lutg_[i]) + ", ";
 
3396
                                        sql += Te2String(par.lutb_[i]) + ")";
 
3397
                                        this->execute(sql);
 
3398
                                }
 
3399
                         }
 
3400
                 }
 
3401
        }
 
3402
        
 
3403
        ins = "SELECT geom_id FROM " + tableName + " WHERE object_id='" + objId + "'";
 
3404
        ins += " AND raster_table='" + par.fileName_+ "'";
 
3405
        if(!portal->query(ins) || !portal->fetchRow())
 
3406
        {
 
3407
                delete portal;
 
3408
                return false;
 
3409
        }
 
3410
        int geomId = atoi(portal->getData(0));
 
3411
        delete portal;
 
3412
        string  metadataTableName = tableName+"_metadata";
 
3413
        insertRasterMetadata(metadataTableName, geomId,par);
 
3414
         return true;
 
3415
}
 
3416
 
 
3417
bool 
 
3418
TeDatabase::updateRasterRepresentation(int layerId, TeRasterParams& par, const string& objectId)
 
3419
{
 
3420
        TeDatabasePortal* portal = this->getPortal();
 
3421
        if(!portal)
 
3422
                return false;
 
3423
 
 
3424
        string sql = "SELECT repres_id, lower_x, lower_y, upper_x, upper_y, geom_table ";
 
3425
        sql += " FROM te_representation WHERE layer_id= " + Te2String(layerId);
 
3426
        sql += " AND geom_type= " + Te2String(TeRASTER);
 
3427
 
 
3428
        if(!portal->query(sql) || !portal->fetchRow())
 
3429
        {
 
3430
                delete portal;
 
3431
                return false;
 
3432
        }
 
3433
        TeBox box (portal->getDouble(1),portal->getDouble(2),
 
3434
                       portal->getDouble(3),portal->getDouble(4));
 
3435
        int represId = atoi(portal->getData(0));
 
3436
        string rasterrep = portal->getData(5);
 
3437
        portal->freeResult();
 
3438
 
 
3439
        updateBox(box,par.boundingBox());
 
3440
        sql = "UPDATE te_representation SET lower_x = " + Te2String(box.x1_,15);
 
3441
        sql += ", lower_y = " + Te2String(box.y1_,15) + ", upper_x = " + Te2String(box.x2_,15);
 
3442
        sql += ", upper_y = " + Te2String(box.y2_,15) + "  WHERE repres_id=" + Te2String(represId);
 
3443
 
 
3444
        if(!execute(sql))
 
3445
        {
 
3446
                delete portal;
 
3447
                return false;
 
3448
        }        
 
3449
 
 
3450
        string objId; 
 
3451
        if (objectId.empty())
 
3452
                objId = "O1";
 
3453
        else
 
3454
                objId = objectId;
 
3455
 
 
3456
        box = par.boundingBox();
 
3457
 
 
3458
        sql = "UPDATE " + rasterrep + " SET lut_table ='" + par.lutName_ + "'";
 
3459
        sql += ", res_x= " + Te2String(par.resx_) + ", res_y=" + Te2String(par.resy_);
 
3460
        sql += ", num_bands=" + Te2String(par.nBands()) + ", num_cols=" + Te2String(par.ncols_);
 
3461
        sql += ", num_rows=" + Te2String(par.nlines_) + ", block_height=" +  Te2String(par.blockHeight_);
 
3462
        sql += ", block_width= " + Te2String(par.blockWidth_) + ", lower_x = " + Te2String(box.x1_,15);
 
3463
        sql += ", lower_y = " + Te2String(box.y1_,15) +  ", upper_x = " + Te2String(box.x2_,15);
 
3464
        sql += ", upper_y = " + Te2String(box.y2_,15);
 
3465
        sql += "  WHERE object_id='" + objId + "' AND raster_table='" + par.fileName_ + "'";
 
3466
        if (!this->execute(sql))
 
3467
        {
 
3468
                delete portal;
 
3469
                return false;
 
3470
        }
 
3471
        
 
3472
        sql = "SELECT geom_id FROM " + rasterrep + " WHERE object_id='" + objId + "'";
 
3473
        sql+= " AND raster_table='" + par.fileName_+ "'";
 
3474
        if(!portal->query(sql) || !portal->fetchRow())
 
3475
        {
 
3476
                delete portal;
 
3477
                return false;
 
3478
        }
 
3479
 
 
3480
        // save the pallete associated to the raster
 
3481
        // if it doesnļæ½t exist yet
 
3482
        if ((par.photometric_[0] == TeRASTERPALETTE ||
 
3483
         par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty()) 
 
3484
        {
 
3485
 
 
3486
                 if (!this->tableExist(par.lutName_))
 
3487
                 {
 
3488
                         if (this->createLUTTable(par.lutName_))
 
3489
                        {
 
3490
                                for (unsigned int i=0; i<par.lutb_.size(); i++)
 
3491
                                {
 
3492
                                        string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
 
3493
                                        sql += Te2String(i) + ", ";
 
3494
                                        sql += Te2String(par.lutr_[i]) + ", ";
 
3495
                                        sql += Te2String(par.lutg_[i]) + ", ";
 
3496
                                        sql += Te2String(par.lutb_[i]) + ")";
 
3497
                                        this->execute(sql);
 
3498
                                }
 
3499
                         }
 
3500
                 }
 
3501
        }
 
3502
 
 
3503
        int geomId = atoi(portal->getData(0));
 
3504
        delete portal;
 
3505
        string metadatatabel = rasterrep + "_metadata";
 
3506
        return updateRasterMetadata(metadatatabel,geomId,par);
 
3507
}
 
3508
 
 
3509
bool 
 
3510
TeDatabase::insertRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
 
3511
{
 
3512
        if (geomId <= 0)
 
3513
                return false;
 
3514
        
 
3515
        string ins;
 
3516
        unsigned int i;
 
3517
 
 
3518
        unsigned int nb = par.nBands();
 
3519
        ins = "INSERT INTO " + tableName + " (geom_id, band_id, min_value, max_value, ";
 
3520
        ins += " num_bits, data_type, photometric_type, compression_type ) VALUES (";
 
3521
        string vals;
 
3522
        for (i=0; i<nb; i++)
 
3523
        {
 
3524
                vals = Te2String(geomId) + ", " + Te2String(i) + ", ";
 
3525
                vals += Te2String(par.vmin_[i],15) + ", " +  Te2String(par.vmax_[i],15) + ", ";
 
3526
                vals += Te2String(par.nbitsperPixel_[i]) + ", " +  Te2String(par.dataType_[i]) + ", " ;
 
3527
                vals += Te2String(par.photometric_[i]) + ", " +  Te2String(par.compression_[i]) + " )" ;
 
3528
                string sql = ins + vals;
 
3529
                if (!this->execute(sql))
 
3530
                        return false;
 
3531
        }
 
3532
 
 
3533
        // update dummy value
 
3534
        if (par.useDummy_)
 
3535
        {
 
3536
                ins = "UPDATE " + tableName + " SET dummy = ";
 
3537
                for (i=0; i<nb; i++)
 
3538
                {
 
3539
                        vals = Te2String(par.dummy_[i]) + " WHERE geom_id = " +  Te2String(geomId);
 
3540
                        vals += " AND band_id=" + Te2String(i);
 
3541
                        string sql = ins + vals;
 
3542
                        if (!this->execute(sql))
 
3543
                                return false;
 
3544
                }
 
3545
        }
 
3546
        return true;
 
3547
}
 
3548
 
 
3549
bool 
 
3550
TeDatabase::updateRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
 
3551
{
 
3552
        if (geomId <= 0)
 
3553
                return false;
 
3554
 
 
3555
        string sql = "DELETE FROM " + tableName + " WHERE geom_id = " + Te2String(geomId);
 
3556
        if (!this->execute (sql))
 
3557
                return false;
 
3558
        return insertRasterMetadata(tableName,geomId,par);
 
3559
}
 
3560
 
 
3561
bool 
 
3562
TeDatabase::updateLegend (TeLegendEntry *legend)
 
3563
{
 
3564
        if (!legend)
 
3565
                return false;
 
3566
 
 
3567
        string sql;
 
3568
        if (legend->id() > 0 )
 
3569
        {
 
3570
                sql = "UPDATE te_legend SET ";
 
3571
                sql += " theme_id=" + Te2String (legend->theme());
 
3572
                sql += ",group_id=" + Te2String (legend->group());
 
3573
                sql += ",num_objs=" + Te2String (legend->count());
 
3574
                sql += ",lower_value='" + escapeSequence(legend->from())+"'";
 
3575
                sql += ",upper_value='" + escapeSequence(legend->to())+"'";
 
3576
                sql += ",label='" + escapeSequence(legend->label())+"'";
 
3577
                sql += " WHERE legend_id=" + Te2String (legend->id());
 
3578
 
 
3579
                if (execute(sql) == false)
 
3580
                        return false;
 
3581
        }
 
3582
        else
 
3583
        {
 
3584
                if (!insertLegend(legend))
 
3585
                        return false;
 
3586
        }
 
3587
        legendMap_[legend->id()] = legend;
 
3588
 
 
3589
        return updateVisual(legend);
 
3590
}
 
3591
 
 
3592
bool
 
3593
TeDatabase::updateVisual(TeLegendEntry *legend)
 
3594
{
 
3595
        if (!legend)
 
3596
                return false;
 
3597
 
 
3598
        TeGeomRepVisualMap mapVis = legend->getVisualMap();
 
3599
        TeGeomRepVisualMap::iterator it =  mapVis.begin();
 
3600
        while ( it != mapVis.end())
 
3601
        { 
 
3602
                        
 
3603
                TeGeomRep rep = it->first;
 
3604
                TeVisual vis = it->second;
 
3605
 
 
3606
                TeColor cor = vis.color();                              // filling color
 
3607
                TeColor contourCor = vis.contourColor();// contour color
 
3608
 
 
3609
                string update = "UPDATE te_visual SET ";
 
3610
                update += " lib_name = '"+ vis.libName() +"', ";
 
3611
                update += "red = "+ Te2String(cor.red_) + ", ";
 
3612
                update += "green =" + Te2String(cor.green_) + ", ";
 
3613
                update += "blue =" + Te2String(cor.blue_) + ", ";
 
3614
                update += "transparency =" + Te2String(vis.transparency()) + ", ";
 
3615
 
 
3616
                update += "contour_lib_name='"+ vis.contourLibName() +"', ";
 
3617
                update += "contour_red=" + Te2String(contourCor.red_) + ", ";
 
3618
                update += "contour_green=" + Te2String(contourCor.green_) + ", ";
 
3619
                update += "contour_blue=" + Te2String(contourCor.blue_) + ", "; 
 
3620
                update += "contour_transp=" + Te2String(vis.contourTransparency()) + ", ";
 
3621
                update += "contour_width=" + Te2String(vis.contourWidth()) + ", ";
 
3622
 
 
3623
                if(rep == TePOLYGONS)
 
3624
                {
 
3625
                        update += "width=" + Te2String(vis.contourWidth()) + ", ";
 
3626
                        update += "contour_symb_id=" + Te2String(vis.contourStyle()) + ", ";
 
3627
                        update += "symb_id=" + Te2String(vis.style()) + ", ";
 
3628
                }
 
3629
                else if(rep == TeLINES)
 
3630
                {
 
3631
                        update += "width=" + Te2String(vis.width()) + ", ";
 
3632
                        update += "symb_id=" + Te2String(vis.style()) + ", ";
 
3633
                }
 
3634
                else if(rep == TePOINTS)
 
3635
                {
 
3636
                        update += "size_value=" + Te2String(vis.size()) + ", ";
 
3637
                        update += "symb_id=" + Te2String(vis.style ()) + ", ";
 
3638
                }
 
3639
                else if(rep == TeTEXT)
 
3640
                {
 
3641
                        update += "size_value=" + Te2String(vis.size()) + ", ";
 
3642
                        update += "pt_angle=" + Te2String(vis.ptAngle()) + ", ";
 
3643
                }
 
3644
 
 
3645
                update += "family='" + vis.family() + "', ";
 
3646
                if (vis.bold())
 
3647
                        update += "bold=1, ";
 
3648
                else
 
3649
                        update += "bold=0, ";
 
3650
 
 
3651
                if (vis.italic())
 
3652
                        update += "italic=1, ";
 
3653
                else
 
3654
                        update += "italic=0, ";
 
3655
 
 
3656
                update += "fixed_size=" + Te2String(vis.fixedSize())+ ", ";
 
3657
                update += "alignment_vert=" + Te2String(vis.alignmentVert())+ ", ";
 
3658
                update += "alignment_horiz=" + Te2String(vis.alignmentHoriz())+ ", ";
 
3659
                update += "tab_size=" + Te2String(vis.tabSize())+ ", ";
 
3660
                update += "line_space=" + Te2String(vis.lineSpace());
 
3661
 
 
3662
                update += " WHERE legend_id= " + Te2String(legend->id()) ;
 
3663
                update += " AND geom_type= " + Te2String(rep);
 
3664
 
 
3665
                if (!execute(update))
 
3666
                        return false;
 
3667
                ++it;
 
3668
        }
 
3669
        return true;
 
3670
}
 
3671
 
 
3672
bool 
 
3673
TeDatabase::loadLegend (TeTheme *theme)
 
3674
{
 
3675
        if (!theme)
 
3676
                return false;
 
3677
 
 
3678
        unsigned int i;
 
3679
        int legId, gId, lastLegId;
 
3680
        TeGeomRep rep;
 
3681
        TeVisual visual;
 
3682
        vector<string> legIdVec;
 
3683
        map<int, TeLegendEntry> legMap;
 
3684
        map<int, TeLegendEntry>::iterator it;
 
3685
        map<int, TeLegendEntry*> ownLegMap;
 
3686
 
 
3687
        theme->cleanLegend();
 
3688
 
 
3689
        TeDatabasePortal* portal = getPortal();
 
3690
 
 
3691
        string q = "SELECT * FROM te_legend WHERE theme_id = " + Te2String(theme->id());
 
3692
        q += " ORDER BY legend_id";
 
3693
 
 
3694
        if (!portal->query(q))
 
3695
        {       
 
3696
                delete portal;
 
3697
                return false;
 
3698
        }
 
3699
 
 
3700
        while(portal->fetchRow())
 
3701
        {
 
3702
                legId = portal->getInt("legend_id");
 
3703
                legIdVec.push_back(Te2String(legId));
 
3704
 
 
3705
                TeLegendEntry& legEntry = legMap[legId];
 
3706
                legEntry.id(legId);
 
3707
                legEntry.theme(theme->id());
 
3708
                TeSlice& slice = legEntry.slice();
 
3709
                
 
3710
                gId = portal->getInt("group_id");
 
3711
                legEntry.group(gId);
 
3712
                if (gId == -10)
 
3713
                {
 
3714
                        TeLegendEntry* ownLeg = new TeLegendEntry;
 
3715
                        ownLegMap[legId] = ownLeg;
 
3716
                }
 
3717
 
 
3718
                string lb = portal->getData("label");
 
3719
                legEntry.label(lb);
 
3720
                slice.count_ = portal->getInt("num_objs");
 
3721
                slice.from_ = portal->getData("lower_value");
 
3722
                slice.to_ = portal->getData("upper_value");
 
3723
        }
 
3724
 
 
3725
        string inClause;
 
3726
        for(i = 0; i < legIdVec.size(); ++i)
 
3727
        {
 
3728
                inClause += legIdVec[i];
 
3729
                if (i != legIdVec.size() - 1)
 
3730
                        inClause += ",";
 
3731
        }
 
3732
 
 
3733
        portal->freeResult();
 
3734
        q = "SELECT * FROM te_visual WHERE legend_id IN (";
 
3735
        q += inClause + ") ORDER BY legend_id";
 
3736
 
 
3737
        if (!portal->query(q))
 
3738
        {       
 
3739
                delete portal;
 
3740
                return false;
 
3741
        }
 
3742
 
 
3743
        while(portal->fetchRow())
 
3744
        {
 
3745
                legId = portal->getInt("legend_id");
 
3746
                rep = TeGeomRep(portal->getInt("geom_type"));
 
3747
                visual = portal->getVisual();
 
3748
 
 
3749
                TeLegendEntry& legEntry = legMap[legId];
 
3750
                gId = legEntry.group();
 
3751
                legEntry.setVisual(visual, rep);
 
3752
 
 
3753
                if (gId == -10)         // own visual
 
3754
                {
 
3755
                        TeLegendEntry* ownLegend = ownLegMap[legId];
 
3756
                        *ownLegend = legEntry;
 
3757
 
 
3758
                        if (rep == TePOLYGONS)
 
3759
                                ownLegend->setVisual(visual, TePOLYGONS);
 
3760
                        else if (rep == TeLINES)
 
3761
                                ownLegend->setVisual(visual, TeLINES);
 
3762
                        else if (rep == TePOINTS)
 
3763
                                ownLegend->setVisual(visual, TePOINTS);
 
3764
                        else if (rep == TeTEXT)
 
3765
                                ownLegend->setVisual(visual, TeTEXT);
 
3766
 
 
3767
                        legendMap_[legId] = ownLegend;
 
3768
                }
 
3769
                else if(gId == -6)
 
3770
                {
 
3771
                        TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
 
3772
                        pointingQueryLegend = legEntry;
 
3773
 
 
3774
                        pointingQueryLegend.setVisual(visual, TeLINES); 
 
3775
                        pointingQueryLegend.setVisual(visual, TePOINTS);
 
3776
                        pointingQueryLegend.setVisual(visual, TeCELLS);
 
3777
                        pointingQueryLegend.setVisual(visual, TeTEXT);  
 
3778
 
 
3779
                        legendMap_[legId] = &pointingQueryLegend;
 
3780
                }
 
3781
                else if(gId == -5)
 
3782
                {
 
3783
                        TeLegendEntry& queryLegend = theme->queryLegend();
 
3784
                        queryLegend = legEntry;
 
3785
 
 
3786
                        queryLegend.setVisual(visual, TeLINES); 
 
3787
                        queryLegend.setVisual(visual, TePOINTS);
 
3788
                        queryLegend.setVisual(visual, TeCELLS);
 
3789
                        queryLegend.setVisual(visual, TeTEXT); 
 
3790
 
 
3791
                        legendMap_[legId] = &queryLegend;
 
3792
                }
 
3793
                else if(gId == -4)
 
3794
                {
 
3795
                        TeLegendEntry& pointingLegend = theme->pointingLegend();
 
3796
                        pointingLegend = legEntry;
 
3797
 
 
3798
                        pointingLegend.setVisual(visual, TeLINES); 
 
3799
                        pointingLegend.setVisual(visual, TePOINTS);
 
3800
                        pointingLegend.setVisual(visual, TeCELLS);
 
3801
                        pointingLegend.setVisual(visual, TeTEXT);  
 
3802
 
 
3803
                        legendMap_[legId] = &pointingLegend;
 
3804
                }
 
3805
                else if(gId == -3)
 
3806
                {
 
3807
                        TeLegendEntry& defaultLegend = theme->defaultLegend();
 
3808
                        defaultLegend = legEntry;
 
3809
                        legendMap_[legId] = &defaultLegend;
 
3810
 
 
3811
                        // Make the pointing visual equal to the default visual, excluding
 
3812
                        // the pointing color 
 
3813
                        TeColor color;
 
3814
                        TeLegendEntry& pointingLegend = theme->pointingLegend();
 
3815
                        TeVisual& pointingVisual = pointingLegend.visual(rep);
 
3816
                        color = pointingVisual.color();
 
3817
                        pointingLegend.setVisual(visual, rep);
 
3818
                        pointingVisual.color(color);
 
3819
 
 
3820
                        // Make the query visual equal to the default visual, excluding
 
3821
                        // the query color 
 
3822
                        TeLegendEntry& queryLegend = theme->queryLegend();
 
3823
                        TeVisual& queryVisual = queryLegend.visual(rep);
 
3824
                        color = queryVisual.color();
 
3825
                        queryLegend.setVisual(visual, rep);
 
3826
                        queryVisual.color(color);
 
3827
 
 
3828
                        // Make the pointingQuery visual equal to the default visual, excluding
 
3829
                        // the pointingQuery color 
 
3830
                        TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
 
3831
                        TeVisual& pointingQueryVisual = pointingQueryLegend.visual(rep);
 
3832
                        color = pointingQueryVisual.color();
 
3833
                        pointingQueryLegend.setVisual(visual, rep);
 
3834
                        pointingQueryVisual.color(color);
 
3835
                }
 
3836
                else if(gId == -2)
 
3837
                {
 
3838
                        TeLegendEntry& withoutDataConnectionLegend = theme->withoutDataConnectionLegend();
 
3839
                        withoutDataConnectionLegend = legEntry;
 
3840
                        legendMap_[legId] = &withoutDataConnectionLegend;
 
3841
                }
 
3842
                else if(gId == -1)
 
3843
                {
 
3844
                        TeLegendEntry& outOfCollectionLegend = theme->outOfCollectionLegend();
 
3845
                        outOfCollectionLegend = legEntry;
 
3846
                        legendMap_[legId] = &outOfCollectionLegend;
 
3847
                }
 
3848
                else if (gId > -1)
 
3849
                {
 
3850
                        TeLegendEntryVector& legendEntryVector = theme->legend();
 
3851
                        if (legendEntryVector.empty() == true)
 
3852
                                legendEntryVector.push_back(legMap[legId]);
 
3853
                        else
 
3854
                        {
 
3855
                                if (legId != lastLegId)
 
3856
                                        legendEntryVector.push_back(legMap[legId]);
 
3857
                                else
 
3858
                                {
 
3859
                                        legendEntryVector.pop_back();
 
3860
                                        legendEntryVector.push_back(legMap[legId]);                             
 
3861
                                }
 
3862
                        }
 
3863
                        lastLegId = legId;
 
3864
                }
 
3865
        }
 
3866
 
 
3867
        TeLegendEntryVector& legVector = theme->legend();
 
3868
        for (i = 0; i < legVector.size(); ++i)
 
3869
                legendMap_[legVector[i].id()] = &legVector[i];
 
3870
 
 
3871
        delete portal;
 
3872
        return true;
 
3873
}
 
3874
 
 
3875
 
 
3876
bool 
 
3877
TeDatabase::updateProjection (TeProjection *proj)
 
3878
{
 
3879
        if (proj->id() <= 0)
 
3880
                return false;
 
3881
        string sql;
 
3882
        sql = "UPDATE te_projection SET ";
 
3883
        sql += "name='" + proj->name() + "',";
 
3884
        sql += " long0=" + Te2String(proj->params().lon0*TeCRD,15)+ ",";
 
3885
        sql += " lat0=" + Te2String(proj->params().lat0*TeCRD,15) + ",";
 
3886
        sql += " offx=" +Te2String(proj->params().offx,15) + ",";
 
3887
        sql += " offy=" +Te2String(proj->params().offy,15) + ",";
 
3888
        sql += " stlat1="+ Te2String(proj->params().stlat1*TeCRD,15) + ",";
 
3889
        sql += " stlat2=" +Te2String(proj->params().stlat2*TeCRD,15) + ",";
 
3890
        sql += " unit='" + proj->params().units + "',";
 
3891
        sql += " scale=" + Te2String(proj->params().scale) + ",";
 
3892
        sql += " hemis=" + Te2String(proj->params().hemisphere) + ",";
 
3893
        sql += " datum='" + proj->datum().name() + "',";
 
3894
        sql += " radius=" + Te2String(proj->datum().radius(),15) + ",";
 
3895
        sql += " flattening=" + Te2String(proj->datum().flattening(),15) + ",";
 
3896
        sql += " dx=" + Te2String(proj->datum().xShift(),15) + ",";
 
3897
        sql += " dy=" + Te2String(proj->datum().yShift(),15) + ",";
 
3898
        sql += " dz=" + Te2String(proj->datum().zShift(),15) ;
 
3899
        sql += " WHERE projection_id = " + Te2String(proj->id());
 
3900
        return this->execute(sql);
 
3901
}
 
3902
 
 
3903
TeProjection* 
 
3904
TeDatabase::loadProjection (int projId)
 
3905
{
 
3906
        TeDatabasePortal* portal = this->getPortal();
 
3907
 
 
3908
        string sql ="SELECT * FROM te_projection WHERE projection_id = " + Te2String (projId);
 
3909
 
 
3910
        if (!portal->query(sql))
 
3911
        {
 
3912
                delete portal;
 
3913
                return 0;
 
3914
        }
 
3915
 
 
3916
        // Look for the projection
 
3917
        if (!portal->fetchRow())
 
3918
        {
 
3919
                delete portal;
 
3920
                return 0;
 
3921
        }
 
3922
 
 
3923
        TeDatum datum ( portal->getData("datum"),
 
3924
                                        portal->getDouble("radius"),
 
3925
                                        portal->getDouble("flattening"),
 
3926
                                        portal->getDouble("dx"),
 
3927
                                        portal->getDouble("dy"),
 
3928
                                        portal->getDouble("dz"));
 
3929
 
 
3930
        TeProjectionParams mProjPars;
 
3931
        mProjPars.datum = datum;
 
3932
        mProjPars.name = portal->getData("name");
 
3933
        mProjPars.lat0 = portal->getDouble("lat0")*TeCDR;
 
3934
        mProjPars.lon0 = portal->getDouble("long0")*TeCDR;
 
3935
        mProjPars.offx = portal->getDouble("offx");
 
3936
        mProjPars.offy = portal->getDouble("offy");
 
3937
        mProjPars.stlat1 = portal->getDouble("stlat1")*TeCDR;
 
3938
        mProjPars.stlat2 = portal->getDouble("stlat2")*TeCDR;
 
3939
        mProjPars.units = portal->getData("unit");
 
3940
        mProjPars.scale = portal->getDouble("scale");
 
3941
        mProjPars.hemisphere = (TeHemisphere)portal->getInt("hemis");
 
3942
 
 
3943
        TeProjection* proj = TeProjectionFactory::make(mProjPars);
 
3944
        delete portal;
 
3945
        proj->id(projId);
 
3946
        return proj;
 
3947
}
 
3948
 
 
3949
bool
 
3950
TeDatabase::insertPolygonSet(const string& table, TePolygonSet &ps)
 
3951
{
 
3952
        for (unsigned int i = 0; i < ps.size(); i++ )
 
3953
        {
 
3954
                TePolygon poly = ps [i];
 
3955
                if (!insertPolygon (table,poly))
 
3956
                        return false;
 
3957
        }
 
3958
        return true;
 
3959
}
 
3960
 
 
3961
bool 
 
3962
TeDatabase::updatePolygonSet (const string& table, TePolygonSet &ps)
 
3963
{
 
3964
        for (unsigned int i = 0; i < ps.size(); i++ )
 
3965
        {
 
3966
                TePolygon poly = ps [i];
 
3967
                if (!updatePolygon (table,poly))
 
3968
                        return false;
 
3969
        }
 
3970
        return true;
 
3971
}
 
3972
 
 
3973
bool 
 
3974
TeDatabase::selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps)
 
3975
{
 
3976
        TeDatabasePortal *portal = this->getPortal();
 
3977
        string sql ="SELECT * FROM " + table;
 
3978
        if (!criteria.empty())
 
3979
                sql += " WHERE " + criteria;
 
3980
        sql += " ORDER BY object_id ASC, parent_id, num_holes DESC, ext_max ASC";
 
3981
         
 
3982
        if (!portal->query(sql))
 
3983
        {
 
3984
                delete portal;
 
3985
                return false;
 
3986
        }
 
3987
        if (!portal->fetchRow())
 
3988
        {
 
3989
                delete portal;
 
3990
                return false;
 
3991
        }
 
3992
        bool flag = true;
 
3993
        do
 
3994
        {
 
3995
                TePolygon poly;
 
3996
                flag = portal->fetchGeometry(poly);
 
3997
                ps.add(poly);
 
3998
        }
 
3999
        while (flag);
 
4000
 
 
4001
        delete portal;
 
4002
        return true;
 
4003
}
 
4004
 
 
4005
bool 
 
4006
TeDatabase::loadPointSet(TeTheme* theme, TePointSet &ps)
 
4007
{
 
4008
        string collTable = theme->collectionTable();
 
4009
        if (collTable.empty())
 
4010
                return false;
 
4011
 
 
4012
        TeLayer* themeLayer = theme->layer();
 
4013
        if (!themeLayer->hasGeometry(TePOINTS))
 
4014
                return false;
 
4015
        
 
4016
        string pointTable = themeLayer->tableName(TePOINTS);
 
4017
        if (pointTable.empty())
 
4018
                return false;
 
4019
 
 
4020
        string sql = "SELECT * FROM (" + pointTable + " RIGHT JOIN " + collTable;
 
4021
        sql = sql + " ON " + pointTable + ".object_id = " + collTable + ".object_id)";
 
4022
 
 
4023
        TeDatabasePortal *portal = this->getPortal();
 
4024
        if (!portal)
 
4025
                return false;
 
4026
 
 
4027
        if (!portal->query(sql) || !portal->fetchRow())
 
4028
        {
 
4029
                delete portal;
 
4030
                return false;
 
4031
        }
 
4032
 
 
4033
        bool flag = true;
 
4034
        do {
 
4035
                TePoint pt;
 
4036
                flag =  portal->fetchGeometry(pt);
 
4037
                ps.add(pt);
 
4038
        }
 
4039
        while (flag);
 
4040
        delete portal;
 
4041
        return true;
 
4042
}
 
4043
 
 
4044
bool 
 
4045
TeDatabase::loadLineSet(TeTheme* theme, TeLineSet &ls)
 
4046
{
 
4047
        string collTable = theme->collectionTable();
 
4048
        if (collTable.empty())
 
4049
                return false;
 
4050
 
 
4051
        TeLayer* themeLayer = theme->layer();
 
4052
        if (!themeLayer->hasGeometry(TeLINES))
 
4053
                return false;
 
4054
        
 
4055
        string lineTable = themeLayer->tableName(TeLINES);
 
4056
        if (lineTable.empty())
 
4057
                return false;
 
4058
 
 
4059
        string sql = "SELECT * FROM (" + lineTable + " RIGHT JOIN " + collTable;
 
4060
        sql = sql + " ON " + lineTable + ".object_id = " + collTable + ".object_id)";
 
4061
 
 
4062
        TeDatabasePortal *portal = this->getPortal();
 
4063
        if (!portal)
 
4064
                return false;
 
4065
 
 
4066
        if (!portal->query(sql)  || !portal->fetchRow())
 
4067
        {
 
4068
                delete portal;
 
4069
                return false;
 
4070
        }
 
4071
 
 
4072
        bool flag;
 
4073
        do 
 
4074
        {
 
4075
                TeLine2D lin;
 
4076
                flag = portal->fetchGeometry(lin);
 
4077
                ls.add(lin);
 
4078
        }while(flag);
 
4079
        delete portal;
 
4080
        return true;
 
4081
}
 
4082
 
 
4083
bool 
 
4084
TeDatabase::loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps)
 
4085
{
 
4086
        
 
4087
        TeDatabasePortal *portal = this->getPortal();
 
4088
        string q ="SELECT * FROM " + table;
 
4089
 
 
4090
        if (!geoid.empty())
 
4091
                q += " WHERE object_id = '" + geoid +"'";
 
4092
        q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
 
4093
 
 
4094
        if (!portal->query(q))
 
4095
        {       
 
4096
                delete portal;
 
4097
                return false;
 
4098
        }
 
4099
 
 
4100
        if (!portal->fetchRow())
 
4101
        {
 
4102
                delete portal;
 
4103
                return false;
 
4104
        }
 
4105
        bool flag = true;
 
4106
        do
 
4107
        {
 
4108
                TePolygon poly;
 
4109
                flag = portal->fetchGeometry(poly);
 
4110
                ps.add(poly);
 
4111
        }
 
4112
        while (flag);
 
4113
        delete portal;
 
4114
        return true;
 
4115
}
 
4116
 
 
4117
bool 
 
4118
TeDatabase::loadPolygonSet (const string& table, TeBox &bb, TePolygonSet &polSet)
 
4119
{
 
4120
        TeDatabasePortal *portal = this->getPortal();
 
4121
        if (!portal)
 
4122
                return false;
 
4123
 
 
4124
        string q;
 
4125
        q = "SELECT * FROM " + table + " WHERE ";
 
4126
        q += this->getSQLBoxWhere (bb, TePOLYGONS);
 
4127
        q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
 
4128
 
 
4129
        if (!portal->query(q) || !portal->fetchRow())
 
4130
        {       
 
4131
                delete portal;
 
4132
                return false;
 
4133
        }
 
4134
        bool flag = true;
 
4135
        do
 
4136
        {
 
4137
                TePolygon poly;
 
4138
                flag = portal->fetchGeometry(poly);
 
4139
                polSet.add(poly);
 
4140
        }
 
4141
        while (flag);
 
4142
        delete portal;
 
4143
        return true;
 
4144
}
 
4145
 
 
4146
TeDatabasePortal* 
 
4147
TeDatabase::loadPolygonSet(const string& table, TeBox &box)
 
4148
{
 
4149
        TeDatabasePortal *portal = this->getPortal();
 
4150
        if (!portal)
 
4151
                return 0;
 
4152
 
 
4153
        string q;
 
4154
        q = "SELECT * FROM " + table + " WHERE ";
 
4155
        q += this->getSQLBoxWhere (box, TePOLYGONS);
 
4156
        q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
 
4157
 
 
4158
        if (!portal->query(q) || !portal->fetchRow())
 
4159
        {       
 
4160
                delete portal;
 
4161
                return 0;
 
4162
        }
 
4163
        else 
 
4164
                return portal;
 
4165
}
 
4166
 
 
4167
 
 
4168
bool 
 
4169
TeDatabase::locatePolygon (const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol)
 
4170
{
 
4171
        TeDatabasePortal *portal = this->getPortal();
 
4172
        if (!portal)
 
4173
                return false;
 
4174
 
 
4175
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
4176
 
 
4177
        string q;
 
4178
        q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),15);
 
4179
        q += " AND upper_x > " + Te2String(box.x1(),15);
 
4180
        q += " AND lower_y < " + Te2String(box.y2(),15);
 
4181
        q += " AND upper_y > " + Te2String(box.y1(),15);
 
4182
        q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
 
4183
 
 
4184
        if (!portal->query(q) || !portal->fetchRow())
 
4185
        {       
 
4186
                delete portal;
 
4187
                return false;
 
4188
        }
 
4189
 
 
4190
        bool flag = true;
 
4191
        do
 
4192
        {
 
4193
                TePolygon poly;
 
4194
                flag = portal->fetchGeometry(poly);
 
4195
                if (TeWithin (TePoint(pt), poly))
 
4196
                {
 
4197
                        polygon = poly;
 
4198
                        delete portal;
 
4199
                        return true;
 
4200
                }
 
4201
        }
 
4202
        while (flag);
 
4203
        delete portal;
 
4204
        return false;
 
4205
}
 
4206
 
 
4207
 
 
4208
bool 
 
4209
TeDatabase::locatePolygonSet (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons)
 
4210
{
 
4211
        TeDatabasePortal *portal = this->getPortal();
 
4212
        if (!portal)
 
4213
                return false;
 
4214
 
 
4215
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
4216
 
 
4217
        string q;
 
4218
        q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),6);
 
4219
        q += " AND upper_x > " + Te2String(box.x1(),6);
 
4220
        q += " AND lower_y < " + Te2String(box.y2(),6);
 
4221
        q += " AND upper_y > " + Te2String(box.y1(),6);
 
4222
        q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
 
4223
 
 
4224
        if (!portal->query(q) || !portal->fetchRow())
 
4225
        {       
 
4226
                delete portal;
 
4227
                return false;
 
4228
        }
 
4229
        bool flag = true;
 
4230
        polygons.clear();
 
4231
        do
 
4232
        {
 
4233
                TePolygon poly;
 
4234
                flag = portal->fetchGeometry(poly);
 
4235
                if (TeWithin (TePoint(pt), poly))
 
4236
                        polygons.add(poly);
 
4237
        }
 
4238
        while (flag);
 
4239
        delete portal;
 
4240
 
 
4241
        if(polygons.size())
 
4242
                return (true);
 
4243
        return false;
 
4244
}
 
4245
 
 
4246
 
 
4247
bool 
 
4248
TeDatabase::loadPolygonSet(TeTheme* theme, TePolygonSet &ps)
 
4249
{
 
4250
        string collTable = theme->collectionTable();
 
4251
        if (collTable.empty())
 
4252
                return false;
 
4253
 
 
4254
        TeLayer* themeLayer = theme->layer();
 
4255
        if (!themeLayer->hasGeometry(TePOLYGONS))
 
4256
                return false;
 
4257
        
 
4258
        string polygonTable = themeLayer->tableName(TePOLYGONS);
 
4259
        if (polygonTable.empty())
 
4260
                return false;
 
4261
 
 
4262
        string sql = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
 
4263
        sql = sql + " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
 
4264
        sql += " ORDER BY " + polygonTable + ".parent_id, ";
 
4265
        sql += polygonTable + ".num_holes DESC, " + polygonTable + ".ext_max ASC";
 
4266
 
 
4267
        TeDatabasePortal *portal = this->getPortal();
 
4268
        if (!portal)
 
4269
                return false;
 
4270
 
 
4271
        if (!portal->query(sql) || !portal->fetchRow())
 
4272
        {
 
4273
                delete portal;
 
4274
                return false;
 
4275
        }
 
4276
 
 
4277
        bool flag = true;
 
4278
        do
 
4279
        {
 
4280
                TePolygon poly;
 
4281
                flag = portal->fetchGeometry(poly);
 
4282
                ps.add ( poly );
 
4283
        }
 
4284
        while (flag);           
 
4285
        delete portal;
 
4286
        return true;
 
4287
}
 
4288
 
 
4289
bool 
 
4290
TeDatabase::insertLineSet       (const string& table, TeLineSet &ls)
 
4291
{
 
4292
        for (unsigned int i = 0; i < ls.size(); i++ )
 
4293
        {
 
4294
                TeLine2D line = ls [i];
 
4295
                if (!insertLine (table,line))
 
4296
                        return false;
 
4297
        }
 
4298
        return true;
 
4299
}
 
4300
 
 
4301
bool 
 
4302
TeDatabase::updateLineSet       (const string& table, TeLineSet &ls)
 
4303
{
 
4304
        for (unsigned int i = 0; i < ls.size(); i++ )
 
4305
        {
 
4306
                TeLine2D line = ls [i];
 
4307
                if (!updateLine (table,line))
 
4308
                        return false;
 
4309
        }
 
4310
        return true;
 
4311
}
 
4312
 
 
4313
bool 
 
4314
TeDatabase::loadLineSet (const string& table, const string& geoid, TeLineSet &ls)
 
4315
{
 
4316
        TeDatabasePortal *portal = this->getPortal();
 
4317
 
 
4318
        string q ="SELECT * FROM " + table;
 
4319
 
 
4320
        if (!geoid.empty())
 
4321
                q += " WHERE object_id = '" + geoid +"'";
 
4322
 
 
4323
        q += " ORDER BY ext_max DESC";
 
4324
 
 
4325
        if (!portal->query(q) || !portal->fetchRow())
 
4326
        {       
 
4327
                delete portal;
 
4328
                return false;
 
4329
        }
 
4330
 
 
4331
        bool flag = true;
 
4332
        do 
 
4333
        {
 
4334
                TeLine2D line;
 
4335
                flag = portal->fetchGeometry(line);
 
4336
                ls.add ( line );
 
4337
        }while(flag);
 
4338
 
 
4339
        delete portal;
 
4340
        return true;
 
4341
}
 
4342
 
 
4343
bool 
 
4344
TeDatabase::loadLineSet (const string& table, TeBox &bb, TeLineSet &linSet)
 
4345
{
 
4346
        TeDatabasePortal *portal = this->getPortal();
 
4347
        if (!portal)
 
4348
                return false;
 
4349
 
 
4350
        string q;
 
4351
        q = "SELECT * FROM " + table + " WHERE ";
 
4352
        q += this->getSQLBoxWhere (bb, TeLINES);
 
4353
        q += " ORDER BY ext_max DESC";
 
4354
 
 
4355
        if (!portal->query(q) || !portal->fetchRow())
 
4356
        {       
 
4357
                delete portal;
 
4358
                return false;
 
4359
        }
 
4360
        bool flag = true;
 
4361
        do
 
4362
        {
 
4363
                TeLine2D lin;
 
4364
                flag = portal->fetchGeometry(lin);
 
4365
                linSet.add(lin);
 
4366
        }
 
4367
        while (flag);
 
4368
        delete portal;
 
4369
        return true;
 
4370
}
 
4371
 
 
4372
TeDatabasePortal* 
 
4373
TeDatabase::loadLineSet (const string& table, TeBox &box)
 
4374
{
 
4375
        TeDatabasePortal *portal = this->getPortal();
 
4376
        if (!portal)
 
4377
                return 0;
 
4378
 
 
4379
        string q;
 
4380
        q = "SELECT * FROM " + table + " WHERE ";
 
4381
        q += this->getSQLBoxWhere (box, TeLINES);
 
4382
        q += " ORDER BY ext_max DESC";
 
4383
 
 
4384
        if (!portal->query(q) || !portal->fetchRow())
 
4385
        {       
 
4386
                delete portal;
 
4387
                return 0;
 
4388
        }
 
4389
        return portal;
 
4390
}
 
4391
 
 
4392
bool 
 
4393
TeDatabase::selectLineSet (const string& table, const string& criteria, TeLineSet &ls)
 
4394
{
 
4395
        TeDatabasePortal *portal = this->getPortal();
 
4396
        string q ="SELECT * FROM " + table;
 
4397
        if (!criteria.empty())
 
4398
                q += " WHERE " + criteria;
 
4399
 
 
4400
        if (!portal->query(q) || !portal->fetchRow())
 
4401
        {       
 
4402
                delete portal;
 
4403
                return false;
 
4404
        }
 
4405
 
 
4406
        bool flag = true;
 
4407
        do 
 
4408
        {
 
4409
                TeLine2D line;
 
4410
                flag = portal->fetchGeometry(line);
 
4411
                ls.add ( line );
 
4412
        }while(flag);
 
4413
 
 
4414
        delete portal;
 
4415
        return true;
 
4416
}
 
4417
 
 
4418
bool 
 
4419
TeDatabase::locateLine (const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol)
 
4420
{
 
4421
        TeDatabasePortal* portal = this->getPortal();
 
4422
 
 
4423
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
4424
        string q ="SELECT * FROM " + table;
 
4425
        char buf [1024];
 
4426
        sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
 
4427
                box.x2(),box.x1(),box.y2(),box.y1());
 
4428
        q += buf;
 
4429
        if (!portal->query(q) || !portal->fetchRow())
 
4430
        {
 
4431
                delete portal;
 
4432
                return false;
 
4433
        }
 
4434
 
 
4435
        // Get all lines
 
4436
        TeLineSet ls;
 
4437
        int k;
 
4438
        bool flag = true;
 
4439
        do 
 
4440
        {
 
4441
                TeLine2D l;
 
4442
                flag = portal->fetchGeometry( l );
 
4443
                ls.add ( l );
 
4444
        } while (flag);
 
4445
 
 
4446
        delete portal;
 
4447
 
 
4448
        TeCoord2D paux;
 
4449
 
 
4450
        if (TeNearest (pt, ls, k, paux, tol))
 
4451
        {
 
4452
                line = ls[k];
 
4453
                return true;
 
4454
        }
 
4455
        return false;
 
4456
}
 
4457
 
 
4458
bool 
 
4459
TeDatabase::insertPointSet      (const string& table, TePointSet &ps)
 
4460
{
 
4461
        for (unsigned int i = 0; i < ps.size(); i++ )
 
4462
        {
 
4463
                TePoint point = ps [i];
 
4464
                if (!insertPoint (table,point))
 
4465
                        return false;
 
4466
        }
 
4467
        return true;
 
4468
}
 
4469
 
 
4470
bool 
 
4471
TeDatabase::updatePointSet (const string& table, TePointSet &ps)
 
4472
{
 
4473
        for (unsigned int i = 0; i < ps.size(); i++ )
 
4474
        {
 
4475
                TePoint point = ps [i];
 
4476
                if (!updatePoint (table,point))
 
4477
                        return false;
 
4478
        }
 
4479
        return true;
 
4480
}
 
4481
 
 
4482
bool 
 
4483
TeDatabase::loadPointSet (const string& table, const string& geoid, TePointSet &ps)
 
4484
{
 
4485
        TeDatabasePortal* portal = this->getPortal();
 
4486
        string q ="SELECT * FROM " + table;
 
4487
 
 
4488
        if (!geoid.empty())
 
4489
                q += " WHERE object_id = '" + geoid +"'";
 
4490
 
 
4491
        if (!portal->query(q) || !portal->fetchRow())
 
4492
        {
 
4493
                delete portal;
 
4494
                return false;
 
4495
        }
 
4496
        
 
4497
        bool flag = true;
 
4498
        do 
 
4499
        {
 
4500
                TePoint point;
 
4501
                flag = portal->fetchGeometry (point);
 
4502
                ps.add ( point );
 
4503
        }while (flag);
 
4504
 
 
4505
        delete portal;
 
4506
        return true;
 
4507
}
 
4508
 
 
4509
bool 
 
4510
TeDatabase::loadPointSet (const string& table, TeBox &bb, TePointSet &ps)
 
4511
{
 
4512
        TeDatabasePortal *portal = this->getPortal();
 
4513
        if (!portal)
 
4514
                return false;
 
4515
 
 
4516
        string q;
 
4517
        q = "SELECT * FROM " + table + " WHERE ";
 
4518
        q += this->getSQLBoxWhere (bb, TePOINTS);
 
4519
 
 
4520
        if (!portal->query(q) || !portal->fetchRow())
 
4521
        {       
 
4522
                delete portal;
 
4523
                return false;
 
4524
        }
 
4525
        bool flag = true;
 
4526
        do
 
4527
        {
 
4528
                TePoint pt;
 
4529
                flag = portal->fetchGeometry(pt);
 
4530
                ps.add(pt);
 
4531
        }
 
4532
        while (flag);
 
4533
        delete portal;
 
4534
        return true;
 
4535
}
 
4536
 
 
4537
TeDatabasePortal* 
 
4538
TeDatabase::loadPointSet(const string& table, TeBox &box)
 
4539
{
 
4540
        TeDatabasePortal *portal = this->getPortal();
 
4541
        if (!portal)
 
4542
                return 0;
 
4543
 
 
4544
        string q;
 
4545
        q = "SELECT * FROM " + table + " WHERE ";
 
4546
        q += this->getSQLBoxWhere (box, TePOINTS);
 
4547
 
 
4548
        if (!portal->query(q) || !portal->fetchRow())
 
4549
        {       
 
4550
                delete portal;
 
4551
                return 0;
 
4552
        }
 
4553
        return portal;
 
4554
}
 
4555
 
 
4556
bool 
 
4557
TeDatabase::selectPointSet (const string& table, const string& criteria, TePointSet &ps)
 
4558
{
 
4559
        TeDatabasePortal* portal = this->getPortal();
 
4560
        string q ="SELECT * FROM " + table;
 
4561
        if (!criteria.empty())
 
4562
                q += " WHERE " + criteria;
 
4563
 
 
4564
        if (!portal->query(q) || !portal->fetchRow())
 
4565
        {
 
4566
                delete portal;
 
4567
                return false;
 
4568
        }
 
4569
        
 
4570
        bool flag = true;
 
4571
        do 
 
4572
        {
 
4573
                TePoint point;
 
4574
                flag = portal->fetchGeometry (point);
 
4575
                ps.add ( point );
 
4576
        }while (flag);
 
4577
 
 
4578
        delete portal;
 
4579
        return true;
 
4580
}
 
4581
 
 
4582
bool 
 
4583
TeDatabase::locatePoint (const string& table, TeCoord2D &pt, TePoint &point, const double& tol)
 
4584
{
 
4585
        TeDatabasePortal* portal = this->getPortal();
 
4586
 
 
4587
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
4588
        string q ="SELECT * FROM " + table;
 
4589
        char buf [1024];
 
4590
        sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
 
4591
                box.x2(),box.x1(),box.y2(),box.y1());
 
4592
        q += buf;
 
4593
 
 
4594
        if (!portal->query(q) || !portal->fetchRow())
 
4595
        {
 
4596
                delete portal;
 
4597
                return false;
 
4598
        }
 
4599
        TePointSet ps;
 
4600
        bool flag = true;
 
4601
        do 
 
4602
        {
 
4603
                TePoint point;
 
4604
                flag = portal->fetchGeometry (point);
 
4605
                ps.add ( point );
 
4606
        }while (flag);
 
4607
 
 
4608
        delete portal;
 
4609
        int k;
 
4610
        if (TeNearest (pt, ps, k, tol))
 
4611
        {
 
4612
                point = ps[k];
 
4613
                return true;
 
4614
        }
 
4615
        return false;
 
4616
}
 
4617
 
 
4618
bool 
 
4619
TeDatabase::insertTextSet       (const string& table, TeTextSet &ts)
 
4620
{
 
4621
        for (unsigned int i = 0; i < ts.size(); i++ )
 
4622
        {
 
4623
                TeText text = ts [i];
 
4624
                if (!insertText (table,text))
 
4625
                        return false;
 
4626
        }
 
4627
        return true;
 
4628
}
 
4629
 
 
4630
bool 
 
4631
TeDatabase::updateTextSet       (const string& table, TeTextSet &ts)
 
4632
{
 
4633
        for ( unsigned int i = 0; i < ts.size(); i++ )
 
4634
        {
 
4635
                TeText text = ts [i];
 
4636
                if (!updateText (table,text))
 
4637
                        return false;
 
4638
        }
 
4639
        return true;
 
4640
}
 
4641
 
 
4642
bool 
 
4643
TeDatabase::loadTextSet (const string& table, const string& geoid, TeTextSet &ts)
 
4644
{
 
4645
        TeDatabasePortal *portal = this->getPortal();
 
4646
        
 
4647
        string q ="SELECT * FROM " + table;
 
4648
        if (!geoid.empty())
 
4649
                q += " WHERE object_id = '" + geoid +"'";
 
4650
 
 
4651
        if (!portal->query(q) || !portal->fetchRow())
 
4652
        {
 
4653
                delete portal;
 
4654
                return false;
 
4655
        }
 
4656
        // Look for all texts
 
4657
        bool flag  = true;
 
4658
        do
 
4659
        {
 
4660
                TeText p;
 
4661
                flag = portal->fetchGeometry(p);
 
4662
                ts.add ( p );
 
4663
        } while (flag);
 
4664
 
 
4665
        delete portal;
 
4666
        return true;
 
4667
}
 
4668
 
 
4669
bool 
 
4670
TeDatabase::selectTextSet (const string& table, const string& criteria, TeTextSet &ts)
 
4671
{
 
4672
        TeDatabasePortal* portal = this->getPortal();
 
4673
        string q ="SELECT * FROM " + table;
 
4674
        if (!criteria.empty())
 
4675
                q += " WHERE " + criteria;
 
4676
 
 
4677
        if (!portal->query(q) || !portal->fetchRow())
 
4678
        {
 
4679
                delete portal;
 
4680
                return false;
 
4681
        }
 
4682
        // Look for all texts
 
4683
        bool flag = true;
 
4684
        do
 
4685
        {
 
4686
                TeText p;
 
4687
                flag = portal->fetchGeometry(p);
 
4688
                ts.add ( p );
 
4689
        } while (flag);
 
4690
 
 
4691
        delete portal;
 
4692
        return true;
 
4693
}
 
4694
 
 
4695
bool 
 
4696
TeDatabase::updateText(const string& table, TeText &t)
 
4697
{
 
4698
        string sql;
 
4699
        sql = "UPDATE " + table + " SET ";
 
4700
    sql += "x=" + Te2String(t.location().x(),10) + ", ";
 
4701
        sql += "y=" + Te2String(t.location().y(),10) + ", ";
 
4702
        sql += "text_value='" + t.textValue() + "', ";
 
4703
        sql += "angle=" + Te2String(t.angle(),5) + ", ";
 
4704
        sql += "height=" + Te2String(t.height(),5) + ",";
 
4705
        sql += "alignment_vert=" + Te2String(t.alignmentVert(),5) + ",";
 
4706
        sql += "alignment_horiz=" + Te2String(t.alignmentHoriz(),5);
 
4707
    sql += " WHERE geom_id=" + Te2String(t.geomId());
 
4708
        return (this->execute(sql));
 
4709
}
 
4710
 
 
4711
bool 
 
4712
TeDatabase::updateNode(const string& table, TeNode &node)
 
4713
{
 
4714
        string sql;
 
4715
        sql = "UPDATE " + table + " SET ";
 
4716
    sql += "x=" + Te2String(node.location().x(),10) + ", ";
 
4717
        sql += "y=" + Te2String(node.location().y(),10) + ", ";
 
4718
    sql += " WHERE geom_id = " + Te2String(node.geomId());
 
4719
        return (this->execute(sql));
 
4720
}
 
4721
 
 
4722
bool 
 
4723
TeDatabase::updatePoint(const string& table, TePoint &p)
 
4724
{
 
4725
        string sql;
 
4726
        sql = "UPDATE " + table + " SET ";
 
4727
    sql += "x=" + Te2String(p.location().x(),10) + ", ";
 
4728
        sql += "y=" + Te2String(p.location().y(),10) + ", ";
 
4729
    sql += " WHERE geom_id = " + Te2String(p.geomId());
 
4730
        return (this->execute(sql));
 
4731
}
 
4732
 
 
4733
bool TeDatabase::locateText (const string& table, TeCoord2D &pt, TeText &text, const double& tol)
 
4734
{
 
4735
        TeDatabasePortal* portal = this->getPortal();
 
4736
 
 
4737
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
4738
        string q ="SELECT * FROM " + table;
 
4739
        char buf [1024];
 
4740
        sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
 
4741
                box.x2(),box.x1(),box.y2(),box.y1());
 
4742
        q += buf;
 
4743
        if (!portal->query(q) || !portal->fetchRow())
 
4744
        {
 
4745
                delete portal;
 
4746
                return false;
 
4747
        }
 
4748
        // Look for all texts
 
4749
        bool flag = true;
 
4750
        TeTextSet ts;
 
4751
        do
 
4752
        {
 
4753
                TeText p;
 
4754
                flag = portal->fetchGeometry(p);
 
4755
                ts.add ( p );
 
4756
        } while (flag);
 
4757
 
 
4758
        delete portal;
 
4759
 
 
4760
        int k;
 
4761
        if (TeNearest (pt, ts, k, tol))
 
4762
        {
 
4763
                text = ts[k];
 
4764
                return true;
 
4765
        }
 
4766
        return false;
 
4767
}
 
4768
 
 
4769
bool 
 
4770
TeDatabase::insertArcSet        (const string& table, TeArcSet &as)
 
4771
{
 
4772
        for (unsigned int i = 0; i < as.size(); i++ )
 
4773
        {
 
4774
                TeArc arc = as [i];
 
4775
                if (!insertArc (table,arc))
 
4776
                        return false;
 
4777
        }
 
4778
        return true;
 
4779
}
 
4780
 
 
4781
bool 
 
4782
TeDatabase::updateArcSet        (const string& table, TeArcSet &as)
 
4783
{
 
4784
        for ( unsigned int i = 0; i < as.size(); i++ )
 
4785
        {
 
4786
                TeArc arc = as [i];
 
4787
                if (!updateArc (table,arc))
 
4788
                        return false;
 
4789
        }
 
4790
        return true;
 
4791
}
 
4792
 
 
4793
bool 
 
4794
TeDatabase::loadArcSet (const string& table, const string& geoid, TeArcSet &as)
 
4795
{
 
4796
 
 
4797
        TeDatabasePortal* portal = this->getPortal();
 
4798
        string q ="SELECT * FROM " + table;
 
4799
        if (!geoid.empty())
 
4800
                q += " WHERE object_id = " + geoid;
 
4801
 
 
4802
        if (!portal->query(q) || !portal->fetchRow())
 
4803
        {
 
4804
                delete portal;
 
4805
                return false;
 
4806
        }
 
4807
 
 
4808
        // Look for all nodes
 
4809
        bool flag;
 
4810
        do 
 
4811
        {
 
4812
                TeArc arc;
 
4813
                flag = portal->fetchGeometry(arc);
 
4814
                as.add (arc);
 
4815
        } while (flag);
 
4816
        delete portal;
 
4817
        return true;
 
4818
}
 
4819
 
 
4820
bool 
 
4821
TeDatabase::updateArc   (const string& /*table */, TeArc &arc)
 
4822
{
 
4823
        string sql;
 
4824
        sql = "UPDATE table  SET ";
 
4825
    sql += "from_node=" + Te2String(arc.fromNode().geomId()) + ", ";
 
4826
        sql += "to_node=" + Te2String(arc.toNode().geomId()) + ", ";
 
4827
    sql += " WHERE object_id = " + arc.geomId();
 
4828
        return (this->execute(sql));
 
4829
}
 
4830
 
 
4831
bool 
 
4832
TeDatabase::insertNodeSet       (const string& table, TeNodeSet &ns)
 
4833
{
 
4834
        for (unsigned int i = 0; i < ns.size(); i++ )
 
4835
        {
 
4836
             TeNode no = ns [i];
 
4837
             if (!insertNode (table,no))
 
4838
                return false;
 
4839
        }
 
4840
        return true;
 
4841
}
 
4842
 
 
4843
bool 
 
4844
TeDatabase::updateNodeSet       (const string& table, TeNodeSet &ns)
 
4845
{
 
4846
        for (unsigned int i = 0; i < ns.size(); i++ )
 
4847
        {
 
4848
                TeNode no = ns [i];
 
4849
                if (!updateNode (table,no))
 
4850
                        return false;
 
4851
        }
 
4852
        return true;
 
4853
}
 
4854
 
 
4855
bool 
 
4856
TeDatabase::loadNodeSet (const string& table, const string& geoid, TeNodeSet &ns)
 
4857
{
 
4858
        TeDatabasePortal* portal = this->getPortal();
 
4859
        string q ="SELECT * FROM " + table;
 
4860
        if (!geoid.empty())
 
4861
                q += " WHERE object_id = " + geoid;
 
4862
 
 
4863
        if (!portal->query(q) || !portal->fetchRow())
 
4864
        {
 
4865
                delete portal;
 
4866
                return false;
 
4867
        }
 
4868
 
 
4869
        bool flag = true;
 
4870
        do 
 
4871
        {
 
4872
                TeNode n;
 
4873
                flag = portal->fetchGeometry(n);
 
4874
                ns.add ( n );
 
4875
        }while (flag);
 
4876
 
 
4877
        delete portal;
 
4878
        return true;
 
4879
}
 
4880
 
 
4881
bool 
 
4882
TeDatabase::insertCellSet       (const string& table, TeCellSet &cs)
 
4883
{
 
4884
        for (unsigned int i = 0; i < cs.size(); i++ )
 
4885
        {
 
4886
                TeCell cell = cs [i];
 
4887
                if (!insertCell (table,cell))
 
4888
                        return false;
 
4889
        }
 
4890
        return true;
 
4891
}
 
4892
 
 
4893
bool
 
4894
TeDatabase::updateCellSet       (const string& table, TeCellSet &cs)
 
4895
{
 
4896
        for (unsigned int i = 0; i < cs.size(); i++ )
 
4897
        {
 
4898
                TeCell cell = cs [i];
 
4899
                if (!updateCell (table,cell))
 
4900
                        return false;
 
4901
        }
 
4902
        return true;
 
4903
}
 
4904
 
 
4905
bool 
 
4906
TeDatabase::loadCellSet (const int& layerId, const string& table, const string& geoid, TeCellSet &cs)
 
4907
{
 
4908
 
 
4909
        TeDatabasePortal *portal = this->getPortal();
 
4910
 
 
4911
        // Get the cell set resolution
 
4912
        string q  = "SELECT * FROM te_representation WHERE layer_id = " + Te2String(layerId);
 
4913
        q += " AND geom_type = " + Te2String(TeCELLS);
 
4914
 
 
4915
        if (!portal->query(q) || !portal->fetchRow())
 
4916
        {
 
4917
                delete portal;
 
4918
                return false;
 
4919
        }
 
4920
 
 
4921
        cs.resX(portal->getDouble("res_x"));
 
4922
        cs.resY(portal->getDouble("res_y"));
 
4923
        
 
4924
        portal->freeResult();
 
4925
                
 
4926
        q = "SELECT * FROM " + table;
 
4927
        if (!geoid.empty())
 
4928
                q += " WHERE object_id = '" + geoid +"'";
 
4929
        q += " ";
 
4930
 
 
4931
        if (!portal->query(q) || !portal->fetchRow())
 
4932
        {
 
4933
                delete portal;
 
4934
                return false;
 
4935
        }
 
4936
 
 
4937
        bool flag;
 
4938
        do 
 
4939
        {
 
4940
                TeCell cell;
 
4941
                flag = portal->fetchGeometry(cell);
 
4942
                cs.add ( cell );
 
4943
        } while (flag);
 
4944
 
 
4945
        delete portal;
 
4946
        return true;
 
4947
}
 
4948
 
 
4949
bool 
 
4950
TeDatabase::selectCellSet (const int& layerId, const string& table, const string& criteria, TeCellSet &cs)
 
4951
{
 
4952
        TeDatabasePortal* portal = this->getPortal();
 
4953
        string q = "SELECT * FROM te_representation WHERE layer_id = " ;
 
4954
        q += Te2String(layerId) + " AND geom_type = " + Te2String(TeCELLS);
 
4955
 
 
4956
        if (!portal->query(q) || !portal->fetchRow())
 
4957
        {
 
4958
                delete portal;
 
4959
                return false;
 
4960
        }
 
4961
 
 
4962
        cs.resX(portal->getDouble("res_x"));
 
4963
        cs.resY(portal->getDouble("res_y"));
 
4964
        portal->freeResult();
 
4965
        
 
4966
        q ="SELECT * FROM " + table;
 
4967
        if (!criteria.empty())
 
4968
                q += " WHERE " + criteria;
 
4969
 
 
4970
        if (!portal->query(q) || !portal->fetchRow())
 
4971
        {
 
4972
                delete portal;
 
4973
                return false;
 
4974
        }
 
4975
 
 
4976
        bool flag;
 
4977
        do 
 
4978
        {
 
4979
                TeCell cell;
 
4980
                flag = portal->fetchGeometry(cell);
 
4981
                cs.add ( cell );
 
4982
        } while (flag);
 
4983
 
 
4984
        delete portal;
 
4985
        return true;
 
4986
}
 
4987
 
 
4988
bool 
 
4989
TeDatabase::updateCell(const string& /* table */, TeCell &c)
 
4990
{
 
4991
        TeBox b = c.box();
 
4992
 
 
4993
        string sql;
 
4994
        sql = "UPDATE table  SET ";
 
4995
        sql += "lower_x=" + Te2String(b.lowerLeft().x(),15) + ", ";
 
4996
        sql += "lower_y=" + Te2String(b.lowerLeft().y(),15) + ", ";
 
4997
        sql += "upper_x=" + Te2String(b.upperRight().x(),15) + ", ";
 
4998
        sql += "upper_y=" + Te2String(b.upperRight().y(),15) + ", ";
 
4999
        sql += "col_number=" + Te2String(c.column()) + ", ";
 
5000
        sql += "row_number=" + Te2String(c.line());
 
5001
        sql += " WHERE geom_id = " + c.geomId();
 
5002
        return (this->execute(sql));
 
5003
}
 
5004
 
 
5005
bool 
 
5006
TeDatabase::locateCell (const string& table, TeCoord2D &pt, TeCell &cell, const double& /* tol */)
 
5007
{
 
5008
        TeDatabasePortal* portal = this->getPortal();
 
5009
        string q ="SELECT * FROM " + table;
 
5010
        char buf [1024];
 
5011
        sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
 
5012
                pt.x(),pt.x(),pt.y(),pt.y());
 
5013
        q += buf;
 
5014
        if (!portal->query(q) || !portal->fetchRow())
 
5015
        {
 
5016
                delete portal;
 
5017
                return false;
 
5018
        }
 
5019
        portal->fetchGeometry(cell);
 
5020
        delete portal;
 
5021
        return true;
 
5022
}
 
5023
 
 
5024
bool
 
5025
TeDatabase::inClauseValues(const string& query, const string& /* attribute */, vector<string>& inClauseVector)
 
5026
{
 
5027
        inClauseVector.push_back( "(" + query + ")" );
 
5028
        return true;
 
5029
}
 
5030
 
 
5031
//Spatial query
 
5032
//retornam um portal
 
5033
 
 
5034
bool 
 
5035
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable)
 
5036
{
 
5037
        return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, portal, relate, actCollTable));
 
5038
}
 
5039
 
 
5040
bool 
 
5041
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, int relate, const string& visCollTable)
 
5042
{
 
5043
        return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, portal, relate, visCollTable));
 
5044
}
 
5045
 
 
5046
bool 
 
5047
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable)
 
5048
{
 
5049
        return (TeTopologicalRelation(actGeomTable, actRep, geom, portal, relate, actCollTable));
 
5050
}
 
5051
 
 
5052
//retornam um vetor de object_ids resultantes da consulta
 
5053
bool 
 
5054
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable)
 
5055
{
 
5056
        return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, actIdsOut, this, relate, actCollTable));
 
5057
}
 
5058
 
 
5059
bool 
 
5060
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate, const string& visCollTable)
 
5061
{
 
5062
        return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, visIdsOut, this, relate, visCollTable));
 
5063
}
 
5064
 
 
5065
bool 
 
5066
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable)
 
5067
{
 
5068
        return (TeTopologicalRelation(actGeomTable, actRep, geom, actIdsOut, this, relate, actCollTable));
 
5069
}
 
5070
 
 
5071
//metric functions
 
5072
bool
 
5073
TeDatabase::calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &area)
 
5074
{
 
5075
        return (TeGetArea(actGeomTable, actRep, actIdsIn, this, area));
 
5076
}
 
5077
 
 
5078
bool 
 
5079
TeDatabase::calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn , double& length )
 
5080
{
 
5081
        return (TeGetLength(actGeomTable, actRep, actIdsIn, this, length));
 
5082
}
 
5083
 
 
5084
bool 
 
5085
TeDatabase::calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance)
 
5086
{
 
5087
        return (TeGetDistance(actGeomTable, actRep, Ids, this, distance));
 
5088
}
 
5089
 
 
5090
bool 
 
5091
TeDatabase::calculateDistance(const string& /* actGeomTable */, TeGeomRep /*actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, double& /* distance */)
 
5092
{
 
5093
        return false;
 
5094
}
 
5095
 
 
5096
bool 
 
5097
TeDatabase::withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& coord, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable)
 
5098
{
 
5099
        return (TeGetWithinDistance(actGeomTable, actRep, coord, IdsDistOut, this, max_distance, actCollTable));
 
5100
}
 
5101
 
 
5102
// functions that generate new geometry
 
5103
bool 
 
5104
TeDatabase::Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist)
 
5105
{
 
5106
        return (TeGetBuffer(actGeomTable, actRep, actIds, this, bufferSet, dist));
 
5107
}
 
5108
 
 
5109
bool 
 
5110
TeDatabase::Centroid(const string&  actGeomTable , TeGeomRep actRep, TePointSet& centroidSet, Keys actIds, const string& actCollTable)
 
5111
{
 
5112
        return (TeGetCentroid(actGeomTable, actRep, this, centroidSet, actIds, actCollTable));
 
5113
}
 
5114
 
 
5115
bool 
 
5116
TeDatabase::ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet)
 
5117
{
 
5118
        return (TeGetConvexHull(actGeomTable, actRep, actIds, this, convexHullSet));
 
5119
}
 
5120
 
 
5121
bool 
 
5122
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, Keys& /* actIdsOut */, int /* numRes */)
 
5123
{
 
5124
        return false;
 
5125
}
 
5126
 
 
5127
bool 
 
5128
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, Keys& /* visIdsOut */, int /* numRes */)
 
5129
{
 
5130
        return false;
 
5131
}
 
5132
 
 
5133
bool 
 
5134
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, TeDatabasePortal* /* portal */, int /* numRes */)
 
5135
{
 
5136
        return false;
 
5137
}
 
5138
        
 
5139
bool 
 
5140
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, TeDatabasePortal* /* portal */, int /* numRes */)
 
5141
{
 
5142
        return false;
 
5143
}
 
5144
 
 
5145
bool 
 
5146
TeDatabase::geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
 
5147
{
 
5148
        return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeINTERSECTION));
 
5149
}
 
5150
        
 
5151
bool 
 
5152
TeDatabase::geomIntersection(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
 
5153
{
 
5154
        return false;
 
5155
}
 
5156
 
 
5157
bool 
 
5158
TeDatabase::geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
 
5159
{
 
5160
        Keys actIds;
 
5161
        actIds.push_back(objId1);
 
5162
        actIds.push_back(objId2);
 
5163
 
 
5164
        return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeDIFFERENCE));
 
5165
 
 
5166
}
 
5167
 
 
5168
bool 
 
5169
TeDatabase::geomDifference(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
 
5170
{
 
5171
        return false;
 
5172
}
 
5173
 
 
5174
bool 
 
5175
TeDatabase::geomUnion(const string&  actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
 
5176
{
 
5177
    return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeUNION));
 
5178
}
 
5179
 
 
5180
bool 
 
5181
TeDatabase::geomUnion(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
 
5182
{
 
5183
        return false;
 
5184
}
 
5185
 
 
5186
bool 
 
5187
TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
 
5188
{
 
5189
        return false;
 
5190
}
 
5191
 
 
5192
bool 
 
5193
TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
 
5194
{
 
5195
        return false;
 
5196
}
 
5197
 
 
5198
// Operation with Image
 
5199
 
 
5200
bool 
 
5201
TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, Keys& Ids, TeObjectStatistics& result)
 
5202
{
 
5203
        TeDatabasePortal* portal=getPortal();
 
5204
        if (!portal)
 
5205
                return false;
 
5206
        
 
5207
        //recuperar o raster!!!
 
5208
        string sql = "SELECT layer_id FROM te_representation";
 
5209
        sql += " WHERE geom_table = '" + rasterTable +"'";
 
5210
        if(!portal->query(sql) || !portal->fetchRow())
 
5211
        {
 
5212
                delete portal;
 
5213
                return false;
 
5214
        }
 
5215
 
 
5216
        int layerId = atoi(portal->getData(0));
 
5217
        TeRaster* raster = loadLayerRaster(layerId);
 
5218
 
 
5219
        //recuperar as geometrias
 
5220
        portal->freeResult();
 
5221
        
 
5222
        string objIds = getStringIds(Ids);
 
5223
        sql = "SELECT * FROM "+ actGeomTable;
 
5224
        sql+= " WHERE object_id IN ("+ objIds +")";
 
5225
 
 
5226
        if(!portal->query(sql) || !portal->fetchRow())
 
5227
        {
 
5228
                delete portal;
 
5229
                return false;
 
5230
        }
 
5231
        
 
5232
        bool flag = true;
 
5233
        do
 
5234
        {
 
5235
                TePolygon poly;
 
5236
                flag = portal->fetchGeometry(poly);
 
5237
 
 
5238
                TeStatisticsDimensionVect st;
 
5239
 
 
5240
                TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
 
5241
                TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
 
5242
        
 
5243
                if(!TeCalculateStatistics (itBegin, itEnd, st))
 
5244
                {
 
5245
                        delete portal;
 
5246
                        return false;
 
5247
                }
 
5248
        
 
5249
                result[poly.objectId()] = st;
 
5250
 
 
5251
        }while (flag);
 
5252
 
 
5253
        
 
5254
        delete raster;
 
5255
        delete portal;
 
5256
        return true;
 
5257
}
 
5258
        
 
5259
bool 
 
5260
TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, const string& actCollTable, TeObjectStatistics& result)
 
5261
{
 
5262
        TeDatabasePortal* portal=getPortal();
 
5263
        if (!portal)
 
5264
                return false;
 
5265
        
 
5266
        //recuperar o raster
 
5267
        string sql = "SELECT layer_id FROM te_representation";
 
5268
        sql += " WHERE geom_table = '" + rasterTable +"'";
 
5269
        if(!portal->query(sql) || !portal->fetchRow())
 
5270
        {
 
5271
                delete portal;
 
5272
                return false;
 
5273
        }
 
5274
 
 
5275
        int layerId = atoi(portal->getData(0));
 
5276
        TeRaster* raster = loadLayerRaster(layerId);
 
5277
 
 
5278
        //recuperar as geometrias
 
5279
        portal->freeResult();
 
5280
        
 
5281
        sql = "SELECT * FROM "+ actGeomTable;
 
5282
 
 
5283
        if(!actCollTable.empty())
 
5284
        {
 
5285
                sql += " ,"+ actCollTable;
 
5286
                sql += " WHERE object_id = c_object_id ";
 
5287
        }
 
5288
        
 
5289
        if(!portal->query(sql) || !portal->fetchRow())
 
5290
        {
 
5291
                delete portal;
 
5292
                return false;
 
5293
        }
 
5294
        
 
5295
        bool flag = true;
 
5296
        do
 
5297
        {
 
5298
                TePolygon poly;
 
5299
                flag = portal->fetchGeometry(poly);
 
5300
 
 
5301
                TeStatisticsDimensionVect st;
 
5302
                
 
5303
                TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
 
5304
                TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
 
5305
        
 
5306
                if(!TeCalculateStatistics (itBegin, itEnd, st))
 
5307
                {
 
5308
                        delete portal;
 
5309
                        return false;
 
5310
                }
 
5311
                result[poly.objectId()] = st;
 
5312
 
 
5313
        }while (flag);
 
5314
 
 
5315
        
 
5316
        delete raster;
 
5317
        delete portal;
 
5318
        return true;
 
5319
}
 
5320
 
 
5321
bool 
 
5322
TeDatabase::Zonal(const string& rasterTable, TePolygon& poly, TeStatisticsDimensionVect& result)
 
5323
{
 
5324
        TeDatabasePortal* portal=getPortal();
 
5325
        if (!portal)
 
5326
                return false;
 
5327
        
 
5328
        //recuperar o raster!!!
 
5329
        string sql = "SELECT layer_id FROM te_representation";
 
5330
        sql += " WHERE geom_table = '" + rasterTable +"'";
 
5331
        if(!portal->query(sql) || !portal->fetchRow())
 
5332
        {
 
5333
                delete portal;
 
5334
                return false;
 
5335
        }
 
5336
 
 
5337
        int layerId = atoi(portal->getData(0));
 
5338
        TeRaster* raster = loadLayerRaster(layerId);
 
5339
 
 
5340
        delete portal;
 
5341
 
 
5342
        TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
 
5343
        TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
 
5344
        
 
5345
        if(!TeCalculateStatistics (itBegin, itEnd, result))
 
5346
                return false;
 
5347
 
 
5348
        delete raster;
 
5349
        return true;
 
5350
}
 
5351
 
 
5352
 
 
5353
bool 
 
5354
TeDatabase::Mask(const string& rasterTable, const string& actGeomTable, const string& objId, const string& nameLayerOut, TeStrategicIterator st)
 
5355
{
 
5356
        TeDatabasePortal* portal=getPortal();
 
5357
        if (!portal)
 
5358
                return false;
 
5359
        
 
5360
        //recuperar o raster!!!
 
5361
        string sql = "SELECT layer_id FROM te_representation";
 
5362
        sql += " WHERE geom_table = '" + rasterTable +"'";
 
5363
        if(!portal->query(sql) || !portal->fetchRow())
 
5364
        {
 
5365
                delete portal;
 
5366
                return false;
 
5367
        }
 
5368
 
 
5369
        int layerId = atoi(portal->getData(0));
 
5370
        TeRaster* raster = loadLayerRaster(layerId);
 
5371
 
 
5372
        //recuperar a geometria
 
5373
        portal->freeResult();
 
5374
        
 
5375
        sql = "SELECT * FROM "+ actGeomTable;
 
5376
        sql+= " WHERE object_id = '" + objId + "'"; 
 
5377
        
 
5378
        if(!portal->query(sql) || !portal->fetchRow())
 
5379
        {
 
5380
                delete portal;
 
5381
                return false;
 
5382
        }
 
5383
        
 
5384
        TePolygon poly;
 
5385
        portal->fetchGeometry(poly);
 
5386
 
 
5387
        TeRaster* rasterOut = TeMask (raster, poly, st);
 
5388
        TeRasterParams param = rasterOut->params();     
 
5389
 
 
5390
        TeBox b = param.boundingBox();
 
5391
        TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
 
5392
        bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
 
5393
 
 
5394
        delete raster;
 
5395
        delete rasterOut;
 
5396
        delete portal;
 
5397
        return status;
 
5398
}
 
5399
 
 
5400
 
 
5401
 
 
5402
bool
 
5403
TeDatabase::Mask(const string& rasterTable, TePolygon& poly, const string& nameLayerOut, TeStrategicIterator st)
 
5404
{
 
5405
        TeDatabasePortal* portal=getPortal();
 
5406
        if (!portal)
 
5407
                return false;
 
5408
        
 
5409
        //recuperar o raster!!!
 
5410
        string sql = "SELECT layer_id FROM te_representation";
 
5411
        sql += " WHERE geom_table = '" + rasterTable +"'";
 
5412
        if(!portal->query(sql) || !portal->fetchRow())
 
5413
        {
 
5414
                delete portal;
 
5415
                return false;
 
5416
        }
 
5417
 
 
5418
        int layerId = atoi(portal->getData(0));
 
5419
        TeRaster* raster = loadLayerRaster(layerId);
 
5420
 
 
5421
        delete portal;
 
5422
 
 
5423
        TeRaster* rasterOut = TeMask (raster, poly, st);
 
5424
        TeRasterParams param = rasterOut->params();     
 
5425
 
 
5426
        TeBox b = param.boundingBox();
 
5427
        TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
 
5428
        bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
 
5429
        
 
5430
        delete raster;
 
5431
        delete rasterOut;
 
5432
        return status;
 
5433
}
 
5434
 
 
5435
 
 
5436
string
 
5437
TeDatabase::getSQLBoxWhere (TeBox &box, TeGeomRep rep)
 
5438
{
 
5439
        string wherebox;
 
5440
        string lowerX, lowerY, upperX, upperY;
 
5441
        if(rep == TePOLYGONS || rep == TeLINES || rep == TeCELLS || rep == TeRASTER)
 
5442
        {
 
5443
                lowerX = "lower_x";
 
5444
                lowerY = "lower_y";
 
5445
                upperX = "upper_x";
 
5446
                upperY = "upper_y";
 
5447
        }
 
5448
        else if(rep == TePOINTS || rep == TeTEXT)
 
5449
        {
 
5450
                lowerX = "x";
 
5451
                lowerY = "y";
 
5452
                upperX = "x";
 
5453
                upperY = "y";
 
5454
        }
 
5455
 
 
5456
        wherebox = "NOT("+ lowerX +" >= " + Te2String(box.x2_, 12) + " OR ";
 
5457
        wherebox += upperX +" <= " + Te2String(box.x1_, 12) + " OR ";
 
5458
        wherebox += lowerY +" >= " + Te2String(box.y2_, 12) + " OR ";
 
5459
        wherebox += upperY +" <= " + Te2String(box.y1_, 12) + ")";
 
5460
                
 
5461
        return wherebox;
 
5462
}
 
5463
 
 
5464
 
 
5465
string 
 
5466
TeDatabase::getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep /* rep1 */)
 
5467
{
 
5468
        string wherebox;
 
5469
 
 
5470
        if(rep2 == TePOLYGONS || rep2 == TeLINES || rep2 == TeCELLS || rep2 == TeRASTER)
 
5471
        {
 
5472
                wherebox = " NOT( ";
 
5473
                wherebox += table2 +".lower_x > "+ table1 +".upper_x  OR ";
 
5474
                wherebox += table2 +".upper_x < "+ table1 +".lower_x  OR ";
 
5475
                wherebox += table2 +".lower_y > "+ table1 +".upper_y  OR ";
 
5476
                wherebox += table2 +".upper_y < "+ table1 +".lower_y )";
 
5477
        }
 
5478
        else if(rep2 == TePOINTS || rep2 == TeTEXT)
 
5479
        {
 
5480
                wherebox = " NOT( ";
 
5481
                wherebox += table2 +".x > "+ table1 +".upper_x  OR ";
 
5482
                wherebox += table2 +".x < "+ table1 +".lower_x  OR ";
 
5483
                wherebox += table2 +".y > "+ table1 +".upper_y  OR ";
 
5484
                wherebox += table2 +".y < "+ table1 +".lower_y )";
 
5485
        }
 
5486
        
 
5487
        return wherebox;
 
5488
}
 
5489
 
 
5490
 
 
5491
string 
 
5492
TeDatabase::getSQLBoxSelect (const string& tableName, TeGeomRep /* rep */)
 
5493
{
 
5494
        string sql = tableName +".* ";
 
5495
        return sql;
 
5496
}
 
5497
 
 
5498
 
 
5499
string
 
5500
TeDatabase::getSQLStatistics (TeGroupingAttr& attrs)
 
5501
{
 
5502
        string sql = "";
 
5503
        string virg = "";
 
5504
 
 
5505
        TeGroupingAttr::iterator it = attrs.begin();
 
5506
        int count = 0;
 
5507
        while(it != attrs.end())
 
5508
        {
 
5509
                if(count>0)
 
5510
                        virg = ",";
 
5511
 
 
5512
                switch ((*it).second)
 
5513
                {
 
5514
                        case TeSUM:
 
5515
                                sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ Te2String(count);
 
5516
                                (*it).second = TeNOSTATISTIC;
 
5517
                                ++count;
 
5518
                                break;
 
5519
                        case TeMAXVALUE:
 
5520
                                sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ Te2String(count);
 
5521
                                (*it).second = TeNOSTATISTIC; 
 
5522
                                ++count;
 
5523
                                break;
 
5524
                        case TeMINVALUE:
 
5525
                                sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ Te2String(count);
 
5526
                                (*it).second = TeNOSTATISTIC;
 
5527
                                ++count;
 
5528
                                break;
 
5529
                        case TeCOUNT:
 
5530
                                sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ Te2String(count);
 
5531
                                (*it).second = TeNOSTATISTIC;
 
5532
                                ++count;
 
5533
                                break;
 
5534
                        case TeMEAN:
 
5535
                                sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ Te2String(count);
 
5536
                                (*it).second = TeNOSTATISTIC;
 
5537
                                ++count;
 
5538
                                break;
 
5539
                        default:
 
5540
                                break;
 
5541
                }
 
5542
                ++it;
 
5543
        }
 
5544
        return sql;
 
5545
}
 
5546
 
 
5547
string 
 
5548
TeDatabase::getSQLAutoNumber(const string& /* table */)
 
5549
{
 
5550
        return "";
 
5551
}
 
5552
 
 
5553
string 
 
5554
TeDatabase::getSQLTemporalWhere (TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime)
 
5555
{
 
5556
        string sql;
 
5557
        string t1 = getSQLTime(timeInterval.getT1()); 
 
5558
        string t2 = getSQLTime(timeInterval.getT2());
 
5559
        
 
5560
        switch(timeOperator)
 
5561
        {
 
5562
                case TeTIMEBEFORE:  
 
5563
                        sql = finalTime +" < "+ t1;
 
5564
                        break;
 
5565
                case TeTIMEAFTER:  
 
5566
                        sql = initialTime +" > "+ t2;
 
5567
                        break;
 
5568
                case TeTIMEEQUAL:             
 
5569
                        sql = "( "+ initialTime +" >= "+ t1;
 
5570
                        sql += " AND "+ initialTime +" <= "+ t2 +" )";
 
5571
                        if (initialTime != finalTime)
 
5572
                        {
 
5573
                                sql += " AND ";
 
5574
                                sql += "( "+ finalTime +" >= "+ t1;
 
5575
                                sql += " AND "+ finalTime +" <= "+ t2 +" )";
 
5576
                        }
 
5577
                        break;
 
5578
 
 
5579
                case TeTIMEMEETS:             
 
5580
                        sql = finalTime +" = "+ t1;
 
5581
                        sql += " OR "+ initialTime +" = "+ t2;
 
5582
                        break;
 
5583
 
 
5584
                case TeTIMEDURING: 
 
5585
                        sql = initialTime +" >= "+ t1;
 
5586
                        sql += " AND "+ initialTime +" <= "+ t2;
 
5587
                        if (initialTime != finalTime)
 
5588
                        {
 
5589
                                sql += " AND "+ finalTime +" >= "+ t1;
 
5590
                                sql += " AND "+ finalTime +" <= "+ t2;
 
5591
                        }
 
5592
                        break;
 
5593
 
 
5594
                case TeTIMEOVERLAPS:             
 
5595
                        sql = "( "+ initialTime +" < "+ t1;
 
5596
                        sql += " AND "+ finalTime +" > "+ t1;
 
5597
                        sql += " AND "+ finalTime +" < "+ t2 +" )";
 
5598
                        sql += " OR ";
 
5599
                        sql += "( "+ initialTime +" > "+ t1;
 
5600
                        sql += " AND "+ initialTime +" < "+ t2;
 
5601
                        sql += " AND "+ finalTime +" > "+ t2 +" )";
 
5602
                        break;
 
5603
 
 
5604
                case TeTIMEENDS:
 
5605
                        sql = finalTime +" = "+ t2;
 
5606
                        break;
 
5607
 
 
5608
                case TeTIMESTARTS:
 
5609
                        sql = initialTime +" = "+ t1;
 
5610
                        break;
 
5611
 
 
5612
        default:
 
5613
            break;
 
5614
        }
 
5615
 
 
5616
        return sql; 
 
5617
}
 
5618
 
 
5619
string
 
5620
TeDatabase::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, 
 
5621
                                                   const string& initialTime, const string& finalTime)
 
5622
{
 
5623
        //rever os chronons definidos - alterar o parser para restriļæ½ļæ½o temporal
 
5624
        string func, sql;
 
5625
        switch(chr)
 
5626
        {
 
5627
                case TeSECONDOFMINUTE:  
 
5628
                   func = " second"; 
 
5629
                break;
 
5630
                
 
5631
                case TeMINUTEOFHOUR:  
 
5632
                   func = " minute";
 
5633
                break;
 
5634
                
 
5635
                case TeHOUROFDAY:             
 
5636
                        func = " hour";
 
5637
                break;
 
5638
                
 
5639
                case TeDAYOFMONTH:             
 
5640
                        func = " day";
 
5641
                break;
 
5642
 
 
5643
                case TeDAYOFWEEK:
 
5644
                        func = " weekday";
 
5645
                break;
 
5646
                
 
5647
                case TeMONTHOFYEAR:
 
5648
                   func = " month";
 
5649
                break;
 
5650
 
 
5651
                case TeYEAR:             
 
5652
                   func = " year";
 
5653
                break;
 
5654
 
 
5655
                default:
 
5656
                        return "";
 
5657
        }
 
5658
 
 
5659
        switch(rel)
 
5660
        {
 
5661
                case TeTIMEBEFORE:  
 
5662
                        sql = func +"("+ finalTime +") < "+ Te2String(time1);
 
5663
                break;
 
5664
                
 
5665
                case TeTIMEAFTER:  
 
5666
                        sql = func +"("+ initialTime +") > "+ Te2String(time2);
 
5667
                break;
 
5668
                
 
5669
                case TeTIMEEQUAL:  
 
5670
                        sql = func +"("+ initialTime +") = "+ Te2String(time1);
 
5671
                        sql += " AND "+ func +"(" + finalTime +") = "+ Te2String(time2);
 
5672
                break;
 
5673
 
 
5674
                case TeTIMEMEETS:     
 
5675
                        sql = func +"("+ finalTime +") = "+ Te2String(time1);
 
5676
                        sql += " OR "+ func +"(" + initialTime +") = "+ Te2String(time2);
 
5677
                break;
 
5678
 
 
5679
                case TeTIMEDURING: 
 
5680
                        sql = func +"("+ initialTime +") >= "+ Te2String(time1);
 
5681
                        sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
 
5682
                        sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
 
5683
                        sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2);
 
5684
                break;
 
5685
 
 
5686
                case TeTIMEOVERLAPS:         
 
5687
                        sql =  "("+ func +"("+ initialTime +") <= "+ Te2String(time1);
 
5688
                        sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
 
5689
                        sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2) +")";
 
5690
                        sql += " OR ";
 
5691
                        sql += "("+ func +"("+ initialTime +") >= "+ Te2String(time1);
 
5692
                        sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
 
5693
                        sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time2) +")";
 
5694
                break;
 
5695
 
 
5696
                case TeTIMEENDS:
 
5697
                        sql = func +"("+ finalTime +") = "+ Te2String(time2);
 
5698
                break;
 
5699
 
 
5700
                case TeTIMESTARTS:
 
5701
                        sql = func +"("+ initialTime +") = "+ Te2String(time1);
 
5702
 
 
5703
                default:
 
5704
                        break;
 
5705
        }
 
5706
        
 
5707
        return sql;
 
5708
}
 
5709
 
 
5710
string 
 
5711
TeDatabase::getSQLTemporalWhere (const string& temporalRest)
 
5712
{
 
5713
        string result, tableName, initialCol, finalCol, time1, time2, mask; 
 
5714
        TeTemporalRelation rel;
 
5715
        TeChronon chronon; 
 
5716
        
 
5717
        string temp = temporalRest;
 
5718
        bool flag = true;
 
5719
        int cont = 0;
 
5720
                
 
5721
        while(flag)
 
5722
        {
 
5723
                string element;
 
5724
                int pos = temp.find (";");
 
5725
                if(pos<0)
 
5726
                {
 
5727
                        flag = false;
 
5728
                        element = temp;
 
5729
                }
 
5730
                else
 
5731
                {
 
5732
                        element = temp.substr(0, pos);
 
5733
                        temp = temp.substr (pos+1);
 
5734
                }
 
5735
 
 
5736
                if(cont==0) //table name
 
5737
                        tableName = element;
 
5738
                else if(cont==1) //column name (initial time) 
 
5739
                        initialCol = element; 
 
5740
                else if(cont==2) //column name (final time)
 
5741
                        finalCol = element;
 
5742
                else if(cont==3) //TeTemporalRelation 
 
5743
                {
 
5744
                        if(element=="TeTIMEEQUAL")
 
5745
                                rel = TeTIMEEQUAL;
 
5746
                        else if (element=="TeTIMEBEFORE")
 
5747
                                rel = TeTIMEBEFORE;
 
5748
                        else if (element=="TeTIMEAFTER")
 
5749
                                rel = TeTIMEAFTER;
 
5750
                        else if (element=="TeTIMEMEETS")
 
5751
                                rel = TeTIMEMEETS;
 
5752
                        else if (element=="TeTIMEDURING")
 
5753
                                rel = TeTIMEDURING;
 
5754
                        else if (element=="TeTIMEOVERLAPS")
 
5755
                                rel = TeTIMEOVERLAPS;
 
5756
                        else if (element=="TeTIMEENDS")
 
5757
                                rel = TeTIMEENDS;
 
5758
                        else if (element=="TeTIMESTARTS")
 
5759
                                rel = TeTIMESTARTS;
 
5760
                }
 
5761
                else if(cont==4) //time 1
 
5762
                        time1 = element;
 
5763
                else if(cont==5) //time 2
 
5764
                {
 
5765
                        if(element.empty())
 
5766
                                time1 = time2;
 
5767
                        else
 
5768
                                time2 = element;
 
5769
                }
 
5770
                else if(cont==6)
 
5771
                        mask = element;
 
5772
                else if(cont==7) //TeChronon  
 
5773
                {
 
5774
                        if (element=="TeSECOND")
 
5775
                                chronon = TeSECOND;
 
5776
                        else if (element=="TeMINUTE")
 
5777
                                chronon = TeMINUTE;
 
5778
                        else if (element=="TeHOUR")
 
5779
                                chronon = TeHOUR;
 
5780
                        else if (element=="TeDAY")
 
5781
                                chronon = TeDAY;
 
5782
                        else if (element=="TeMONTH")
 
5783
                                chronon = TeMONTH;
 
5784
                        else if (element=="TeYEAR")
 
5785
                                chronon = TeYEAR;
 
5786
                        else if (element=="TeDAYOFWEEK")
 
5787
                                chronon = TeDAYOFWEEK;
 
5788
                        else if (element=="TeMONTHOFYEAR")
 
5789
                                chronon = TeMONTHOFYEAR;
 
5790
                        else if (element=="TeSEASON")
 
5791
                                chronon = TeSEASON;
 
5792
                        else if (element=="TeWEEKOFYEAR")
 
5793
                                chronon = TeWEEKOFYEAR;
 
5794
                }
 
5795
 
 
5796
                ++cont;
 
5797
        }
 
5798
 
 
5799
        int posMask = mask.find ("s");
 
5800
        if(posMask<0) 
 
5801
        {
 
5802
                result = " "+ getSQLTemporalWhere(atoi(time1.c_str()), atoi(time2.c_str()), chronon, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) +" ";
 
5803
        }
 
5804
        else
 
5805
        {
 
5806
                TeTimeInterval interval(time1, time2, chronon, mask);
 
5807
                result = " "+ getSQLTemporalWhere(interval, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) + " "; 
 
5808
        }
 
5809
 
 
5810
        return result;
 
5811
}
 
5812
 
 
5813
 
 
5814
string 
 
5815
TeDatabase::getSQLTemporalFunction (TeChronon chr, const string& colName)
 
5816
{
 
5817
        string func;
 
5818
        switch(chr)
 
5819
        {
 
5820
                case TeYEAR:             
 
5821
                        func = " year ("+ colName +")";
 
5822
                break;
 
5823
 
 
5824
                case TeMONTH:                   // Fev/2003 != Fev/2004
 
5825
                        func = " year ("+ colName +"), month ("+ colName +") ";
 
5826
                break;
 
5827
 
 
5828
                case TeMONTHOFYEAR:             // Fev/2003 == Fev/2004
 
5829
                        func = " month ("+ colName +")";
 
5830
                break;
 
5831
 
 
5832
                case TeDAY:                             // 01/01/2003 != 01/01/2004 != 01/02/2004             
 
5833
                        func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +") ";
 
5834
                break;
 
5835
 
 
5836
                case TeDAYOFMONTH:              // 01/01/2003 == 01/01/2004 == 01/02/2004             
 
5837
                        func = " day("+ colName +") ";
 
5838
                break;
 
5839
 
 
5840
                case TeDAYOFYEAR:               // 01/01/2003 == 01/01/2004 != 01/02/2004             
 
5841
                        func = " month ("+ colName +"), day("+ colName +") ";
 
5842
                break;
 
5843
 
 
5844
                case TeDAYOFWEEK:               // 01/01/2003 != 01/01/2004 != 01/02/2004             
 
5845
                        func = " weekday ("+ colName +") ";
 
5846
                break;
 
5847
 
 
5848
                case TeHOUR:                    // 01/01/2003 10:00 != 01/01/2004 10:00 != 01/02/2004 10:00             
 
5849
                        func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +") ";
 
5850
                break;
 
5851
 
 
5852
                case TeHOUROFDAY:       // 01/01/2003 10:00 == 01/01/2004 10:00 == 01/02/2004 10:00    
 
5853
                        func = " hour ("+ colName +")";
 
5854
                break;
 
5855
 
 
5856
                case TeMINUTE:                  // 01/01/2003 10:30 != 01/01/2004 10:30 != 01/02/2004 10:30 
 
5857
                   func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +") ";
 
5858
                break;
 
5859
 
 
5860
                case TeMINUTEOFHOUR:   // 01/01/2003 10:30 == 01/01/2004 10:30 == 01/02/2004 10:30 != 01/02/2004 10:31
 
5861
                        func = " minute("+ colName +") ";
 
5862
                break;
 
5863
 
 
5864
                case TeSECOND:  // 01/01/2003 10:30:04 != 01/01/2004 10:30:04 != 01/02/2004 10:30:04 
 
5865
                   func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +"), second("+ colName +") ";
 
5866
                break;
 
5867
 
 
5868
                case TeSECONDOFMINUTE:  // 01/01/2003 10:30:04 == 01/01/2004 10:30:04 == 01/02/2004 10:30:04 != 01/02/2004 10:30:07
 
5869
                   func = " second("+ colName +") "; 
 
5870
                break;
 
5871
                
 
5872
                default:
 
5873
                        return "";
 
5874
        }
 
5875
        
 
5876
        return func;
 
5877
}
 
5878
 
 
5879
 
 
5880
bool
 
5881
TeDatabase::getMBRGeom(string tableGeom, string object_id, TeBox& box, string /* colGeom */)
 
5882
{
 
5883
        double xmin = TeMAXFLOAT;
 
5884
        double xmax = -TeMAXFLOAT;
 
5885
        double ymin = TeMAXFLOAT;
 
5886
        double ymax = -TeMAXFLOAT;
 
5887
                        
 
5888
        TeDatabasePortal* portal = getPortal();
 
5889
        if(!portal)
 
5890
                return false;
 
5891
 
 
5892
        string sel = "SELECT lower_x, upper_x, lower_y, upper_y FROM " + tableGeom;
 
5893
        sel += " WHERE object_id = '" + object_id + "'";
 
5894
 
 
5895
        if(!portal->query(sel))
 
5896
        {
 
5897
                delete portal;
 
5898
                return false;
 
5899
        }
 
5900
                
 
5901
        bool b = portal->fetchRow();
 
5902
        if(!b)
 
5903
        {
 
5904
                delete portal;
 
5905
                return false;
 
5906
        }
 
5907
        
 
5908
        while(b)
 
5909
        {
 
5910
                xmin = MIN(xmin, portal->getDouble(0));
 
5911
                xmax = MAX(xmax, portal->getDouble(1));
 
5912
                ymin = MIN(ymin, portal->getDouble(2));
 
5913
                ymax = MAX(ymax, portal->getDouble(3));
 
5914
                b = portal->fetchRow(); 
 
5915
        }
 
5916
                        
 
5917
        TeBox bb(xmin, ymin, xmax, ymax);
 
5918
        box = bb;
 
5919
        delete portal;
 
5920
        return true;
 
5921
}
 
5922
 
 
5923
bool 
 
5924
TeDatabase::getMBRSelectedObjects(string /* geomTable */,string /* colGeom */, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol)
 
5925
{
 
5926
        string  fields;
 
5927
        string  query;
 
5928
        bool    status = false;
 
5929
 
 
5930
        TeBox   box;
 
5931
        bout = box;
 
5932
 
 
5933
        TeDatabasePortal* portal = this->getPortal();
 
5934
 
 
5935
        switch(repType)
 
5936
        {
 
5937
                case TePOLYGONS:
 
5938
                case TeLINES:
 
5939
 
 
5940
                        fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
 
5941
                        query =  " SELECT " + fields;
 
5942
                        query += " FROM " + fromClause; 
 
5943
                        if (!whereClause.empty())
 
5944
                                query += " WHERE " + whereClause;
 
5945
                        if (!afterWhereClause.empty())
 
5946
                                query += afterWhereClause;
 
5947
 
 
5948
                        if (portal->query (query))
 
5949
                        {
 
5950
                                bool b = portal->fetchRow();
 
5951
                                while(b)
 
5952
                                {
 
5953
                                        string vxmin = portal->getData(0);
 
5954
                                        string vymin = portal->getData(1);
 
5955
                                        string vxmax = portal->getData(2);
 
5956
                                        string vymax = portal->getData(3);
 
5957
                                        if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
 
5958
                                        {
 
5959
                                                b = portal->fetchRow();
 
5960
                                                continue;
 
5961
                                        }
 
5962
                                        double xmin = atof(vxmin.c_str());
 
5963
                                        double ymin = atof(vymin.c_str());
 
5964
                                        double xmax = atof(vxmax.c_str());
 
5965
                                        double ymax = atof(vymax.c_str());
 
5966
                                        TeBox   ibox(xmin, ymin, xmax, ymax);
 
5967
                                        updateBox (bout, ibox);
 
5968
                                        b = portal->fetchRow();
 
5969
                                        status = true;
 
5970
                                }
 
5971
                        }
 
5972
                        break;
 
5973
 
 
5974
                case TePOINTS:
 
5975
 
 
5976
                        fields = "MIN(x), MIN(y), MAX(x), MAX(y)";
 
5977
                        query =  " SELECT " + fields;
 
5978
                        query += " FROM " + fromClause; 
 
5979
                        if (!whereClause.empty())
 
5980
                                query += " WHERE " + whereClause;
 
5981
                        if (!afterWhereClause.empty())
 
5982
                                query += afterWhereClause;
 
5983
                        
 
5984
                        if (portal->query (query))
 
5985
                        {
 
5986
                                bool b = portal->fetchRow();
 
5987
                                while(b)
 
5988
                                {
 
5989
          string vxmin = portal->getData(0);
 
5990
          string vymin = portal->getData(1);
 
5991
          string vxmax = portal->getData(2);
 
5992
          string vymax = portal->getData(3);
 
5993
          if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
 
5994
          {
 
5995
            b = portal->fetchRow();
 
5996
            continue;
 
5997
          }
 
5998
          double xmin = atof(vxmin.c_str());
 
5999
          double ymin = atof(vymin.c_str());
 
6000
          double xmax = atof(vxmax.c_str());
 
6001
          double ymax = atof(vymax.c_str());
 
6002
          
 
6003
          TeBox ibox;
 
6004
          if (xmin == xmax) {
 
6005
            ibox.x1_ = xmin - tol;
 
6006
            ibox.x2_ = xmax + tol;
 
6007
          }
 
6008
          else{
 
6009
            ibox.x1_ = xmin;
 
6010
            ibox.x2_ = xmax;
 
6011
          }
 
6012
          if (ymin == ymax) {
 
6013
            ibox.y1_ = ymin - tol;
 
6014
            ibox.y2_ = ymax + tol;
 
6015
          }
 
6016
          else {
 
6017
            ibox.y1_ = ymin;
 
6018
            ibox.y2_ = ymax;
 
6019
          }
 
6020
                                        updateBox (bout, ibox);
 
6021
                                        b = portal->fetchRow();
 
6022
                                        status = true;
 
6023
                                }
 
6024
                        }
 
6025
                        break;
 
6026
 
 
6027
 
 
6028
                default:
 
6029
                        status = false;
 
6030
                        break;
 
6031
        }
 
6032
 
 
6033
        delete portal;
 
6034
 
 
6035
        return status;
 
6036
 
 
6037
}
 
6038
 
 
6039
bool 
 
6040
TeDatabase::getAttributeList(const string& tableName,TeAttributeList& attList)
 
6041
{
 
6042
        TeDatabasePortal* portal = this->getPortal();
 
6043
        if (!portal)
 
6044
                return false;
 
6045
 
 
6046
        string sql = "SELECT * FROM " + tableName + " WHERE 1=2";
 
6047
        if (!portal->query(sql))
 
6048
        {
 
6049
                delete portal;
 
6050
                return false;
 
6051
        }
 
6052
        else
 
6053
                attList = portal->AttributeList();
 
6054
        delete portal;
 
6055
        return true;
 
6056
}
 
6057
 
 
6058
TeBox 
 
6059
TeDatabase::getThemeBox(TeTheme* theme)
 
6060
{
 
6061
        TeBox bb;
 
6062
        if (!theme)
 
6063
                return bb;
 
6064
 
 
6065
        string colTabName = theme->collectionTable();
 
6066
        if (colTabName.empty())
 
6067
                return bb;
 
6068
 
 
6069
        string sqlfrom;
 
6070
        TeLayer* layer = theme->layer();
 
6071
        string geomTable;
 
6072
        if (layer->hasGeometry(TePOINTS))
 
6073
        {
 
6074
                geomTable = layer->tableName(TePOINTS);
 
6075
                sqlfrom = colTabName + " LEFT JOIN " + geomTable;
 
6076
                sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
 
6077
                TeBox bpt;
 
6078
                if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOINTS,bpt))
 
6079
                        updateBox(bb,bpt);
 
6080
        }
 
6081
        if (layer->hasGeometry(TeLINES))
 
6082
        {
 
6083
                geomTable = layer->tableName(TeLINES);
 
6084
                sqlfrom = colTabName + " LEFT JOIN " + geomTable;
 
6085
                sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
 
6086
                TeBox bln;
 
6087
                if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeLINES,bln))
 
6088
                        updateBox(bb,bln);
 
6089
        }
 
6090
        if (layer->hasGeometry(TePOLYGONS))
 
6091
        {
 
6092
                geomTable = layer->tableName(TePOLYGONS);
 
6093
                sqlfrom = colTabName + " LEFT JOIN " + geomTable;
 
6094
                sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
 
6095
                TeBox bpol;
 
6096
                if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOLYGONS,bpol))
 
6097
                        updateBox(bb,bpol);
 
6098
        }
 
6099
 
 
6100
        if (layer->hasGeometry(TeCELLS))
 
6101
        {
 
6102
                geomTable = layer->tableName(TeCELLS);
 
6103
                sqlfrom = colTabName + " LEFT JOIN " + geomTable;
 
6104
                sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
 
6105
                TeBox bpol;
 
6106
                if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeCELLS,bpol))
 
6107
                        updateBox(bb,bpol);
 
6108
        }
 
6109
        return bb;
 
6110
}
 
6111
 
 
6112
bool TeDatabase::insertRasterVisual (int themeId , TeRasterVisual* vis)
 
6113
{
 
6114
        TeRasterTransform::TeRasterTransfFunctions tf = vis->getTransfFunction();
 
6115
                
 
6116
        if (tf == TeRasterTransform::TeNoTransf)
 
6117
                return true;
 
6118
 
 
6119
        string sql = "DELETE FROM te_visual_raster WHERE theme_id = " + Te2String(themeId);
 
6120
        if (!this->execute(sql))
 
6121
                return false;
 
6122
 
 
6123
        if (tf == TeRasterTransform::TeMono2Three ||
 
6124
                tf == TeRasterTransform::TePall2Three || 
 
6125
                tf == TeRasterTransform::TeLUT2Three)
 
6126
        {
 
6127
                sql = "INSERT INTO te_visual_raster (theme_id, band_in, transf_type) VALUES (";
 
6128
                sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
 
6129
                sql += Te2String(static_cast<short>(tf)) + ")";
 
6130
                if (!this->execute(sql))
 
6131
                        return false;
 
6132
                return true;
 
6133
        }
 
6134
 
 
6135
        if (tf == TeRasterTransform::TeExtractBand)
 
6136
        {
 
6137
                sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
 
6138
                sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
 
6139
                sql += Te2String(vis->getDestBand()) + "," + Te2String(static_cast<short>(tf))+ ")";
 
6140
                if (!this->execute(sql))
 
6141
                        return false;
 
6142
                return true;
 
6143
        }
 
6144
 
 
6145
        if (tf == TeRasterTransform::TeExtractBands || tf == TeRasterTransform::TeExtractRGB)
 
6146
        {
 
6147
                map<TeRasterTransform::TeRGBChannels,short>& RGBmap = vis->getRGBMap();
 
6148
                map<TeRasterTransform::TeRGBChannels,short>::iterator it = RGBmap.begin();
 
6149
                while (it != RGBmap.end())
 
6150
                {
 
6151
                        sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
 
6152
                        sql += Te2String(themeId) + "," + Te2String(static_cast<short>(it->second)) + ",";
 
6153
                        sql += Te2String(static_cast<short>(it->first)) + "," + Te2String(static_cast<short>(tf))+ ")";
 
6154
                        if (!this->execute(sql))
 
6155
                                return false;
 
6156
                        ++it;
 
6157
                }
 
6158
                return true;
 
6159
        }
 
6160
        return false;
 
6161
}
 
6162
 
 
6163
 
 
6164
bool 
 
6165
TeDatabase::locateLineSet (const string& table, TeCoord2D &pt, TeLineSet &ls, const double& tol)
 
6166
{
 
6167
        bool located=false;
 
6168
        TeDatabasePortal* portal = this->getPortal();
 
6169
 
 
6170
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
6171
        string q ="SELECT * FROM " + table;
 
6172
        char buf [1024];
 
6173
        sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
 
6174
                box.x2(),box.x1(),box.y2(),box.y1());
 
6175
        q += buf;
 
6176
        if (!portal->query(q) || !portal->fetchRow())
 
6177
        {
 
6178
                delete portal;
 
6179
                return false;
 
6180
        }
 
6181
 
 
6182
        // Get all lines
 
6183
        bool flag = true;
 
6184
        do 
 
6185
        {
 
6186
                TeLine2D l;
 
6187
                TeLineSet tmp;
 
6188
                int index;
 
6189
                double dist;
 
6190
                TeCoord2D pout;
 
6191
 
 
6192
                flag = portal->fetchGeometry( l );
 
6193
                tmp.add(l);
 
6194
                if(TeNearest(pt,tmp,index,pout,dist,tol))
 
6195
                        {
 
6196
                                ls.add ( l );
 
6197
                                located=true;
 
6198
                        }
 
6199
        } while (flag);
 
6200
 
 
6201
        delete portal;
 
6202
        return located;
 
6203
}
 
6204
 
 
6205
 
 
6206
bool 
 
6207
TeDatabase::locatePointSet (const string& table, TeCoord2D &pt, TePointSet &pointSet, const double& tol)
 
6208
{
 
6209
        bool located=false;
 
6210
 
 
6211
        TeDatabasePortal* portal = this->getPortal();
 
6212
 
 
6213
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
6214
        string q ="SELECT * FROM " + table;
 
6215
        char buf [1024];
 
6216
        sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
 
6217
                box.x2(),box.x1(),box.y2(),box.y1());
 
6218
        q += buf;
 
6219
 
 
6220
        if (!portal->query(q) || !portal->fetchRow())
 
6221
        {
 
6222
                delete portal;
 
6223
                return false;
 
6224
        }
 
6225
        
 
6226
        bool flag = true;
 
6227
        do 
 
6228
        {
 
6229
                TePoint point;
 
6230
                flag = portal->fetchGeometry (point);
 
6231
                pointSet.add ( point );
 
6232
                located=true;
 
6233
        }while (flag);
 
6234
 
 
6235
        delete portal;
 
6236
        return located;
 
6237
}
 
6238
 
 
6239
 
 
6240
bool 
 
6241
TeDatabase::locateTextSet (const string& table, TeCoord2D &pt, TeTextSet& textSet, const double& tol)
 
6242
{
 
6243
        bool located=false;
 
6244
 
 
6245
        TeDatabasePortal* portal = this->getPortal();
 
6246
 
 
6247
        TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
 
6248
        string q ="SELECT * FROM " + table;
 
6249
        char buf [1024];
 
6250
        sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
 
6251
                box.x2(),box.x1(),box.y2(),box.y1());
 
6252
        q += buf;
 
6253
        if (!portal->query(q) || !portal->fetchRow())
 
6254
        {
 
6255
                delete portal;
 
6256
                return false;
 
6257
        }
 
6258
        // Look for all texts
 
6259
        bool flag = true;
 
6260
        
 
6261
        do
 
6262
        {
 
6263
                TeText p;
 
6264
                flag = portal->fetchGeometry(p);
 
6265
                textSet.add ( p );
 
6266
                located=true;
 
6267
        } while (flag);
 
6268
 
 
6269
        delete portal;
 
6270
        return located;
 
6271
}
 
6272
 
 
6273
 
 
6274
// End TeDatabase Methods
 
6275
 
 
6276
// Begin TeDatabasePortal Methods
 
6277
 
 
6278
TeDatabasePortal::TeDatabasePortal():
 
6279
        db_(0),                 
 
6280
        numRows_(0),
 
6281
        numFields_ (0), 
 
6282
        errorMessage_(""),
 
6283
        errorNumber_(0)
 
6284
        {}
 
6285
 
 
6286
TeDatabasePortal::~TeDatabasePortal ()
 
6287
{
 
6288
}
 
6289
 
 
6290
double 
 
6291
TeDatabasePortal::getDouble (int i)
 
6292
{  
 
6293
        char* val = getData(i); 
 
6294
        return atof(val); 
 
6295
}
 
6296
 
 
6297
double 
 
6298
TeDatabasePortal::getDouble (const string& s)
 
6299
{  
 
6300
        char* val = getData(s); 
 
6301
        return atof(val); 
 
6302
}
 
6303
 
 
6304
int 
 
6305
TeDatabasePortal::getInt (int i)
 
6306
{  
 
6307
        char* val = getData(i); 
 
6308
        return atoi(val); 
 
6309
}
 
6310
 
 
6311
int 
 
6312
TeDatabasePortal::getInt (const string& s)
 
6313
{  
 
6314
        char* val = getData(s); 
 
6315
        return atoi(val); 
 
6316
}
 
6317
 
 
6318
bool
 
6319
TeDatabasePortal::fetchGeometry (TeCell& cell)
 
6320
{
 
6321
        int index = atoi(getData("geom_id"));
 
6322
        string object_id = getData("object_id");
 
6323
        TeBox b (atof(getData("lower_x")),atof(getData("lower_y")),atof(getData("upper_x")),atof(getData("upper_y")));
 
6324
        cell.geomId(index);
 
6325
        cell.objectId(object_id);
 
6326
        cell.setBox (b);
 
6327
        cell.column(atoi(getData("col_number")));
 
6328
        cell.line(atoi(getData("row_number")));
 
6329
        return (fetchRow());
 
6330
}
 
6331
 
 
6332
TeAttribute TeDatabasePortal::getAttribute (int i)
 
6333
{
 
6334
        TeAttributeList::iterator it = attList_.begin();
 
6335
        int j = 0;
 
6336
        while ( it != attList_.end() )
 
6337
        {
 
6338
                if (i == j)
 
6339
                        return (*it);
 
6340
                ++it;
 
6341
                j++;
 
6342
        }
 
6343
        return TeAttribute();
 
6344
}
 
6345
 
 
6346
TeAttribute TeDatabasePortal::getAttribute (const string& s)
 
6347
{
 
6348
        TeAttributeList::iterator it = attList_.begin();
 
6349
        while ( it != attList_.end() )
 
6350
        {
 
6351
                if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
 
6352
                        return (*it);
 
6353
                ++it;
 
6354
        }
 
6355
        return TeAttribute();
 
6356
}
 
6357
 
 
6358
int 
 
6359
TeDatabasePortal::getColumnIndex (const string& s)
 
6360
{
 
6361
        TeAttributeList::iterator it = attList_.begin();
 
6362
        int j = 0;
 
6363
        while ( it != attList_.end() )
 
6364
        {
 
6365
                if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
 
6366
                        return j;
 
6367
                ++it;
 
6368
                j++;
 
6369
        }
 
6370
        return -1;
 
6371
}
 
6372
 
 
6373
string 
 
6374
TeDatabasePortal::getColumnName (int i)
 
6375
{
 
6376
        TeAttributeList::iterator it = attList_.begin();
 
6377
        int j=0;
 
6378
        while ( it != attList_.end() )
 
6379
        {
 
6380
                if (j==i)
 
6381
                        return (*it).rep_.name_;
 
6382
                ++it;
 
6383
                j++;
 
6384
        }
 
6385
        return "";
 
6386
}
 
6387
 
 
6388
 
 
6389
TeViewTree*
 
6390
TeDatabasePortal::getViewTree ()
 
6391
{
 
6392
        TeViewTree *tree = new TeViewTree();
 
6393
        tree->id (atoi(getData("theme_id")));
 
6394
        tree->name (getData("name"));
 
6395
        tree->priority(atoi(getData("priority")));
 
6396
        return tree;
 
6397
}
 
6398
 
 
6399
TeLegendEntry 
 
6400
TeDatabasePortal::getLegend ()
 
6401
{
 
6402
        TeLegendEntry leg;
 
6403
        leg.id (atoi(getData("legend_id")));
 
6404
        leg.theme (atoi(getData("theme_id")));
 
6405
        leg.group (atoi(getData("group_id")));
 
6406
 
 
6407
        string data;
 
6408
        data = getData("num_objs");
 
6409
        leg.count(atoi(data.c_str()));
 
6410
        data = getData("lower_value");
 
6411
        leg.from(data);
 
6412
        data = getData("upper_value");
 
6413
        leg.to(data);
 
6414
        data = getData("label");
 
6415
        leg.label(data);
 
6416
        return leg;
 
6417
}
 
6418
 
 
6419
TeVisual
 
6420
TeDatabasePortal::getVisual()
 
6421
{
 
6422
        TeVisual vis;
 
6423
        TeGeomRep rep = (TeGeomRep)atoi (getData("geom_type"));
 
6424
 
 
6425
        TeColor cor(atoi(getData("red")),atoi(getData("green")),atoi(getData("blue")));
 
6426
        vis.color(cor);
 
6427
        vis.libName (string(getData("lib_name")));
 
6428
        vis.transparency(atoi(getData("transparency")));
 
6429
 
 
6430
        TeColor ccor(atoi(getData("contour_red")),atoi(getData("contour_green")),atoi(getData("contour_blue")));
 
6431
        vis.contourColor(ccor);
 
6432
        vis.contourLibName(string(getData("contour_lib_name")));
 
6433
        vis.contourWidth(atoi(getData("contour_width")));
 
6434
        vis.contourTransparency(atoi(getData("contour_transp")));
 
6435
 
 
6436
        if(rep == TePOLYGONS || rep == TeCELLS)
 
6437
        {
 
6438
                vis.contourWidth(atoi(getData("width")));
 
6439
                vis.contourStyle(atoi(getData("contour_symb_id")));
 
6440
                vis.style(atoi(getData("symb_id")));
 
6441
        }
 
6442
        else if(rep == TeLINES)
 
6443
        {
 
6444
                vis.width(atoi(getData("width")));
 
6445
                vis.style(atoi(getData("symb_id")));
 
6446
        }
 
6447
        else if(rep == TePOINTS)
 
6448
        {
 
6449
                vis.size(atoi(getData("size_value")));
 
6450
                vis.style(atoi(getData("symb_id")));
 
6451
        }
 
6452
        else if(rep == TeTEXT)
 
6453
                vis.size(atoi(getData("size_value")));
 
6454
 
 
6455
        vis.family(getData("family"));
 
6456
        vis.bold (getBool("bold"));
 
6457
        vis.italic (getBool("italic"));
 
6458
        vis.fixedSize (getBool("fixed_size"));
 
6459
 
 
6460
        vis.alignmentVert(getDouble("alignment_vert"));
 
6461
        vis.alignmentHoriz(getDouble("alignment_horiz"));
 
6462
 
 
6463
        vis.tabSize(atoi(getData("tab_size")));
 
6464
        vis.lineSpace(atoi(getData("line_space")));
 
6465
        return vis;
 
6466
}
 
6467
 
 
6468
bool 
 
6469
TeDatabasePortal::fetchGeometry (TeText& t)
 
6470
{
 
6471
        TeCoord2D c(getDouble("x"), getDouble("y"));
 
6472
        string txt = getData ("text_value");
 
6473
        TeText t2(c,txt);
 
6474
        t2.geomId(atoi(getData("geom_id")));
 
6475
        t2.objectId(string(getData("object_id")));
 
6476
        t2.setAngle (getDouble("angle"));
 
6477
        t2.setHeight (getDouble("height"));
 
6478
        t2.setAlignmentVert(getDouble("alignment_vert"));
 
6479
        t2.setAlignmentHoriz(getDouble("alignment_horiz"));
 
6480
        t = t2;
 
6481
        return (fetchRow());
 
6482
}
 
6483
 
 
6484
TeColor 
 
6485
TeDatabasePortal::getColor ()
 
6486
{
 
6487
        TeColor c(atoi(getData("red")), atoi(getData("green")), atoi(getData("blue")));
 
6488
        return c;
 
6489
}
 
6490
 
 
6491
bool 
 
6492
TeDatabasePortal::fetchGeometry (TeArc& arc)
 
6493
{
 
6494
        arc.fromId(atoi(getData(2)));
 
6495
        arc.toId(atoi(getData(3)));
 
6496
        arc.geomId(atol(getData(0)));
 
6497
        arc.objectId(string(getData(1)));
 
6498
        return fetchRow();
 
6499
}
 
6500
 
 
6501
 
 
6502
 
 
6503
// End TeDatabasePortal Methods
 
6504