GNU Smalltalk MySQL-Driver

MySQL-Driver Status: integrated into 2.0b!

Another useful thing (with a different scope than the gdbm-driver) would be a MySQL-driver. Here is a smalltalk MySQL-driver available at: http://jdmsoft.com/MysqlDriver.html. It is reengineered from the c-source of the native MySQL-client lib, so it has no need for bindings.

I tried to work with the squeak version of the driver, but I needed too much code from squeak, so I decided to start from the original driver by Josh Miller. Here they are:

Mysql-Driver.st (VisualWorks 3.0 Version)

Mysql-Driver-Tests.st (VisualWorks 3.0 Version)

Testing-Framework.st (VisualWorks 3.0 Version)

Here is my first working version. Unpack it, then adjust the parameters in mysql-test.st. Then run it with

gst -Q mysql-test.st

JdmMySQL-driver-GST.tar.gz

The hardest translation was done in JdmWriteStream? (look below). The rest was relatively simple (Adjusting socket-methods, conversion from ByteStream? to Integer, etc). An impressive example for smalltalk's power!

!JdmWriteStream methodsFor: 'accessing'!

setWritePosition: aPosition

"original code"

position _ (aPosition > writeLimit

ifTrue: [writeLimit]

ifFalse: [aPosition])! !"

"here's the trick involved:"

ptr := aPosition + 1! !

Here is a simple testscript:


 * value resultSet statement spec connection |

FileStream? fileIn: 'DB.st'.

FileStream? fileIn: 'MySQL.st'.

spec := (Jdm JdmConnectionSpec new initialize

user: 'root'; password: '';

host: 'localhost';

database: 'mysql';

port: 3306).

connection := Jdm MySQL JdmConnection? on: spec.

JdmStatement? initialize.

statement := connection createStatement.

resultSet := (statement executeQuery: 'select * from db') value.

Transcript cr; show: (resultSet columns collect: [:col | col name]) printString

[resultSet next]

whileTrue:

[

value := resultSet valueNamed: 'Db'. "get column named Db"

Transcript cr; show: value printString.

].

Transcript cr.

connection close.

ObjectMemory? quit!

The hierarchy has been refactored with respect to the original driver by Josh. His initials now are the acronym for `Just a Database Manager', so the DBMS-independent classes have been moved to the `Jdm' namespace, while the MySQL driver proper resides in `Jdm MySQL'.

Markus Fritsche and Paolo Bonzini