some versions of unixodbc don't support SQLConnectW or SQLPrepareW,
		use non-unicode for them

some versions of Postgres don't have PQServerVersion,
			maybe can use PQconninfoOption?

Tests:
	php pear db bind formats
	db2 temp tables
	odbc temp tables
	zope
	odbc tests
	mysql_stmt calls in drop-in library
	better pythondb/rubydbi tests
	test init scripts
	test send query w/length
	test upper/lower/mixed column case methods
	need database reconnect tests
	column flags
	getFieldAsXXX
	getOutputBindAsXXX
	Java "getXXXAsByteArray" methods
	check blob/lobs with binary data in them
	perl dbi driver
		execute_array
		bind_param_array
		selectall_arrayref with attr/binds
		selectall_hashref with attr/binds
		selectcol_arrayref with attr/binds
		selectrow_array with attr/binds
		selectrow_arrayref with attr/binds
		selectrow_hashref with attr/binds
		prepare_cached
		fetchall_arrayref with slice
		quote
		err
		errstr
		state
		begin_work
		available_drivers
		data_sources
	oldmysql test files for non-C++ api's

Documentation:
	* timequeries parameter
	* how to use new features of Tony/Erik's perl dbi patch
	* getting started with odbc
	* "how sqlrelay works" with diagrams and animations
	* example sqlrelay.conf's for different configurations
	* performance benchmark charts

Performance/Code Enhancements:
	* db2 first query fails and forces relogin unless detached first
		which causes problems if reloginatstart is not set
		using tcp connections fixes this but is slower
	* Don't fork listener children, use listen() backlog instead
		linux:
			looks like max is 128 on linux 2.0
			2.2/2.4 - /proc/sys/net/ipv4/tcp_max_syn_backlog
				Default is 1024 for systems with more than 128Mb
				of memory, and 128 for low memory machines.
				If you make it greater than 1024, change
				TCP_SYNQ_HSIZE in include/net/tcp.h to keep
				TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog
				and recompile kernel.
			syn cookies - no max backlog
		solaris:
			/usr/sbin/ndd -set /dev/tcp tcp_conn_req_max 32
	* perl apis -> CPAN
	* if a client connects and the forked listener ends up waiting for a
		connection and the client disconnects, the forked listener has
		no way of knowing that the client has disconnected and can't
		bail
	* semop's can return ENOSPC if the undo list is full which is unhandled
		and causes deadlocks in the sqlr-listeners.  If we get an
		ENOSPC, then we need to send the client an error and the
		sqlr-listener needs to exit.
	* Need to find a way to make connections bleed off.
		If connections=100 and maxconnections=200 and there are
		consistently 150 clients, then the # of connections needs to
		bleed back down to 150 eventually.  Currently, if a spike
		causes it to jump up to 200, then almost all 200 will end up
		staying alive.
	* Need to find a way to re-distribute connections.
		If 2 db's go down and 2nd comes back up first, all log into 2nd
		db and never log out and back into first
	* query router "do something"'s
	* reset autocommit state when new client logs into sqlrelay
	* NLS_LANG-like issues with other db's?
	* client connect timeout
	* store passwords in encrypted form in the config file
	* call endSession() from perl DBD finish method
	* implement column flags as a bitmap
	* persistent cursors - parse query, attach an id to it,
				make it available to other sessions
	* connection daemons could put buffers in shared memory and
		clients could send queries, access buffers using 
		shared memory and semaphores instead of unix sockets
	* api methods to use preallocated buffers for result sets
	* api methods for configuring optimistic buffer sizes
	* result set compression during transmission for distant relays
	* server side result set caching
	* support batch DML in oracle8
	* for databases that can return non-strings in their result sets, 
		send non strings to client
	* seperate modules into standalone builds
	* should be a single sqlr-connection daemon that dlopens the
		appropriate database module 
	* login errors should be printed on the screen by sqlrconnection class,
		not by individual connections
	* api for running queries in the background
		(asynchronous queries w/timeouts)
	* use async queries by default, even if the client runs a synchronous
		query, so the query can be cancelled if the client disconnects
	* support freetds/sybase ct_con_prop/encryption
	* use bandwidth delay product to set tcp send/receive buffer sizes
	* get sid working, document
		how to:
			create db
			create user
			mysql -usiddb -psiddb siddb < siddb
			set up sqlrelay instance to talk to it
			set up another instance to use siddb instance for sid
			populate siddb
			sidparameters:
				sparam=INGRESS - perform ingress filtering
					EGRESS - perform egress filtering
					LISTEN - ???
					VERIFICATION - don't send queries to db
					PREVENTION - send queries to db if ok
				svalue=1/0

			sidingressblist - ingress blacklist
				sql_state - queries to reject
			sidingresswlist - ingress whitelist
				sql_state - queries to accept,
						overrides blacklist
			sidingressldb - ingress learning database
				parsed_sql - ???

			sidegressblist - egress blacklist
				sql_state - "parsed results" to reject
			sidegresswlist - egress whitelist
				sql_state - "parsed results" to accept
						overrides blacklist
			sidegressldb - egress learning database
				parsed_sql - ???

		what are "parsed results" - something to do with column names...

			sidlog - every query is logged here with a message
					about it

Security:
	* SSL encryption, key-based authentication

Features:
	* daemontools compatibility
	* figure out how to get the drop-in client compiled into the mysql PHP
		module like the mysql native client is
	* query router support accessing different db's by specifying a
		different user/password
	* query router support accessing different db's by specifying which
		db to use
	* make fetch buffer sizes run-time configurable for db2 and sybase
	* add "quoting method" call to api, call mysql native function,
		(mysql_escape_string()/mysql_real_escape_string())
	* not sure about other db's
	* hack on postgresql's ecpg to emit SQL Relay code rather than
		Postgresql code
	* sqlite binds, sqlite utf-8/utf-16 functions
	* pythondb output bind variables?
	* zope bind variables?
	* 2-phase commit, use it in query router
	* use PAM if possible as alternative to defining users in sqlrelay.conf
	* support stored procedures that return result sets in interbase, db2
	* could debug logs be logrotate compatible?
	* postgresql drop-in api lacks many features
	* postgresql drop-in needs to parse out ; delimited queries for db's
		that don't support that, execute them seperately
	* mysql drop-in api lacks a few features, stmt functions need
		to be updated
	* sybase/freetds (possibly others) need options for setting chained
		mode and isolation mode when client connects
	* datatype support:
		handle binary data correctly in all databases
		identical long/lob datatype support in all databases
		more advanced long/lob datatype support
		support for array datatypes (oracle collections)
		handle blobs, quads in interbase
		handle timestamps
		handle enum types in mysql
	* front end replication
	* quotas
	* logging
	* handle commit/rollback for named transactions
	* implement API's that handle errors with exceptions
	* better transaction handling for postgresql
	* odbc connection should check the odbc definition
		for connect string arguments - SQLBrowseConnect
	* solaris init script
	* api needs to expose integer column types
	* call dontGetColumnInfo() when doing fetchrow_array calls in DBD driver
	* Some databases (like postgresql) are in auto-commit mode unless you
		manually begin a transaction.  SQL Relay calls commit/rollback
		at the end of a client session, even if the database is in
		auto-commit mode.  For postgresql at least, this is expensive.
		It should only call commit/rollback if the database isn't in
		auto-commit mode.
	* date object binds
	* DML/DDL caching - if db is down, accept queries and run them when the
		db comes back up

Availability:
	connections should ping database server every so often to make sure
		it's up, if it's not, relogin
	failover - master, fallback databases, where connection only goes to
		the fallback if the master is overloaded or down
	if a connection dies mysteriously, a new one should fire up

backends:
	pam_sqlrelay
	mod_auth_sqlrelay for apache
	samba auth module
	bind 9.1 backend
	dhcp backend
	qmail backend
	dbmail backend
	qpopper port
	bugzilla port
	litesql
	dovecot
	courier
	exim
	freeradius

API's:
	JDBC
	ODBC
	QT3
	C# - have a driver, just need to incorporate it
		look at npgsql for .net data provider example
	ADA
	Eiffel
	gnome-db
	D
	dbstep
	ADODB driver
	Ruby-on-rails adapter
	PHP MDB2 driver
	PHP PDO driver  http://wiki.cc/php/PDO
	PHP5 Creole driver

Drop-in replacement libraries:
	Oracle OCI7/8
	Sybase-ct
	Interbase

Native DB Support:
	Informix
	SAP DB
	LocalSQL
	kekedb
	ThinkSQL
	picosql
	shsql
	does clip provide an odbc driver for accessing x-base files?
	daffodildb/one$db
	LK bin DB - http://www.lksoft.cjb.net/en/
	Cache - http://intersystems.com
	Frontbase
	J-stels - stelsdbf, stelscsv (http://www.csv-jdbc.com/)
	intersystems cache db
	yard-sql
	monetdb
	valentina-db

Config Tools:
	gtk2
	QT
	curses
	need keyboard shortcuts
	size should be less than 640x480
	connectstring editor
	wizard
