Skip to content

Commit 363b22e

Browse files
author
Arunmozhi
committed
added tagging,detagging functions to qgsstylev2
1 parent b5ffa14 commit 363b22e

File tree

4 files changed

+301
-167
lines changed

4 files changed

+301
-167
lines changed

src/core/symbology-ng/qgsstylev2.cpp

+108
Original file line numberDiff line numberDiff line change
@@ -617,3 +617,111 @@ QStringList QgsStyleV2::findSymbols( QString qword )
617617

618618
return symbols;
619619
}
620+
621+
bool QgsStyleV2::tagSymbol( QString symbol, QStringList tags )
622+
{
623+
QByteArray array = symbol.toUtf8();
624+
char *query;
625+
sqlite3 *db = openDB( mFileName );
626+
if ( db == NULL )
627+
{
628+
QgsDebugMsg( "Sorry! Cannot open DB to tag." );
629+
return false;
630+
}
631+
632+
int symbolid = 0;
633+
query = sqlite3_mprintf( "SELECT id FROM symbol WHERE name='%q';", array.constData() );
634+
sqlite3_stmt *ppStmt;
635+
int err = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
636+
if ( err == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
637+
symbolid = sqlite3_column_int( ppStmt, 0 );
638+
sqlite3_finalize( ppStmt );
639+
if ( !symbolid )
640+
{
641+
QgsDebugMsg( "No such symbol for tagging in DB: " + symbol );
642+
return false;
643+
}
644+
645+
foreach ( QString tag, tags )
646+
{
647+
int tagid;
648+
char *zErr = 0;
649+
int nErr;
650+
QByteArray tagArray = tag.toUtf8();
651+
// sql: gets the id of the tag if present or insert the tag and get the id of the tag
652+
query = sqlite3_mprintf( "SELECT id FROM tag WHERE name='%q';", tagArray.constData() );
653+
nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
654+
if ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
655+
{
656+
tagid = sqlite3_column_int( ppStmt, 0 );
657+
}
658+
else
659+
{
660+
query = sqlite3_mprintf( "INSERT INTO tag VALUES (NULL,'%q');", tagArray.constData() );
661+
nErr = sqlite3_exec( db, query, NULL, NULL, &zErr );
662+
if ( nErr )
663+
{
664+
QgsDebugMsg( zErr );
665+
return false;
666+
}
667+
tagid = (int)sqlite3_last_insert_rowid( db );
668+
}
669+
sqlite3_finalize( ppStmt );
670+
// Now map the tag to the symbol
671+
query = sqlite3_mprintf( "INSERT INTO tagmap VALUES (%d,%d);", tagid, symbolid );
672+
nErr = sqlite3_exec( db, query, NULL, NULL, &zErr );
673+
if ( nErr )
674+
QgsDebugMsg( zErr );
675+
}
676+
sqlite3_close( db );
677+
return true;
678+
}
679+
680+
bool QgsStyleV2::detagSymbol( QString symbol, QStringList tags )
681+
{
682+
QByteArray array = symbol.toUtf8();
683+
char *query;
684+
int symbolid;
685+
sqlite3 *db = openDB( mFileName );
686+
if ( db == NULL )
687+
{
688+
QgsDebugMsg( "Sorry! Cannot open DB for detgging." );
689+
return false;
690+
}
691+
query = sqlite3_mprintf( "SELECT id FROM symbol WHERE name='%q';", array.constData() );
692+
sqlite3_stmt *ppStmt;
693+
int nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt, NULL );
694+
if ( nErr == SQLITE_OK && sqlite3_step( ppStmt ) == SQLITE_ROW )
695+
{
696+
symbolid = sqlite3_column_int( ppStmt, 0 );
697+
}
698+
sqlite3_finalize( ppStmt );
699+
700+
foreach ( QString tag, tags )
701+
{
702+
int tagid = 0;
703+
QByteArray tagArray = tag.toUtf8();
704+
query = sqlite3_mprintf( "SELECT id FROM tag WHERE name='%q';", tagArray.constData() );
705+
sqlite3_stmt *ppStmt2;
706+
nErr = sqlite3_prepare_v2( db, query, -1, &ppStmt2, NULL );
707+
if ( nErr == SQLITE_OK && sqlite3_step( ppStmt2 ) == SQLITE_ROW )
708+
{
709+
tagid = sqlite3_column_int( ppStmt2, 0 );
710+
}
711+
sqlite3_finalize( ppStmt2 );
712+
713+
if ( tagid )
714+
{
715+
// remove from the tagmap
716+
query = sqlite3_mprintf( "DELETE FROM tagmap WHERE tag_id=%d AND symbol_id=%d;", tagid, symbolid );
717+
runEmptyQuery( query );
718+
}
719+
}
720+
721+
// TODO Perform tag cleanup
722+
// check the number of entries for a given tag in the tagmap
723+
// if the count is 0, then remove( TagEntity, tagid )
724+
sqlite3_close( db );
725+
return true;
726+
}
727+

src/core/symbology-ng/qgsstylev2.h

+6
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ class CORE_EXPORT QgsStyleV2
142142
//! return the names of the symbols which have a matching 'substring' in its defintion
143143
QStringList findSymbols( QString qword );
144144

145+
//! tags the symbol with the tags in the list, the remove flag DE-TAGS
146+
bool tagSymbol( QString symbol, QStringList tags );
147+
148+
//! detags the symbol with the given list
149+
bool detagSymbol( QString symbol, QStringList tags );
150+
145151
protected:
146152

147153
QgsSymbolV2Map mSymbols;

0 commit comments

Comments
 (0)