@@ -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+
0 commit comments