@@ -170,20 +170,35 @@ func (this *RowMap) GetTime(key string) time.Time {
170170 return time.Time {}
171171}
172172
173+ func validateQuery (query string , db * sql.DB ) {
174+ // dev purposes only. Remove this return to call query validator function.
175+ return
176+
177+ knownDBsMutex .RLock ()
178+ defer func () {
179+ knownDBsMutex .RUnlock ()
180+ }()
181+ if logger , exists := DB2logger [db ]; exists && logger != nil {
182+ logger .ValidateQuery ((query ))
183+ }
184+ }
185+
173186// knownDBs is a DB cache by uri
174187var knownDBs map [string ]* sql.DB = make (map [string ]* sql.DB )
175188var knownDBsMutex = & sync.RWMutex {}
176189
177190type Logger interface {
178191 OnError (context string , query string , err error ) error
192+ ValidateQuery (query string )
179193}
194+
180195// it is also protected by knownDBsMutex
181196var DB2logger map [* sql.DB ]Logger = make (map [* sql.DB ]Logger )
182197
183198// GetDB returns a DB instance based on uri.
184199// logger parameter is optional. If nil, internal logging will be used.
185200// bool result indicates whether the DB was returned from cache; err
186- func GetGenericDB (driverName , dataSourceName string , logger Logger ) (* sql.DB , bool , error ) {
201+ func GetGenericDB (driverName , dataSourceName string , logger Logger ) (* sql.DB , bool , error ) {
187202 knownDBsMutex .Lock ()
188203 defer func () {
189204 knownDBsMutex .Unlock ()
@@ -221,7 +236,7 @@ func GetSQLiteDB(dbFile string, logger Logger) (*sql.DB, bool, error) {
221236func RowToArray (rows * sql.Rows , columns []string ) []CellData {
222237 buff := make ([]interface {}, len (columns ))
223238 data := make ([]CellData , len (columns ))
224- for i , _ := range buff {
239+ for i := range buff {
225240 buff [i ] = data [i ].NullString ()
226241 }
227242 rows .Scan (buff ... )
@@ -265,7 +280,7 @@ func ScanRowsToMaps(rows *sql.Rows, on_row func(RowMap) error) error {
265280 return err
266281}
267282
268- func logErrorInternal (context string , db * sql.DB , query string , err error ) error {
283+ func logErrorInternal (context string , db * sql.DB , query string , err error ) error {
269284 // find logger registered by the client
270285 knownDBsMutex .RLock ()
271286 defer func () {
@@ -282,6 +297,7 @@ func logErrorInternal(context string, db *sql.DB, query string, err error) error
282297// QueryRowsMap is a convenience function allowing querying a result set while poviding a callback
283298// function activated per read row.
284299func QueryRowsMap (db * sql.DB , query string , on_row func (RowMap ) error , args ... interface {}) (err error ) {
300+ validateQuery (query , db )
285301 defer func () {
286302 if derr := recover (); derr != nil {
287303 err = fmt .Errorf ("QueryRowsMap unexpected error: %+v" , derr )
@@ -302,6 +318,7 @@ func QueryRowsMap(db *sql.DB, query string, on_row func(RowMap) error, args ...i
302318
303319// queryResultData returns a raw array of rows for a given query, optionally reading and returning column names
304320func queryResultData (db * sql.DB , query string , retrieveColumns bool , args ... interface {}) (resultData ResultData , columns []string , err error ) {
321+ validateQuery (query , db )
305322 defer func () {
306323 if derr := recover (); derr != nil {
307324 err = errors .New (fmt .Sprintf ("QueryRowsMap unexpected error: %+v" , derr ))
@@ -358,6 +375,7 @@ func QueryRowsMapBuffered(db *sql.DB, query string, on_row func(RowMap) error, a
358375
359376// ExecNoPrepare executes given query using given args on given DB, without using prepared statements.
360377func ExecNoPrepare (db * sql.DB , query string , args ... interface {}) (res sql.Result , err error ) {
378+ validateQuery (query , db )
361379 defer func () {
362380 if derr := recover (); derr != nil {
363381 err = errors .New (fmt .Sprintf ("ExecNoPrepare unexpected error: %+v" , derr ))
@@ -374,6 +392,7 @@ func ExecNoPrepare(db *sql.DB, query string, args ...interface{}) (res sql.Resul
374392// ExecQuery executes given query using given args on given DB. It will safele prepare, execute and close
375393// the statement.
376394func execInternal (silent bool , db * sql.DB , query string , args ... interface {}) (res sql.Result , err error ) {
395+ validateQuery (query , db )
377396 defer func () {
378397 if derr := recover (); derr != nil {
379398 err = errors .New (fmt .Sprintf ("execInternal unexpected error: %+v" , derr ))
0 commit comments