@@ -170,20 +170,34 @@ 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 knownDBsMutex .RUnlock ()
179+
180+ if logger , exists := DB2logger [db ]; exists && logger != nil {
181+ logger .ValidateQuery ((query ))
182+ }
183+ }
184+
173185// knownDBs is a DB cache by uri
174186var knownDBs map [string ]* sql.DB = make (map [string ]* sql.DB )
175187var knownDBsMutex = & sync.RWMutex {}
176188
177189type Logger interface {
178190 OnError (context string , query string , err error ) error
191+ ValidateQuery (query string )
179192}
193+
180194// it is also protected by knownDBsMutex
181195var DB2logger map [* sql.DB ]Logger = make (map [* sql.DB ]Logger )
182196
183197// GetDB returns a DB instance based on uri.
184198// logger parameter is optional. If nil, internal logging will be used.
185199// bool result indicates whether the DB was returned from cache; err
186- func GetGenericDB (driverName , dataSourceName string , logger Logger ) (* sql.DB , bool , error ) {
200+ func GetGenericDB (driverName , dataSourceName string , logger Logger ) (* sql.DB , bool , error ) {
187201 knownDBsMutex .Lock ()
188202 defer func () {
189203 knownDBsMutex .Unlock ()
@@ -221,7 +235,7 @@ func GetSQLiteDB(dbFile string, logger Logger) (*sql.DB, bool, error) {
221235func RowToArray (rows * sql.Rows , columns []string ) []CellData {
222236 buff := make ([]interface {}, len (columns ))
223237 data := make ([]CellData , len (columns ))
224- for i , _ := range buff {
238+ for i := range buff {
225239 buff [i ] = data [i ].NullString ()
226240 }
227241 rows .Scan (buff ... )
@@ -265,12 +279,10 @@ func ScanRowsToMaps(rows *sql.Rows, on_row func(RowMap) error) error {
265279 return err
266280}
267281
268- func logErrorInternal (context string , db * sql.DB , query string , err error ) error {
282+ func logErrorInternal (context string , db * sql.DB , query string , err error ) error {
269283 // find logger registered by the client
270284 knownDBsMutex .RLock ()
271- defer func () {
272- knownDBsMutex .RUnlock ()
273- }()
285+ defer knownDBsMutex .RUnlock ()
274286
275287 if logger , exists := DB2logger [db ]; exists && logger != nil {
276288 return logger .OnError (context , query , err )
@@ -282,6 +294,7 @@ func logErrorInternal(context string, db *sql.DB, query string, err error) error
282294// QueryRowsMap is a convenience function allowing querying a result set while poviding a callback
283295// function activated per read row.
284296func QueryRowsMap (db * sql.DB , query string , on_row func (RowMap ) error , args ... interface {}) (err error ) {
297+ validateQuery (query , db )
285298 defer func () {
286299 if derr := recover (); derr != nil {
287300 err = fmt .Errorf ("QueryRowsMap unexpected error: %+v" , derr )
@@ -302,6 +315,7 @@ func QueryRowsMap(db *sql.DB, query string, on_row func(RowMap) error, args ...i
302315
303316// queryResultData returns a raw array of rows for a given query, optionally reading and returning column names
304317func queryResultData (db * sql.DB , query string , retrieveColumns bool , args ... interface {}) (resultData ResultData , columns []string , err error ) {
318+ validateQuery (query , db )
305319 defer func () {
306320 if derr := recover (); derr != nil {
307321 err = errors .New (fmt .Sprintf ("QueryRowsMap unexpected error: %+v" , derr ))
@@ -358,6 +372,7 @@ func QueryRowsMapBuffered(db *sql.DB, query string, on_row func(RowMap) error, a
358372
359373// ExecNoPrepare executes given query using given args on given DB, without using prepared statements.
360374func ExecNoPrepare (db * sql.DB , query string , args ... interface {}) (res sql.Result , err error ) {
375+ validateQuery (query , db )
361376 defer func () {
362377 if derr := recover (); derr != nil {
363378 err = errors .New (fmt .Sprintf ("ExecNoPrepare unexpected error: %+v" , derr ))
@@ -374,6 +389,7 @@ func ExecNoPrepare(db *sql.DB, query string, args ...interface{}) (res sql.Resul
374389// ExecQuery executes given query using given args on given DB. It will safele prepare, execute and close
375390// the statement.
376391func execInternal (silent bool , db * sql.DB , query string , args ... interface {}) (res sql.Result , err error ) {
392+ validateQuery (query , db )
377393 defer func () {
378394 if derr := recover (); derr != nil {
379395 err = errors .New (fmt .Sprintf ("execInternal unexpected error: %+v" , derr ))
0 commit comments