180 changes: 102 additions & 78 deletions src/core/symbology-ng/qgsstylev2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ void QgsStyleV2::clear()

mSymbols.clear();
mColorRamps.clear();

sqlite3_close( mCurrentDB );
}

bool QgsStyleV2::addSymbol( QString name, QgsSymbolV2* symbol )
Expand All @@ -84,6 +86,8 @@ bool QgsStyleV2::addSymbol( QString name, QgsSymbolV2* symbol )
delete mSymbols.value( name );

mSymbols.insert( name, symbol );
saveSymbol( name, symbol, 0, QStringList() );

return true;
}

Expand Down Expand Up @@ -123,6 +127,30 @@ bool QgsStyleV2::removeSymbol( QString name )

// remove from map and delete
delete mSymbols.take( name );

// TODO
// Simplify this work here, its STUPID to run two DB queries for the sake of remove()
QByteArray array = name.toUtf8();
char *query;
if ( mCurrentDB == NULL )
{
QgsDebugMsg( "Sorry! Cannot open database to tag." );
return false;
}

int symbolid = 0;
query = sqlite3_mprintf( "SELECT id FROM symbol WHERE name='%q';", array.constData() );
sqlite3_stmt *ppStmt;
int err = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( err == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
symbolid = sqlite3_column_int( ppStmt, 0 );
sqlite3_finalize( ppStmt );
if ( !symbolid )
{
QgsDebugMsg( "No such symbol for deleting in database: " + name + ". Cheers." );
}
remove( SymbolEntity, symbolid );

return true;
}

Expand Down Expand Up @@ -198,41 +226,39 @@ QStringList QgsStyleV2::colorRampNames()
return mColorRamps.keys();
}

sqlite3* QgsStyleV2::openDB( QString filename )
bool QgsStyleV2::openDB( QString filename )
{
sqlite3 *db;
int rc;

QByteArray namearray = filename.toUtf8();
rc = sqlite3_open( namearray.constData(), &db );
rc = sqlite3_open( namearray.constData(), &mCurrentDB );
if ( rc )
{
mErrorString = "Couldn't open the style DB: " + QString( sqlite3_errmsg( db ) );
sqlite3_close( db );
return NULL;
mErrorString = "Couldn't open the style Database: " + QString( sqlite3_errmsg( mCurrentDB ) );
sqlite3_close( mCurrentDB );
return false;
}

return db;
return true;
}

bool QgsStyleV2::load( QString filename )
{
mErrorString = QString();

// Open the sqlite DB
sqlite3* db = openDB( filename );
if ( db == NULL )
// Open the sqlite database
if ( !openDB( filename ) )
return false;
// First create all the Main symbols
sqlite3_stmt *ppStmt;
const char *query = "SELECT * FROM symbol;";
int nError = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int nError = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
while ( nError == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
QDomDocument doc;
QString symbol_name = QString( reinterpret_cast<const char*>( sqlite3_column_text( ppStmt, SymbolName ) ) );
QString xmlstring = QString( reinterpret_cast<const char*>( sqlite3_column_text( ppStmt, SymbolXML ) ) );
if( !doc.setContent( xmlstring ) )
if ( !doc.setContent( xmlstring ) )
{
QgsDebugMsg( "Cannot open symbol" + symbol_name );
continue;
Expand All @@ -245,7 +271,7 @@ bool QgsStyleV2::load( QString filename )
sqlite3_finalize( ppStmt );

const char *rquery = "SELECT * FROM colorramp;";
nError = sqlite3_prepare_v2( db, rquery, -1, &ppStmt, NULL );
nError = sqlite3_prepare_v2( mCurrentDB, rquery, -1, &ppStmt, NULL );
while ( nError == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
QDomDocument doc;
Expand All @@ -262,7 +288,6 @@ bool QgsStyleV2::load( QString filename )
addColorRamp( ramp_name, ramp );
}

sqlite3_close( db );
mFileName = filename;
return true;
}
Expand Down Expand Up @@ -319,6 +344,29 @@ bool QgsStyleV2::renameSymbol( QString oldName, QString newName )
return NULL;

mSymbols.insert( newName, mSymbols.take( oldName ) );

QByteArray array = oldName.toUtf8();
char *query;
if ( mCurrentDB == NULL )
{
QgsDebugMsg( "Sorry! Cannot open database to tag." );
return false;
}

int symbolid = 0;
query = sqlite3_mprintf( "SELECT id FROM symbol WHERE name='%q';", array.constData() );
sqlite3_stmt *ppStmt;
int err = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( err == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
symbolid = sqlite3_column_int( ppStmt, 0 );
sqlite3_finalize( ppStmt );
if ( !symbolid )
{
QgsDebugMsg( "No such symbol for tagging in database: " + oldName );
return false;
}
rename( SymbolEntity, symbolid, newName );

return true;
}

Expand All @@ -334,9 +382,8 @@ bool QgsStyleV2::renameColorRamp( QString oldName, QString newName )
QgsSymbolGroupMap QgsStyleV2::groupNames( QString parent )
{
QgsDebugMsg( "Request for groupNames for parent " + parent );
// get the name list from the sqlite db and return as a QStringList
sqlite3* db = openDB( mFileName );
if( db == NULL )
// get the name list from the sqlite database and return as a QStringList
if( mCurrentDB == NULL )
{
QgsDebugMsg( "Cannot open database for listing groups" );
return QgsSymbolGroupMap();
Expand All @@ -353,7 +400,7 @@ QgsSymbolGroupMap QgsStyleV2::groupNames( QString parent )
{
QByteArray parentArray = parent.toUtf8();
char *subquery = sqlite3_mprintf( "SELECT * FROM symgroup WHERE name='%q';", parentArray.constData() );
nError = sqlite3_prepare_v2( db, subquery, -1, &ppStmt, NULL );
nError = sqlite3_prepare_v2( mCurrentDB, subquery, -1, &ppStmt, NULL );
if ( nError == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
query = sqlite3_mprintf( "SELECT * FROM symgroup WHERE parent=%d;", sqlite3_column_int( ppStmt, SymgroupId ) );
Expand All @@ -363,23 +410,21 @@ QgsSymbolGroupMap QgsStyleV2::groupNames( QString parent )

QgsSymbolGroupMap groupNames;

nError = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
nError = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
while ( nError == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
QString group = QString( reinterpret_cast<const char*>( sqlite3_column_text( ppStmt, SymgroupName ) ) );
groupNames.insert( sqlite3_column_int( ppStmt, SymgroupId ), group );
}
sqlite3_finalize( ppStmt );
sqlite3_close( db );
return groupNames;
}

QStringList QgsStyleV2::symbolsOfGroup( int groupid )
{
sqlite3 *db = openDB( mFileName );
if( db == NULL )
if( mCurrentDB == NULL )
{
QgsDebugMsg( "Cannot Open Db for getting group symbols of groupid: " + groupid );
QgsDebugMsg( "Cannot Open database for getting group symbols of groupid: " + groupid );
return QStringList();
}

Expand All @@ -388,36 +433,34 @@ QStringList QgsStyleV2::symbolsOfGroup( int groupid )
char *query;
query = groupid ? sqlite3_mprintf( "SELECT name FROM symbol WHERE groupid=%d;", groupid ) :
sqlite3_mprintf( "SELECT name FROM symbol WHERE groupid IS NULL;");
int nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
while ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
QString symbol = QString( reinterpret_cast<const char*>( sqlite3_column_text( ppStmt, 0 ) ) );
symbols.append( symbol );
}
sqlite3_finalize( ppStmt );
sqlite3_close( db );

return symbols;
}

QStringList QgsStyleV2::symbolsWithTag( int tagid )
{
QStringList symbols;
sqlite3 *db = openDB( mFileName );
if ( db == NULL )
if ( mCurrentDB == NULL )
{
QgsDebugMsg( "Cannot open DB to get symbols of tagid " + tagid );
QgsDebugMsg( "Cannot open database to get symbols of tagid " + tagid );
return QStringList();
}
char *subquery = sqlite3_mprintf( "SELECT symbol_id FROM tagmap WHERE tag_id=%d;", tagid );
sqlite3_stmt *ppStmt;
int nErr = sqlite3_prepare_v2( db, subquery, -1, &ppStmt, NULL );
int nErr = sqlite3_prepare_v2( mCurrentDB, subquery, -1, &ppStmt, NULL );
while ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
int symbolId = sqlite3_column_int( ppStmt, 0 );
sqlite3_stmt *ppStmt2;
char *query = sqlite3_mprintf( "SELECT name FROM symbol WHERE id=%d;", symbolId );
int sErr = sqlite3_prepare_v2( db, query, -1, &ppStmt2, NULL );
int sErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt2, NULL );
while ( sErr == SQLITE_OK && sqlite3_step( ppStmt2 ) == SQLITE_ROW )
{
QString symbolName = QString( reinterpret_cast<const char*>( sqlite3_column_text( ppStmt2, 0 ) ) );
Expand All @@ -426,15 +469,13 @@ QStringList QgsStyleV2::symbolsWithTag( int tagid )
sqlite3_finalize( ppStmt2 );
}
sqlite3_finalize( ppStmt );
sqlite3_close( db );

return symbols;
}

int QgsStyleV2::addGroup( QString groupName, int parentid )
{
sqlite3 *db = openDB( mFileName );
if ( db == NULL )
if ( mCurrentDB == NULL )
return 0;
sqlite3_stmt *ppStmt;

Expand All @@ -448,33 +489,28 @@ int QgsStyleV2::addGroup( QString groupName, int parentid )
{
query = sqlite3_mprintf( "INSERT INTO symgroup VALUES (NULL, '%q', %d);", groupArray.constData(), parentid );
}
int nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( nErr == SQLITE_OK )
sqlite3_step( ppStmt );
sqlite3_finalize( ppStmt );

int groupid = (int)sqlite3_last_insert_rowid( db );
sqlite3_close( db );
return groupid;
return (int)sqlite3_last_insert_rowid( mCurrentDB );
}

int QgsStyleV2::addTag( QString tagname )
{
sqlite3 *db = openDB( mFileName );
if ( db == NULL )
if ( mCurrentDB == NULL )
return 0;
sqlite3_stmt *ppStmt;

QByteArray tagArray = tagname.toUtf8();
char *query = sqlite3_mprintf( "INSERT INTO tag VALUES (NULL, '%q');", tagArray.constData() );
int nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( nErr == SQLITE_OK )
sqlite3_step( ppStmt );
sqlite3_finalize( ppStmt );

int tagid = (int)sqlite3_last_insert_rowid( db );
sqlite3_close( db );
return tagid;
return (int)sqlite3_last_insert_rowid( mCurrentDB );
}

void QgsStyleV2::rename( StyleEntity type, int id, QString newName )
Expand All @@ -501,14 +537,12 @@ void QgsStyleV2::rename( StyleEntity type, int id, QString newName )
char* QgsStyleV2::getGroupRemoveQuery( int id )
{
int parentid;
sqlite3 * db = openDB( mFileName );
char *query = sqlite3_mprintf( "SELECT parent FROM symgroup WHERE id=%d;", id );
sqlite3_stmt *ppStmt;
int err = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int err = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( err == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
parentid = sqlite3_column_int( ppStmt, 0 );
sqlite3_finalize( ppStmt );
sqlite3_close( db );
if ( parentid )
{
query = sqlite3_mprintf( "UPDATE symbol SET groupid=%d WHERE groupid=%d;"
Expand Down Expand Up @@ -547,17 +581,15 @@ void QgsStyleV2::remove( StyleEntity type, int id )

bool QgsStyleV2::runEmptyQuery( char *query )
{
sqlite3 *db = openDB( mFileName );
char *zErr = 0;
if ( db == NULL )
if ( mCurrentDB == NULL )
return false;
int nErr = sqlite3_exec( db, query, NULL, NULL, &zErr );
int nErr = sqlite3_exec( mCurrentDB, query, NULL, NULL, &zErr );
if ( nErr )
{
QgsDebugMsg( zErr );
return false;
}
sqlite3_close( db );
return true;
}

Expand All @@ -577,21 +609,19 @@ QStringList QgsStyleV2::findSymbols( QString qword )
query = sqlite3_mprintf( "SELECT name FROM symbol WHERE xml LIKE '%%%q%%';", array.constData() );

QStringList symbols;
sqlite3 *db = openDB( mFileName );
if ( db == NULL )
if ( mCurrentDB == NULL )
{
QgsDebugMsg( "Sorry! Cannot open DB to search" );
QgsDebugMsg( "Sorry! Cannot open database to search" );
return QStringList();
}
sqlite3_stmt *ppStmt;
int nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
while ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
QString symbolName = QString( reinterpret_cast<const char*>( sqlite3_column_text( ppStmt, 0 ) ) );
symbols.append( symbolName );
}
sqlite3_finalize( ppStmt );
sqlite3_close( db );

return symbols;
}
Expand All @@ -600,23 +630,22 @@ bool QgsStyleV2::tagSymbol( QString symbol, QStringList tags )
{
QByteArray array = symbol.toUtf8();
char *query;
sqlite3 *db = openDB( mFileName );
if ( db == NULL )
if ( mCurrentDB == NULL )
{
QgsDebugMsg( "Sorry! Cannot open DB to tag." );
QgsDebugMsg( "Sorry! Cannot open database to tag." );
return false;
}

int symbolid = 0;
query = sqlite3_mprintf( "SELECT id FROM symbol WHERE name='%q';", array.constData() );
sqlite3_stmt *ppStmt;
int err = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int err = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( err == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
symbolid = sqlite3_column_int( ppStmt, 0 );
sqlite3_finalize( ppStmt );
if ( !symbolid )
{
QgsDebugMsg( "No such symbol for tagging in DB: " + symbol );
QgsDebugMsg( "No such symbol for tagging in database: " + symbol );
return false;
}

Expand All @@ -628,30 +657,29 @@ bool QgsStyleV2::tagSymbol( QString symbol, QStringList tags )
QByteArray tagArray = tag.toUtf8();
// sql: gets the id of the tag if present or insert the tag and get the id of the tag
query = sqlite3_mprintf( "SELECT id FROM tag WHERE name='%q';", tagArray.constData() );
nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
tagid = sqlite3_column_int( ppStmt, 0 );
}
else
{
query = sqlite3_mprintf( "INSERT INTO tag VALUES (NULL,'%q');", tagArray.constData() );
nErr = sqlite3_exec( db, query, NULL, NULL, &zErr );
nErr = sqlite3_exec( mCurrentDB, query, NULL, NULL, &zErr );
if ( nErr )
{
QgsDebugMsg( zErr );
return false;
}
tagid = (int)sqlite3_last_insert_rowid( db );
tagid = (int)sqlite3_last_insert_rowid( mCurrentDB );
}
sqlite3_finalize( ppStmt );
// Now map the tag to the symbol
query = sqlite3_mprintf( "INSERT INTO tagmap VALUES (%d,%d);", tagid, symbolid );
nErr = sqlite3_exec( db, query, NULL, NULL, &zErr );
nErr = sqlite3_exec( mCurrentDB, query, NULL, NULL, &zErr );
if ( nErr )
QgsDebugMsg( zErr );
}
sqlite3_close( db );
return true;
}

Expand All @@ -660,15 +688,14 @@ bool QgsStyleV2::detagSymbol( QString symbol, QStringList tags )
QByteArray array = symbol.toUtf8();
char *query;
int symbolid;
sqlite3 *db = openDB( mFileName );
if ( db == NULL )
if ( mCurrentDB == NULL )
{
QgsDebugMsg( "Sorry! Cannot open DB for detgging." );
QgsDebugMsg( "Sorry! Cannot open database for detgging." );
return false;
}
query = sqlite3_mprintf( "SELECT id FROM symbol WHERE name='%q';", array.constData() );
sqlite3_stmt *ppStmt;
int nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
symbolid = sqlite3_column_int( ppStmt, 0 );
Expand All @@ -681,7 +708,7 @@ bool QgsStyleV2::detagSymbol( QString symbol, QStringList tags )
QByteArray tagArray = tag.toUtf8();
query = sqlite3_mprintf( "SELECT id FROM tag WHERE name='%q';", tagArray.constData() );
sqlite3_stmt *ppStmt2;
nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt2, NULL );
nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt2, NULL );
if ( nErr == SQLITE_OK && sqlite3_step( ppStmt2 ) == SQLITE_ROW )
{
tagid = sqlite3_column_int( ppStmt2, 0 );
Expand All @@ -699,7 +726,6 @@ bool QgsStyleV2::detagSymbol( QString symbol, QStringList tags )
// TODO Perform tag cleanup
// check the number of entries for a given tag in the tagmap
// if the count is 0, then remove( TagEntity, tagid )
sqlite3_close( db );
return true;
}

Expand All @@ -710,30 +736,29 @@ QStringList QgsStyleV2::tagsOfSymbol( QString symbol )
char *query;
sqlite3_stmt *ppStmt;
int symbolid;
sqlite3 *db = openDB( mFileName );
if ( db == NULL )
if ( mCurrentDB == NULL )
{
QgsDebugMsg( "Sorry! Cannot open DB for getting the tags." );
QgsDebugMsg( "Sorry! Cannot open database for getting the tags." );
return QStringList();
}
// get the symbol id
query = sqlite3_mprintf( "SELECT id FROM symbol WHERE name='%q';", array.constData() );
int nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
int nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
if ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
symbolid = sqlite3_column_int( ppStmt, 0 );
}
sqlite3_finalize( ppStmt );
// get the ids of tags for the symbol
query = sqlite3_mprintf( "SELECT tag_id FROM tagmap WHERE symbol_id=%d;", symbolid );
nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
nErr = sqlite3_prepare_v2( mCurrentDB, query, -1, &ppStmt, NULL );
while ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
{
int tagid = sqlite3_column_int( ppStmt, 0 );
char *subquery;
sqlite3_stmt *ppStmt2;
subquery = sqlite3_mprintf( "SELECT name FROM tag WHERE id=%d;", tagid );
int pErr = sqlite3_prepare_v2( db, subquery, -1, &ppStmt2, NULL );
int pErr = sqlite3_prepare_v2( mCurrentDB, subquery, -1, &ppStmt2, NULL );
if ( pErr == SQLITE_OK && sqlite3_step( ppStmt2 ) == SQLITE_ROW )
{
QString tag = QString( reinterpret_cast<const char*>( sqlite3_column_text( ppStmt2, 0 ) ) );
Expand All @@ -742,7 +767,6 @@ QStringList QgsStyleV2::tagsOfSymbol( QString symbol )
sqlite3_finalize( ppStmt2 );
}
sqlite3_finalize( ppStmt );
sqlite3_close( db );

return tagList;
}
4 changes: 3 additions & 1 deletion src/core/symbology-ng/qgsstylev2.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,12 @@ class CORE_EXPORT QgsStyleV2
QString mErrorString;
QString mFileName;

sqlite3* mCurrentDB;

static QgsStyleV2* mDefaultStyle;

//! Convinence function to open the DB and return a sqlite3 object
sqlite3* openDB( QString filename );
bool openDB( QString filename );
//! Convinence function that would run queries which donot generate return values
//! it returns sucess result
bool runEmptyQuery( char* query );
Expand Down
6 changes: 3 additions & 3 deletions src/gui/symbology-ng/qgsstylev2managerdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#include "qgssymbollayerv2utils.h"
#include "qgsvectorcolorrampv2.h"

#include "qgssymbolv2propertiesdialog.h"
#include "qgssymbolv2selectordialog.h"
#include "qgsvectorgradientcolorrampv2dialog.h"
#include "qgsvectorrandomcolorrampv2dialog.h"
#include "qgsvectorcolorbrewercolorrampv2dialog.h"
Expand Down Expand Up @@ -295,7 +295,7 @@ bool QgsStyleV2ManagerDialog::addSymbol()
}

// get symbol design
QgsSymbolV2PropertiesDialog dlg( symbol, 0, this );
QgsSymbolV2SelectorDialog dlg( symbol, mStyle, NULL, this );
if ( dlg.exec() == 0 )
{
delete symbol;
Expand Down Expand Up @@ -443,7 +443,7 @@ bool QgsStyleV2ManagerDialog::editSymbol()
QgsSymbolV2* symbol = mStyle->symbol( symbolName );

// let the user edit the symbol and update list when done
QgsSymbolV2PropertiesDialog dlg( symbol, 0, this );
QgsSymbolV2SelectorDialog dlg( symbol, mStyle, NULL , this );
if ( dlg.exec() == 0 )
{
delete symbol;
Expand Down