SQL Driver
From CometWiki
(Started the page and added some basic implementation/interface info)
Newer edit →
Revision as of 19:36, 24 September 2009
Contents |
Introduction
The SQL driver allows you to connect to a MySQL database (remote or local) from within an IB application.
Usage
Once we get the interface hammered out, this will be updated.
Interface
We're not sure how the final interface will be provided, but the following functionality should be addressed at minimum:
- Connect
- Specify Database (Could be done under Connect()?)
- Most likely we should be using the connection pool so that we function well under multiple threads... maybe we don't need this, as long as we stick to one connection per thread, and don't share MySQL++ structures between threads.
- Disconnect
- Build Statement
- There is functionality provided that allows you to build generalized query statements using variables. This is useful if you're going to be sending the same query multiple times but with different specifications.
- Send Statement
- Get Result
- Returns simple results for SQL statements like CREATE TABLE, ADD INDEX, etc.
- Get Result Set
- Returns all data in a multi-dim vector. I.e. resultSet[4][5] would give you the 5th field from the 4th row.
- Get Large Result Set
- Returns one row at a time from the server. This can be useful if you're returning many many records that would otherwise fill up memory and require disk space to cache. I.e. if you were returning a million records at 10k per record using the previous method you would need almost 10gigs of space.
This would provide all of the necessary functionality needed to access and update MySQL data, but requires a working (and probably thorough) knowledge of SQL. We could also provide functions that wrap SQL statements like the following:
- Query
- Update
- Insert
We could even add the major functions, although i think these are probably better performed at the server themselves, rather than through an IB program...
- Create Table
- Drop Table
- Modify Index
Ideally, i think a good example of the type of interface for those that don't know SQL syntax would be something like:
QueryOn( "customer_id", "customer_name" ) LimitOn( "customer_state", "NY" ) LimitOn( "customer_since", "1999-12-31" ) SortBy( "customer_id" ) resultSet = SendStatement()
Though once we start moving into JOINs and the like, this kind of interface seems hard to implement. My impression is that anybody doing any non-trivial SQL work inside IB will probably have to have an understanding of SQL syntax and implementation.
Implementation Details
The SQL driver utilizes the MySQL++ library to interface with the MySQL server. The library is compiled and linked into our own library, which provides the interface to the IB applications. Currently the MySQL++ library is compiled and linked dynamically (.dll), and our library is compiled and linked statically (.lib). This means that the MySQL++ .dll file must be included in the Comet release.
There are some legal issues with compiling and including the library statically under the GPL. My understanding is that any source code that links to the MySQL++ static library must be made available (tho not necessarily licensed under the GPL?). Thus if we write a static library that links to (and wraps up) the MySQL++ static library, then we can make the source for our library available, but still link to our library without being required to make the Comet source available. maybe someone else has some insight into this one...
There is a basic explanation of the legalities for using MySQL++ under the FAQ at MySQL++ Website