@@ -617,3 +617,111 @@ QStringList QgsStyleV2::findSymbols( QString qword )
617
617
618
618
return symbols;
619
619
}
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