• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • tools
  • osm-addresses
SqlWriter.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2011 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "SqlWriter.h"
12 
13 #include <QVariant>
14 #include <QDebug>
15 #include <QSqlDatabase>
16 #include <QSqlQuery>
17 #include <QSqlError>
18 
19 namespace Marble
20 {
21 
22 SqlWriter::SqlWriter( const QString &filename, QObject* parent ) :
23  Writer( parent ), m_placemarkId( 0 )
24 {
25  QSqlDatabase database = QSqlDatabase::addDatabase( "QSQLITE" );
26  database.setDatabaseName( filename );
27  if ( !database.open() ) {
28  qCritical() << "Failed to connect to database";
29  return;
30  }
31 
32  execQuery( "DROP TABLE IF EXISTS placemarks;" );
33  execQuery( "CREATE TABLE placemarks ("
34  " regionId INTEGER,"
35  " nameId INTEGER,"
36  " number VARCHAR(8),"
37  " category INTEGER,"
38  " lon FLOAT(8),"
39  " lat FLOAT(8) )" );
40  execQuery( "DROP TABLE IF EXISTS names" );
41  execQuery( "CREATE TABLE names ("
42  " id INTEGER PRIMARY KEY,"
43  " name VARCHAR(50) )" );
44  execQuery( "DROP TABLE IF EXISTS regions" );
45  execQuery( "CREATE TABLE regions ("
46  " id INTEGER PRIMARY KEY,"
47  " parent INTEGER NOT NULL,"
48  " lft INTEGER NOT NULL,"
49  " rgt INTEGER NOT NULL,"
50  " name VARCHAR(50),"
51  " lon FLOAT(8),"
52  " lat FLOAT(8) )" );
53  execQuery( "DROP VIEW IF EXISTS places" );
54  execQuery( "CREATE VIEW places AS "
55  " SELECT"
56  " placemarks.regionId AS region,"
57  " names.name AS name,"
58  " placemarks.number AS number,"
59  " placemarks.category AS category,"
60  " placemarks.lon AS lon,"
61  " placemarks.lat AS lat"
62  " FROM names"
63  " INNER JOIN placemarks"
64  " ON names.id=placemarks.nameId" );
65  execQuery( "BEGIN TRANSACTION" );
66 }
67 
68 SqlWriter::~SqlWriter()
69 {
70  execQuery( "END TRANSACTION" );
71  execQuery( "CREATE INDEX namesIndex ON names(name)" );
72  execQuery( "CREATE INDEX placemarksIndex ON placemarks(regionId,nameId,category)" );
73  execQuery( "CREATE INDEX regionsIndex ON regions(name,parent,lft,rgt)" );
74 }
75 
76 void SqlWriter::addOsmRegion( const OsmRegion &region )
77 {
78  QSqlQuery query;
79  query.prepare( "INSERT INTO regions"
80  " (id, parent, lft, rgt, name, lon, lat)"
81  " VALUES (?, ?, ?, ?, ?, ?, ?)" );
82  query.addBindValue( ( qint32 ) region.identifier() );
83  query.addBindValue( ( qint32 ) region.parentIdentifier() );
84  query.addBindValue( ( qint32 ) region.left() );
85  query.addBindValue( ( qint32 ) region.right() );
86  query.addBindValue( region.name() );
87  query.addBindValue( region.longitude() );
88  query.addBindValue( region.latitude() );
89  execQuery( query );
90 }
91 
92 void SqlWriter::addOsmPlacemark( const OsmPlacemark &placemark )
93 {
94  if ( m_lastPlacemark.second != placemark.name() && !m_placemarks.contains( placemark.name() ) ) {
95  m_lastPlacemark.first = ++m_placemarkId;
96  m_lastPlacemark.second = placemark.name();
97  m_placemarks[m_lastPlacemark.second] = m_lastPlacemark.first;
98 
99  QSqlQuery insertQuery;
100  insertQuery.prepare( "INSERT INTO names"
101  " (id, name)"
102  " VALUES (?, ?)" );
103  insertQuery.addBindValue( m_lastPlacemark.first );
104  insertQuery.addBindValue( m_lastPlacemark.second );
105  execQuery( insertQuery );
106  }
107 
108  Q_ASSERT( m_placemarks.contains( placemark.name() ) );
109 
110  QSqlQuery query;
111  query.prepare( "INSERT INTO placemarks"
112  " (regionId, nameId, number, category, lon, lat)"
113  " VALUES (?, ?, ?, ?, ?, ?)" );
114  query.addBindValue( ( qint32 ) placemark.regionId() );
115  query.addBindValue( m_placemarks[placemark.name()] );
116  query.addBindValue( placemark.houseNumber() );
117  query.addBindValue( ( qint32 ) placemark.category() );
118  query.addBindValue( placemark.longitude() );
119  query.addBindValue( placemark.latitude() );
120  execQuery( query );
121 }
122 
123 void SqlWriter::execQuery( const QString &query ) const
124 {
125  QSqlQuery sqlQuery( query );
126  if ( sqlQuery.lastError().isValid() ) {
127  qCritical() << "Problems occurred when executing the query" << query;
128  qCritical() << "SQL error: " << sqlQuery.lastError();
129  }
130 }
131 
132 void SqlWriter::execQuery( QSqlQuery &query ) const
133 {
134  query.exec();
135  if ( query.lastError().isValid() ) {
136  qCritical() << "Problems occurred when executing the query" << query.executedQuery();
137  qCritical() << "SQL error: " << query.lastError();
138  }
139 }
140 
141 }
Marble::OsmRegion
A lightweight data structure to represent administrative regions like villages, cities, states, ...
Definition: OsmRegion.h:26
Marble::SqlWriter::~SqlWriter
~SqlWriter()
Definition: SqlWriter.cpp:68
Marble::OsmPlacemark
A lightweight data structure to represent points of interest like addresses with support for serializ...
Definition: OsmPlacemark.h:24
Marble::Writer
Definition: Writer.h:22
QObject
Marble::SqlWriter::addOsmRegion
void addOsmRegion(const OsmRegion &region)
Definition: SqlWriter.cpp:76
Marble::OsmPlacemark::regionId
int regionId() const
Identifier of the smallest region containing this placemark, 0 if none (~main area).
Definition: OsmPlacemark.cpp:53
Marble::OsmRegion::left
int left() const
Definition: OsmRegion.cpp:87
Marble::OsmRegion::right
int right() const
Definition: OsmRegion.cpp:97
Marble::OsmPlacemark::houseNumber
QString houseNumber() const
Placemark's house number, if any.
Definition: OsmPlacemark.cpp:43
Marble::OsmRegion::name
QString name() const
Definition: OsmRegion.cpp:47
SqlWriter.h
Marble::OsmPlacemark::latitude
qreal latitude() const
Latitude of the placemark's center point, in degree.
Definition: OsmPlacemark.cpp:83
Marble::OsmPlacemark::name
QString name() const
Placemark name.
Definition: OsmPlacemark.cpp:33
Marble::OsmPlacemark::category
OsmCategory category() const
Definition: OsmPlacemark.cpp:23
Marble::OsmRegion::parentIdentifier
int parentIdentifier() const
Definition: OsmRegion.cpp:37
Marble::OsmPlacemark::longitude
qreal longitude() const
Longitude of the placemark's center point, in degree.
Definition: OsmPlacemark.cpp:73
Marble::OsmRegion::identifier
int identifier() const
Unique (per process) region identifier.
Definition: OsmRegion.cpp:27
Marble::OsmRegion::longitude
qreal longitude() const
Longitude of the region's center point, in degree.
Definition: OsmRegion.cpp:57
Marble::OsmRegion::latitude
qreal latitude() const
Latitude of the region's center point, in degree.
Definition: OsmRegion.cpp:67
Marble::SqlWriter::addOsmPlacemark
void addOsmPlacemark(const OsmPlacemark &placemark)
Definition: SqlWriter.cpp:92
Marble::SqlWriter::SqlWriter
SqlWriter(const QString &filename, QObject *parent=0)
Definition: SqlWriter.cpp:22
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:53 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal