I need to write a jdbc compliant driver wrapper whose purpose is to log all SQL statements that modify data. What is the easiest way to differentiate those statements that modify data from those that only read data? I guess that only way is to parse SQL code on the fly, any libraries that can do that?
views:
46answers:
3I think a pretty good start is looking for queries starting with INSERT, UPDATE or DELETE. Make sure to trim leading whitespace before testing the strings.
If you want to include schema altering statements, include commands such as CREATE, ALTER, DROP, and TRUNCATE.
The specifics of the above approach will depend on the database you are using. E.g., there may be batch commands in one string, separated by a semicolon. You will need to parse the string to look for instances such as this.
You could probably find some full blown sql parsers such as this one, but if your wrapper will intercept only single statements then you might (not enough detail) consider SELECT statements as read only and everything else as statements that modify data.
If this is not a general purpose wrapper I would just log every call to the executeXXX()
methods, except calls to executeQuery()
, and then just call the appropiate method in client code.
If you want it to be general purpose and would like to avoid parsing SQL, you can investigate the getUpdateCount()
method, and the return values of the executeXXX()
methods. That would imply logging after the statement was executed, and I do not think it would be 100% correct.