All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SQLiteConnectorDialog.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/qt/widgets/connector/sqlite/SQLiteConnectorDialog.cpp
22 
23  \brief ....
24 */
25 
26 // TerraLib
27 #include "../../../../common/Translator.h"
28 #include "../../../../dataaccess/datasource/DataSource.h"
29 #include "../../../../dataaccess/datasource/DataSourceFactory.h"
30 #include "../../../../dataaccess/datasource/DataSourceInfo.h"
31 #include "../../../../dataaccess/datasource/DataSourceManager.h"
32 #include "../../../widgets/Exception.h"
33 #include "Ui_SQLiteConnectorDialogForm.h"
34 #include "SQLiteConnectorDialog.h"
35 
36 // Boost
37 #include <boost/algorithm/string/case_conv.hpp>
38 #include <boost/lexical_cast.hpp>
39 #include <boost/uuid/random_generator.hpp>
40 #include <boost/uuid/uuid_io.hpp>
41 
42 // Qt
43 #include <QtGui/QFileDialog>
44 #include <QtGui/QMessageBox>
45 
47  : QDialog(parent, f),
48  m_ui(new Ui::SQLiteConnectorDialogForm)
49 {
50 // add controls
51  m_ui->setupUi(this);
52 
53 // connect signal and slots
54  connect(m_ui->m_openPushButton, SIGNAL(pressed()), this, SLOT(openPushButtonPressed()));
55  connect(m_ui->m_testPushButton, SIGNAL(pressed()), this, SLOT(testPushButtonPressed()));
56  connect(m_ui->m_helpPushButton, SIGNAL(pressed()), this, SLOT(helpPushButtonPressed()));
57  connect(m_ui->m_searchDatabaseToolButton, SIGNAL(pressed()), this, SLOT(searchDatabaseToolButtonPressed()));
58 }
59 
61 {
62 }
63 
65 {
66  return m_datasource;
67 }
68 
70 {
71  return m_driver;
72 }
73 
75 {
76  m_datasource = ds;
77 
78  if(m_datasource.get() != 0)
79  {
80  setConnectionInfo(m_datasource->getConnInfo());
81 
82  m_ui->m_datasourceTitleLineEdit->setText(QString::fromStdString(m_datasource->getTitle()));
83 
84  m_ui->m_datasourceDescriptionTextEdit->setText(QString::fromStdString(m_datasource->getDescription()));
85  }
86 }
87 
89 {
90  try
91  {
92  if(te::da::DataSourceFactory::find("SQLITE") == 0)
93  throw te::qt::widgets::Exception(TR_QT_WIDGETS("Sorry! No data access driver loaded for SQLite data sources!"));
94 
95  std::map<std::string, std::string> dsInfo;
96 
97  getConnectionInfo(dsInfo);
98 
99  m_driver.reset(te::da::DataSourceFactory::make("SQLITE").release());
100 
101  m_driver->setConnectionInfo(dsInfo);
102  m_driver->open();
103 
104  if(m_driver.get() == 0)
105  throw te::qt::widgets::Exception(TR_QT_WIDGETS("Could not open SQLite data source due to an unknown error!"));
106 
107  QString title = m_ui->m_datasourceTitleLineEdit->text().trimmed();
108 
109  if(title.isEmpty())
110  title = m_ui->m_fileLineEdit->text().trimmed();
111 
112  if(m_datasource.get() == 0)
113  {
114  m_datasource.reset(new te::da::DataSourceInfo);
115 
116  m_datasource->setConnInfo(dsInfo);
117 
118  boost::uuids::basic_random_generator<boost::mt19937> gen;
119  boost::uuids::uuid u = gen();
120  std::string dsId = boost::uuids::to_string(u);
121 
122  m_datasource->setId(dsId);
123  m_driver->setId(dsId);
124  m_datasource->setTitle(title.toUtf8().data());
125  m_datasource->setDescription(m_ui->m_datasourceDescriptionTextEdit->toPlainText().trimmed().toUtf8().data());
126  m_datasource->setAccessDriver("SQLITE");
127  m_datasource->setType("SQLITE");
128  }
129  else
130  {
131  m_driver->setId(m_datasource->getId());
132  m_datasource->setConnInfo(dsInfo);
133  m_datasource->setTitle(title.toUtf8().data());
134  m_datasource->setDescription(m_ui->m_datasourceDescriptionTextEdit->toPlainText().trimmed().toUtf8().data());
135  }
136  }
137  catch(const std::exception& e)
138  {
139  QMessageBox::warning(this,
140  tr("TerraLib Qt Components"),
141  tr(e.what()));
142  return;
143  }
144  catch(...)
145  {
146  QMessageBox::warning(this,
147  tr("TerraLib Qt Components"),
148  tr("Unknown error while opening SQLite database!"));
149  return;
150  }
151 
152  accept();
153 }
154 
156 {
157  try
158  {
159  if(te::da::DataSourceFactory::find("SQLITE") == 0)
160  throw te::qt::widgets::Exception(TR_QT_WIDGETS("Sorry! No data access driver loaded for SQLite data sources!"));
161 
162  std::map<std::string, std::string> dsInfo;
163 
164  getConnectionInfo(dsInfo);
165 
166  std::auto_ptr<te::da::DataSource> ds(te::da::DataSourceFactory::make("SQLITE"));
167 
168  ds->setConnectionInfo(dsInfo);
169  ds->open();
170 
171  if(ds.get() == 0)
172  throw te::qt::widgets::Exception(TR_QT_WIDGETS("Could not open SQLite database!"));
173 
174  QMessageBox::warning(this,
175  tr("TerraLib Qt Components"),
176  tr("Data source is ok!"));
177  }
178  catch(const std::exception& e)
179  {
180  QMessageBox::warning(this,
181  tr("TerraLib Qt Components"),
182  tr(e.what()));
183  }
184  catch(...)
185  {
186  QMessageBox::warning(this,
187  tr("TerraLib Qt Components"),
188  tr("Unknown error while testing SQLite data source!"));
189  }
190 }
191 
193 {
194  QMessageBox::warning(this,
195  tr("TerraLib Qt Components"),
196  tr("Not implemented yet!\nWe will provide it soon!"));
197 }
198 
200 {
201  QString fileName = QFileDialog::getOpenFileName(this, tr("Open SQLite Database"), QString(""), tr("Database files (*.sqlite *.db);; All Files (*.*)"), 0, QFileDialog::ReadOnly);
202 
203  if(fileName.isEmpty())
204  return;
205 
206  m_ui->m_fileLineEdit->setText(fileName);
207 }
208 
209 void te::qt::plugins::sqlite::SQLiteConnectorDialog::getConnectionInfo(std::map<std::string, std::string>& connInfo) const
210 {
211 // clear input
212  connInfo.clear();
213 
214  QString qstr = m_ui->m_fileLineEdit->text().trimmed();
215 
216  if(qstr.isEmpty())
217  connInfo["SQLITE_FILE"] = ":memory:";
218  else
219  connInfo["SQLITE_FILE"] = qstr.toUtf8().data();
220 
221  connInfo["SQLITE_OPEN_READWRITE"] = m_ui->m_rwAccessCheckBox->isChecked() ? "FALSE" : "TRUE";
222 
223  connInfo["SQLITE_OPEN_CREATE"] = m_ui->m_createdbCheckBox->isChecked() ? "TRUE" : "FALSE";
224 
225  connInfo["SQLITE_CREATE_INTERMEDIATE_DIR"] = m_ui->m_createdbCheckBox->isChecked() ? "TRUE" : "FALSE";
226 
227  connInfo["SQLITE_CREATE_SPATIALITE_METADATA_TABLES"] = "TRUE";
228 
229  connInfo["SQLITE_HIDE_SPATIAL_METADATA_TABLES"] = "TRUE";
230 }
231 
232 void te::qt::plugins::sqlite::SQLiteConnectorDialog::setConnectionInfo(const std::map<std::string, std::string>& connInfo)
233 {
234  std::map<std::string, std::string>::const_iterator it = connInfo.find("SQLITE_FILE");
235  std::map<std::string, std::string>::const_iterator itend = connInfo.end();
236 
237  if(it != itend)
238  m_ui->m_fileLineEdit->setText(QString::fromUtf8(it->second.c_str()));
239 
240  it = connInfo.find("SQLITE_OPEN_READWRITE");
241 
242  m_ui->m_rwAccessCheckBox->setChecked((it != itend) && (boost::to_upper_copy(it->second) == "TRUE"));
243 
244  it = connInfo.find("SQLITE_OPEN_CREATE");
245 
246  m_ui->m_createdbCheckBox->setChecked((it != itend) && (boost::to_upper_copy(it->second) == "TRUE"));
247 
248  it = connInfo.find("SQLITE_CREATE_INTERMEDIATE_DIR");
249 
250  m_ui->m_allowIntermediateDirCheckBox->setChecked((it != itend) && (boost::to_upper_copy(it->second) == "TRUE"));
251 
252  it = connInfo.find("SQLITE_CREATE_OGR_METADATA_TABLES");
253 }
static bool find(const std::string &dsType)
boost::shared_ptr< DataSource > DataSourcePtr
Definition: DataSource.h:1435
const te::da::DataSourceInfoPtr & getDataSource() const
void setConnectionInfo(const std::map< std::string, std::string > &connInfo)
void getConnectionInfo(std::map< std::string, std::string > &connInfo) const
const te::da::DataSourcePtr & getDriver() const
SQLiteConnectorDialog(QWidget *parent=0, Qt::WindowFlags f=0)
std::auto_ptr< Ui::SQLiteConnectorDialogForm > m_ui
static std::auto_ptr< DataSource > make(const std::string &dsType)
A class that represents a data source component.
void set(const te::da::DataSourceInfoPtr &ds)
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr