[PATCH] resurrect MySQL driver and update to 4.1+ protocol

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] resurrect MySQL driver and update to 4.1+ protocol

Paolo Bonzini
This resurrects the MySQL driver from the shades of time.  However, I'm
pretty sure that there won't be anything like this in 3.0.  There is
somewhere a DBI-like interface for Postgres, and it makes sense to port
the MySQL driver to it since it can't be worse than this.  I'm only
interested in converting it successfully (and hopefully Glorp too).

The MySQL package can be tested by configuring with
--enable-mysql-tests; it requires MySQL to be running with a user called
'root' and whose password is, you guessed it, 'root'.

Paolo

* looking for [hidden email]--2004b/smalltalk--devo--2.2--patch-520 to compare with
* comparing to [hidden email]--2004b/smalltalk--devo--2.2--patch-520
M  tests/testsuite.at
M  tests/local.at
M  tests/testsuite
M  packages/mysql/package.xml
M  configure.ac
M  packages/mysql/MySQL.st
M  packages/mysql/MySQLTests.st
M  packages/mysql/mysql-test.st
M  tests/Makefile.am

* modified files

--- orig/configure.ac
+++ mod/configure.ac
@@ -295,7 +295,15 @@ GST_PACKAGE_ENABLE([Iconv], [iconv],
   [Makefile], [iconv.la])
 GST_PACKAGE_ENABLE([Java], [java])
 GST_PACKAGE_ENABLE([Digest], [digest], [], [], [Makefile], [digest.la])
+
 GST_PACKAGE_ENABLE([MySQL], [mysql])
+AC_MSG_CHECKING([whether to run MySQL tests])
+AC_ARG_ENABLE(mysql-tests,
+[  --enable-mysql-tests   test MySQL bindings, require user "root" with
+                          password "root", plus database "test"], ,
+[enable_mysql_tests=no])
+AC_SUBST(enable_mysql_tests)
+
 GST_PACKAGE_ENABLE([NCurses],
   [ncurses],
   [GST_HAVE_LIB(ncurses, initscr)],
@@ -400,6 +408,7 @@ dnl Scripts & data files
 AC_CONFIG_FILES(gnu-smalltalk.pc)
 AC_CONFIG_FILES(gst-config, chmod +x gst-config)
 AC_CONFIG_FILES(tests/gst, chmod +x tests/gst)
+AC_CONFIG_FILES(tests/atlocal)
 AC_CONFIG_FILES(libc.la)
 
 dnl Master Makefile


--- orig/packages/mysql/MySQL.st
+++ mod/packages/mysql/MySQL.st
@@ -73,14 +73,14 @@ Object subclass: #JdmMysqlCommand
 
 
 Jdm.JdmConnection subclass: #JdmConnection
- instanceVariableNames: 'socket readStream writeStream hashesByProtocol responsePacket clientCapabilities '
+ instanceVariableNames: 'socket readStream writeStream hashesByProtocol responsePacket '
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Mysql-Driver'!
 
 
 Jdm.JdmServerInfo subclass: #JdmServerInfo
- instanceVariableNames: 'protocol serverThread hashSeed options '
+ instanceVariableNames: 'protocol serverThread charset status hashSeed options '
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Mysql-Driver'!
@@ -113,7 +113,7 @@ Object subclass: #JdmTimestampWriter
  category: 'Mysql-Driver'!
 
 Jdm.JdmColumn subclass: #JdmColumn
- instanceVariableNames: ''
+ instanceVariableNames: 'charset'
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Mysql-Driver'!
@@ -159,7 +159,7 @@ nextPutAllNullTerminated: aCollection2
 
 nextPutCommand: aCommand
  self
- nextPut: aCommand command asCharacter;
+ nextPut: (Character value: aCommand command);
  nextPutAllNullTerminated: aCommand message!
 
 outputPacket
@@ -300,9 +300,6 @@ initialize
 
 initializeConnection
     | messageText |
-    hashesByProtocol := self class dictionaryClass: Dictionary
-   from: self class protocolHashes.
-
     socket := TCP.Socket remote: connectionSpec host port: connectionSpec port.
     "socket := [ TCP Socket remote: connectionSpec host port: connectionSpec port ]
  on: Error
@@ -313,7 +310,7 @@ initializeConnection
     readStream := socket.
     writeStream := socket.
     serverInfo := JdmServerInfo on: self.
-    clientCapabilities := serverInfo protocol = 10 ifTrue: [1] ifFalse: [0]!
+!
 
 initializeDatabase
     (self requestPacket writeStream)
@@ -322,46 +319,53 @@ initializeDatabase
  flush.
     self responsePacket checkStatusOnError: #setDatabase!
 
+oldProtocolHashes
+    connectionSpec password isEmpty ifTrue: [ ^'' ].
+    ^{ self hash2: connectionSpec password seed: self serverInfo hashSeed }!
+
+newProtocolHashes
+    connectionSpec password isEmpty ifTrue: [ ^String new: 1 ].
+    ^{ self hashSHA1: connectionSpec password seed: self serverInfo hashSeed.
+       self hash2: connectionSpec password seed: self serverInfo hashSeed }!
+
 initializeUser
-    | replyStream password |
-    password := connectionSpec password isEmpty
- ifTrue: ['']
- ifFalse:
-    [self
- hash: connectionSpec password
- seed: self serverInfo hashSeed
- for: self serverInfo protocol].
-    
+    | replyStream hashes userSent longPassword |
     replyStream := self replyPacket writeStream.
-
-    replyStream
- nextPutAll: (self class integerAsByteArray: (self clientCapabilities) length: 2) asByteString;
- nextPutAll: (self class integerAsByteArray: 65536 length: 3) asByteString;
- nextPutAllNullTerminated: connectionSpec user;
- nextPutAllNullTerminated: password.
-    replyStream flush.
+    serverInfo hashSeed size = 8
+ ifTrue: [
+    hashes := self oldProtocolHashes.
+    replyStream
+        nextPutAll: (self class integerAsByteArray: 1 length: 2) asByteString;
+        nextPutAll: (self class integerAsByteArray: 65536 length: 3) asByteString;
+        nextPutAllNullTerminated: connectionSpec user;
+ nextPutAllNullTerminated: hashes first;
+ flush ]
+ ifFalse: [
+    hashes := self newProtocolHashes.
+    replyStream
+        nextPutAll: (self class integerAsByteArray: 41477 length: 4) asByteString;
+        nextPutAll: (self class integerAsByteArray: 65536 length: 4) asByteString;
+        nextPut: 8 asCharacter;
+        next: 23 put: 0 asCharacter;
+        nextPutAllNullTerminated: connectionSpec user;
+ nextPut: hashes first size asCharacter;
+ nextPutAll: hashes first;
+         flush.
   
-    self responsePacket checkStatusOnError: #authenticate! !
+    (self responsePacket isStatus: 254 onError: #authenticate) ifTrue: [
+ replyStream := self replyPacket writeStream.
+ replyStream nextPutAll: hashes second; flush ] ]! !
 
 !JdmConnection methodsFor: 'hashing'!
 
-getHashFor: aProtocol
- ^hashesByProtocol at: aProtocol ifAbsent: [nil]!
-
-hash: aString seed: aSeed for: aProtocol
- | aHashMethod |
- aHashMethod := self getHashFor: aProtocol.
- aHashMethod isNil ifTrue: [^aString].
+hash: aString seed: aSeed for: hashMethod
  ^self class
- perform: aHashMethod
+ perform: hashMethod
  with: aString
  with: aSeed! !
 
 !JdmConnection methodsFor: 'accessing'!
 
-clientCapabilities
- ^clientCapabilities!
-
 replyPacket
  ^(JdmOutputPacket on: writeStream)
  packetNumber: responsePacket packetNumber + 1!
@@ -378,42 +382,44 @@ JdmConnection class
  instanceVariableNames: ''!
 
 
-!JdmConnection class methodsFor: 'constants'!
-
-protocolHashes
- ^#(9 #hash1:seed:
-          10 #hash2:seed:)! !
-
-!JdmConnection class methodsFor: 'hashing'!
+!JdmConnection methodsFor: 'hashing'!
 
-hash1: aString seed: aSeed
- "This algorithm is for protocol 9."
+hashSHA1: aString seed: aSeed
+ "This algorithm is for MySQL 4.1+."
 
- | hashedString maxValue array num1 num2 |
- hashedString := String new: aSeed size.
- array := self randomInit1: aString seed: aSeed.
- maxValue := array at: 1.
- num1 := array at: 2.
- num2 := array at: 3.
- 1 to: hashedString size
- do:
- [:index |
- | num3 |
- num1 := (num1 * 3 + num2) \\ maxValue.
- num2 := (num1 + num2 + 33) \\ maxValue.
- num3 := (num1 / maxValue * 31) truncated + 64.
- hashedString at: index put: num3 asCharacter].
- ^hashedString!
+ | hashedString hashedStringSeeded result |
+ "Compute hash1 = SHA1(password), then hash2 = SHA1(hash1). The server
+ already knows this, as that is what is held in its password table
+ (preceded with a *)."
+
+ hashedString := SHA1 digestOf: aString.
+ hashedStringSeeded := SHA1 digestOf: hashedString.
+
+ "Append hash2 to the salt sent by the server and hash that."
+ hashedStringSeeded := SHA1 digestOf: aSeed, hashedStringSeeded.
+
+ "Finally, XOR the result with SHA1(password).  The server takes this,
+ computes SHA1(salt.`SHA1 stored in DB`), uses the latter result to
+ undo the XOR, computes again SHA1, and compares that with the SHA1
+ stored in the DB."
+
+ result := String new: 20.
+ 1 to: 20 do: [ :i |
+    result at: i put: (Character value:
+ ((hashedString at: i) bitXor: (hashedStringSeeded at: i))) ].
+ ^result!
 
-hash2: aString seed: aSeed
- "This algorithm is for clientProtocol 10."
+hash2: aString seed: longSeed
+ "This algorithm is for MySQL 3.22+."
 
- | hashedString maxValue result num1 num2 num3 |
+ | hashedString maxValue result num1 num2 num3 aSeed |
+ "Reserve a final byte for NULL termination"
+ aSeed := longSeed copyFrom: 1 to: 8.
  hashedString := String new: aSeed size.
  result := self randomInit2: aString seed: aSeed.
- maxValue := result at: 1.
- num1 := result at: 2.
- num2 := result at: 3.
+ maxValue := 16r3FFFFFFF.
+ num1 := result at: 1.
+ num2 := result at: 2.
  1 to: hashedString size
  do:
  [:index |
@@ -424,11 +430,10 @@ hash2: aString seed: aSeed
  num1 := (num1 * 3 + num2) \\ maxValue.
  num2 := (num1 + num2 + 33) \\ maxValue.
  num3 := (num1 / maxValue * 31) truncated.
- hashedString inject: 1
- into:
- [:index :character |
- hashedString at: index put: (character asInteger bitXor: num3) asCharacter.
- index + 1].
+ hashedString keysAndValuesDo: [:index :character |
+ hashedString
+ at: index
+ put: (character asInteger bitXor: num3) asCharacter].
  ^hashedString!
 
 hash: aString
@@ -450,24 +455,13 @@ hash: aString
  num3 := num3 + charValue]].
  ^Array with: (num1 bitAnd: 2147483647) with: (num2 bitAnd: 2147483647)!
 
-randomInit1: aString seed: aSeed
- | result array1 array2 |
- result := Array new: 3.
- array1 := self hash: aString.
- array2 := self hash: aSeed.
- result at: 1 put: 16r01FFFFFF.
- result at: 2 put: ((array1 at: 1) bitXor: (array2 at: 1)) \\ (result at: 1).
- result at: 3 put: (result at: 2) // 2.
- ^result!
-
 randomInit2: aString seed: aSeed
  | result array1 array2 |
- result := Array new: 3.
+ result := Array new: 2.
  array1 := self hash: aString.
  array2 := self hash: aSeed.
- result at: 1 put: 16r3FFFFFFF.
- result at: 2 put: ((array1 at: 1) bitXor: (array2 at: 1)) \\ (result at: 1).
- result at: 3 put: ((array1 at: 2) bitXor: (array2 at: 2)) \\ (result at: 1).
+ result at: 1 put: ((array1 at: 1) bitXor: (array2 at: 1)) \\ 16r3FFFFFFF.
+ result at: 2 put: ((array1 at: 2) bitXor: (array2 at: 2)) \\ 16r3FFFFFFF.
  ^result! !
 
 !JdmConnection class methodsFor: 'misc'!
@@ -505,7 +499,7 @@ byteArrayAsByteString: ba
     size := ba size.
     s := String new: size.
     1 to: size do: [:index |
- s at: index put: ((ba at: index) asCharacter).
+ s at: index put: (Character value: (ba at: index)).
  ].
     ^s! !
 
@@ -573,6 +567,9 @@ initialize
 
 !JdmInputPacket methodsFor: 'reading'!
 
+isStatus: anInteger onError: aSymbol
+ ^(self readStatusOnError: aSymbol) = anInteger!
+
 checkForStatus: anInteger onError: aSymbol
  (self readStatusOnError: aSymbol) = anInteger ifFalse: [self handleError: aSymbol]!
 
@@ -647,8 +644,7 @@ flush
  s := JdmConnection byteArrayAsByteString: ba.
  aString replaceFrom: 1 to: self class sizeSize with: s startingAt: 1.
 
- aString at: self class sizeSize + 1 put: self packetNumber asCharacter.
-
+ aString at: self class sizeSize + 1 put: (Character value: self packetNumber).
  (self stream) nextPutAll: aString; flush
 ! !
 
@@ -761,6 +757,18 @@ initialize
 
 !JdmServerInfo methodsFor: 'accessing'!
 
+charset
+ ^charset!
+
+charset: anObject
+ charset := anObject!
+
+status
+ ^status!
+
+status: anObject
+ status := anObject!
+
 hashSeed
  ^hashSeed!
 
@@ -794,11 +802,26 @@ readFrom: aResponsePacket
  readServerVersionFrom: aResponsePacket;
  readServerThreadFrom: aResponsePacket;
  readHashSeedFrom: aResponsePacket;
- readOptionsFrom: aResponsePacket!
+ readOptionsFrom: aResponsePacket.
+ aResponsePacket readStream atEnd ifFalse: [
+ self
+ readCharsetFrom: aResponsePacket;
+ readStatusFrom: aResponsePacket;
+ readMoreSeedFrom: aResponsePacket ]!
+
+readStatusFrom: aResponsePacket
+ status := (aResponsePacket readStream next: 2) asByteArray asInteger.
+ aResponsePacket readStream next: 13!
+
+readCharsetFrom: aResponsePacket
+ charset := aResponsePacket readStream next value!
 
 readHashSeedFrom: aResponsePacket
  hashSeed := aResponsePacket readStream readNullTerminatedString!
 
+readMoreSeedFrom: aResponsePacket
+ hashSeed := hashSeed, aResponsePacket readStream readNullTerminatedString!
+
 readOptionsFrom: aResponsePacket
  options := (aResponsePacket readStream next: 2) asByteArray asInteger!
 
@@ -809,7 +832,9 @@ readServerThreadFrom: aResponsePacket
  serverThread := (aResponsePacket readStream next: 4) asByteArray asInteger!
 
 readServerVersionFrom: aResponsePacket
- serverVersion := JdmServerVersion readFrom: aResponsePacket readStream! !
+ serverVersion := JdmServerVersion
+    readFrom: aResponsePacket readStream readNullTerminatedString readStream.
+! !
 
 !JdmServerInfo methodsFor: 'validation'!
 
@@ -848,7 +873,7 @@ readFrom: aStream
  release := Integer readFrom: aStream.
  aStream next.
  version := Integer readFrom: aStream.
- aStream readNullTerminatedString! !
+! !
 
 !JdmServerVersion class methodsFor: 'instance creation'!
 
@@ -929,12 +954,17 @@ readMysqlTimeFrom: aStream
  ^Time fromSeconds: 60 * (60 * hour + minute) + second!
 
 readMysqlTimestampFrom: aStream
- | year month day hour minute second |
+ | year month day hour minute second separators |
  year := self readIntegerFrom: aStream next: 4.
+ separators := aStream peekFor: $-.
  month := self readIntegerFrom: aStream next: 2.
+ separators ifTrue: [ aStream next ].
  day := self readIntegerFrom: aStream next: 2.
+ separators ifTrue: [ aStream next ].
  hour := self readIntegerFrom: aStream next: 2.
+ separators ifTrue: [ aStream next ].
  minute := self readIntegerFrom: aStream next: 2.
+ separators ifTrue: [ aStream next ].
  second := self readIntegerFrom: aStream next: 2.
  ^JdmDateTime
  fromDate: (Date newDay: day monthIndex: month year: year)
@@ -982,37 +1012,62 @@ print: anInteger on: aStream next: n
 
 !JdmColumn methodsFor: 'reading'!
 
+charset
+ ^charset
+! !
+
+!JdmColumn methodsFor: 'reading'!
+
 readDecimalPlaces: aReadStream
  decimalPlaces := aReadStream next asInteger!
 
 readFlags: aReadStream
- "Currently the size of both the flags field and decimalPlaces field is specified as a sum of the two.
-        I am guessing that the size of the flags is more likely to change than that of the decimalPlaces.
-        Right now I assume that the flags are all bytes but the last and that the last is the decimalPlaces"
-
- flags := (aReadStream next: aReadStream next asInteger - 1) asByteArray
- asInteger!
+ flags := (aReadStream next: 2) asByteArray asInteger!
 
 readFrom: aReadStream
- self
- readTable: aReadStream;
- readName: aReadStream;
- readSize: aReadStream;
- readType: aReadStream;
- readFlags: aReadStream;
- readDecimalPlaces: aReadStream!
+ | length fields |
+ "can be catalogue, db, table, org table, field (and org field follows)
+ or table, field, length, type, flags+decimal"
+ fields := (1 to: 5) collect: [ :i |
+ aReadStream next: aReadStream next asInteger ].
+ aReadStream atEnd ifFalse: [
+ table := fields at: 3.
+ name := fields at: 5.
+ "org field"
+ aReadStream next: aReadStream next asInteger.
+ length := aReadStream next asInteger - 10.
+ self
+ readCharset: aReadStream;
+ readSize: aReadStream;
+ readType: aReadStream;
+ readFlags: aReadStream;
+ readDecimalPlaces: aReadStream.
+ aReadStream next: length.
+ ^self ].
+
+ "MySQL 3.x format."
+ table := fields at: 1.
+ name := fields at: 2.
+ size := (fields at: 3) asByteArray asInteger.
+ type := (fields at: 4) first asInteger.
+ self readFlags: (fields at: 5) readStream.
+ decimalPlaces := (fields at: 5) last asInteger!
+
+
+readCharset: aReadStream
+ charset := (aReadStream next: 2) asByteArray asInteger!
 
 readName: aReadStream
  name := (aReadStream next: aReadStream next asInteger)!
 
 readSize: aReadStream
- size := (aReadStream next: aReadStream next asInteger) asByteArray asInteger!
+ size := (aReadStream next: 4) asByteArray asInteger!
 
 readTable: aReadStream
  table := (aReadStream next: aReadStream next asInteger)!
 
 readType: aReadStream
- type := (aReadStream next: aReadStream next asInteger) asByteArray asInteger! !
+ type := aReadStream next asInteger! !
 "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
 
 JdmColumn class
@@ -1030,8 +1085,11 @@ datetimeType
 dateType
  ^10!
 
+oldDecimalType
+ ^246!
+
 decimalType
- ^0!
+ ^246!
 
 doubleType
  ^5!
@@ -1135,23 +1193,20 @@ readFrom: aReadStream
 checkForEndOrNull: aReadStream
  "This is a bit unclean...the value 254 has been overloaded in the protocol.  When it is the only
         value in the stream, it indicates there are no more rows.  It also indicates that the following
-        4 bytes contain the size of the field value.  The problem is that there is another condition that
+        8 bytes contain the size of the field value.  The problem is that there is another condition that
         produces a single value on the stream...a row with one column whose value is NULL."
 
  | endOrNull |
- aReadStream size = 1 ifFalse: [^false].
- endOrNull := aReadStream next asInteger.
- endOrNull = 254
- ifTrue:
- [isEmpty := true.
- ^true].
- endOrNull = 251
- ifTrue:
- [^true].
- "Unexpected Value"
- JdmErrorTable throwException: #invalidQuery
- message: 'Unexpected value ' , endOrNull printString.
- ^true!
+ aReadStream size = 1 ifTrue: [
+ endOrNull := aReadStream next asInteger.
+ isEmpty := endOrNull = 254.
+ ^true ].
+ (aReadStream size < 9 and: [ aReadStream peekFor: (Character value: 254) ])
+ ifTrue: [
+ aReadStream next: aReadStream size - 1.
+ isEmpty := true.
+ ^true ].
+ ^false !
 
 readFrom: aReadStream
  (self checkForEndOrNull: aReadStream) ifTrue: [^self].
@@ -1170,7 +1225,9 @@ readSizeFrom: aReadStream
  aSize := aReadStream next asInteger.
  aSize < 251 ifTrue: [^aSize].
  aSize = 251 ifTrue: [^-1].
- ^(aReadStream next: (aSize bitAnd: 3) + 2) asByteArray asInteger! !
+ aSize = 252 ifTrue: [^(aReadStream next: 2) asByteArray asInteger].
+ aSize = 253 ifTrue: [^(aReadStream next: 3) asByteArray asInteger].
+ aSize = 254 ifTrue: [^(aReadStream next: 8) asByteArray asInteger]! !
 
 !JdmRow methodsFor: 'initialize-release'!
 
@@ -1369,6 +1426,7 @@ buildTypeMap
  at: JdmColumn longlongType put: #toInteger:column:;
  at: JdmColumn floatType put: #toFloat:column:;
  at: JdmColumn doubleType put: #toDouble:column:;
+ at: JdmColumn oldDecimalType put: #toDouble:column:;
  at: JdmColumn decimalType put: #toDouble:column:;
  at: JdmColumn dateType put: #toDate:column:;
  at: JdmColumn datetimeType put: #toDateTime:column:;
@@ -1413,7 +1471,7 @@ asByteString
     | stream |
     stream := WriteStream on: String new.
     1 to: self size do: [ :x |
- stream nextPut: (self basicAt: x) asCharacter].
+ stream nextPut: (Character value: (self basicAt: x))].
     ^stream contents
 ! !
 


--- orig/packages/mysql/MySQLTests.st
+++ mod/packages/mysql/MySQLTests.st
@@ -29,9 +29,6 @@
 |
  ======================================================================"
 
-Jdm addSubspace: #MySQL!
-Namespace current: Jdm.MySQL!
-
 TestCase subclass: #JdmMysqlBaseTestCase
  instanceVariableNames: 'connection testSupport testProgress '
  classVariableNames: ''
@@ -127,17 +124,25 @@ createTable
  Transcript show: 'Creating table: ', testSupport class tableName, '...'.
  result := connection createStatement
  executeQuery: testSupport createTable.
- Transcript show: ' Done'.
+ Transcript show: ' Done'; nl.
  self should: [result type = #update and: [result value = 0]]! !
 
 !JdmMysqlDropTableTestCase methodsFor: 'tests'!
 
+dropTableIfExists
+ | result |
+ Transcript show: 'Dropping table: ', testSupport class tableName, '...'.
+ result := connection createStatement
+ executeQuery: 'drop table if exists ' , testSupport class tableName.
+ Transcript show: ' Done'; nl.
+ self should: [result type = #update and: [result value = 0]]!
+
 dropTable
  | result |
  Transcript show: 'Dropping table: ', testSupport class tableName, '...'.
  result := connection createStatement
  executeQuery: 'drop table ' , testSupport class tableName.
- Transcript show: ' Done'.
+ Transcript show: ' Done'; nl.
  self should: [result type = #update and: [result value = 0]]! !
 
 !JdmMysqlDeleteTestCase methodsFor: 'tests'!
@@ -148,8 +153,9 @@ deleteRows
  show: 'Deleting ' , testSupport class numRowsToInsert printString , ' rows...'.
  result := connection createStatement
  executeQuery: 'delete from ' , testSupport class tableName.
- Transcript show: ' Done'.
- self should: [result type = #update and: [result value = 0]]! !
+ Transcript show: ' Done'; nl.
+ "Value is either 0 or numRowsToInsert, depending on the version"
+ self should: [result type = #update]! !
 
 !JdmMysqlInsertTestCase methodsFor: 'tests'!
 
@@ -169,7 +175,7 @@ insertRows
  ok := true.
  testSupport class numRowsToInsert timesRepeat: [
  result := self insertRow.
- ok := ok and: [result type = #update and: [result value = 1]].
+ ok := ok and: [result type = #update "and: [result value = 1]"].
  ].
  self should: [ ok ]! !
 
@@ -246,7 +252,7 @@ writeFieldDefinitionFor: aType on: aWrit
 connectionSpec
  ^JdmConnectionSpec new
  initialize;
- user: 'utente'; password: '';
+ user: 'root'; password: 'root';
  host: 'localhost'; database: 'test';
  port: 3306; yourself!
 
@@ -498,7 +504,7 @@ resetMysqlTestSupport
 !JdmMysqlTestSupport class methodsFor: 'constants'!
 
 numRowsToInsert
- ^500!
+ ^40!
 
 tableName
  ^'JdmMysqlTestTable'! !
@@ -587,7 +593,7 @@ checkSteps
  totalSteps = numSteps
  ifTrue:
  [Transcript
- show: ' Done']! !
+ show: ' Done'; nl]! !
 
 !JdmTestProgress methodsFor: 'accessing'!
 
@@ -636,6 +642,7 @@ defaultResolution
 initialize
 " super initialize."
  self name: 'JdmMysql-Test'.
+ self addTest: (JdmMysqlDropTableTestCase selector: #dropTableIfExists).
  self addTest: (JdmMysqlCreateTableTestCase selector: #createTable).
  self addTest: (JdmMysqlInsertTestCase selector: #insertRows).
  self addTest: (JdmMysqlSelectTestCase selector: #selectRows).
@@ -645,7 +652,7 @@ initialize
 
 !JdmMysqlTestSuite class methodsFor: 'instance creation'!
 
-new
+suite
  ^super new initialize! !
 
 !JdmMysqlTestSupport methodsFor: 'private'!
@@ -941,11 +948,8 @@ resetMysqlTestSupport
 !JdmMysqlTestSupport class methodsFor: 'constants'!
 
 numRowsToInsert
- ^500!
+ ^40!
 
 tableName
  ^'JdmMysqlTestTable'! !
 
-Namespace current: Smalltalk!
-
-


--- orig/packages/mysql/mysql-test.st
+++ mod/packages/mysql/mysql-test.st
@@ -5,11 +5,12 @@
 |
  ======================================================================"
 
-| value resultSet statement spec connection |
+PackageLoader fileInPackage: #MySQL!
 
+| value resultSet statement spec connection |
 spec :=    (Jdm.JdmConnectionSpec new initialize
-        user: 'root'; password: '';
-        host: 'philo';
+        user: 'root'; password: 'root';
+        host: 'localhost';
         database: 'mysql';
         port: 3306).
 


--- orig/packages/mysql/package.xml
+++ mod/packages/mysql/package.xml
@@ -4,8 +4,13 @@
   <prereq>DB</prereq>
   <prereq>TCP</prereq>
   <prereq>SUnit</prereq>
+  <prereq>Digest</prereq>
   <filein>MySQL.st</filein>
-  <filein>MySQLTests.st</filein>
+
+  <test>
+    <sunit>Jdm.MySQL.JdmMysqlTestSuite</sunit>
+    <filein>MySQLTests.st</filein>
+  </test>
 
   <file>MySQL.st</file>
   <file>MySQLTests.st</file>


--- orig/tests/Makefile.am
+++ mod/tests/Makefile.am
@@ -4,7 +4,7 @@ AUTOTEST = $(AUTOM4TE) --language=autote
 TESTSUITE = $(srcdir)/testsuite
 
 dist_noinst_DATA = \
-local.at testsuite.at $(TESTSUITE) package.m4 \
+atlocal.in local.at testsuite.at $(TESTSUITE) package.m4 \
 ackermann.ok ackermann.st arrays.ok arrays.st ary3.ok ary3.st blocks.ok \
 blocks.st chars.ok chars.st classes.ok classes.st cobjects.ok cobjects.st \
 compiler.ok compiler.st dates.ok dates.st delays.ok delays.st except.ok \
@@ -45,13 +45,13 @@ $(srcdir)/package.m4: $(top_srcdir)/conf
     echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \
   } >'$(srcdir)/package.m4'
 
-check-local: gst atconfig $(TESTSUITE)
+check-local: gst atlocal atconfig $(TESTSUITE)
  $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
 
 clean-local:
  -$(SHELL) '$(TESTSUITE)' --clean
 
-installcheck-local: atconfig $(TESTSUITE)
+installcheck-local: atlocal atconfig $(TESTSUITE)
  if test -z "$(DESTDIR)"; then \
   $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS) AUTOTEST_PATH=$(bindir); \
  fi


--- orig/tests/local.at
+++ mod/tests/local.at
@@ -40,24 +40,26 @@ m4_define([AT_DIFF_TEST], [
   AT_CLEANUP
 ])
 
-dnl AT_PACKAGE_TEST([PACKAGE], [XFAILS])
-dnl ------------------------------------
+dnl AT_PACKAGE_TEST([PACKAGE], [XFAILS], [CLASSES], [CONDITION])
+dnl ------------------------------------------------------------
 m4_define([AT_PACKAGE_TEST], [
   AT_SETUP([$1])
   AT_KEYWORDS([m4_if([$1], [SUnit], [], [$1 ])SUnit])
   $2
-  AT_CHECK_GST([-f $abs_top_srcdir/scripts/Test.st --verbose -p $1], [], [], [ignore])
+  m4_ifval([$4], [AT_CHECK([$4 || exit 77])])
+  AT_CHECK_GST([-f $abs_top_srcdir/scripts/Test.st --verbose -p $1 $3], [], [], [ignore])
   AT_CLEANUP
 ])
 
-dnl AT_OPTIONAL_PACKAGE_TEST([PACKAGE], [XFAILS])
-dnl ---------------------------------------------
+dnl AT_OPTIONAL_PACKAGE_TEST([PACKAGE], [XFAILS], [CLASSES], [CONDITION])
+dnl ---------------------------------------------------------------------
 dnl Returns exit code 77 (skip) if the package cannot be loaded.
 m4_define([AT_OPTIONAL_PACKAGE_TEST], [
   AT_SETUP([$1])
   AT_KEYWORDS([$1 SUnit])
   $2
-  AT_CHECK_GST([-f $abs_top_srcdir/scripts/Test.st --verbose -p $1
+  m4_ifval([$4], [AT_CHECK([$4 || exit 77])])
+  AT_CHECK_GST([-f $abs_top_srcdir/scripts/Test.st --verbose -p $1 $3
     ret=$?
     case $ret in
       2) exit 77 ;;


--- orig/tests/testsuite
+++ mod/tests/testsuite
@@ -620,7 +620,7 @@ at_times_file=$at_suite_dir/at-times
 # List of the tested programs.
 at_tested='gst'
 # List of the all the test groups.
-at_groups_all=' banner-1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 banner-2 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 banner-3 41 42 banner-4 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 banner-5 108 109 110 111 112 113 114 115'
+at_groups_all=' banner-1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 banner-2 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 banner-3 41 42 banner-4 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 banner-5 108 109 110 111 112 113 114 115 116'
 # As many question marks as there are digits in the last test group number.
 # Used to normalize the test group numbers so that `ls' lists them in
 # numerical order.
@@ -740,7 +740,8 @@ at_help_all="1;testsuite.at:27;arrays.st
 112;testsuite.at:146;Digest;Digest SUnit;
 113;testsuite.at:147;GDBM;GDBM SUnit;
 114;testsuite.at:148;Iconv;Iconv SUnit;
-115;testsuite.at:149;ZLib;ZLib SUnit;
+115;testsuite.at:149;MySQL;MySQL SUnit;
+116;testsuite.at:150;ZLib;ZLib SUnit;
 "
 
 at_prev=
@@ -4076,19 +4077,20 @@ _ATEOF
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
   esac
 
-  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:71: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p SUnit); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo "$at_srcdir/testsuite.at:71: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p SUnit ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
 echo testsuite.at:71 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
-    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
         *'
 '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
  *) at_trace_this=yes ;;
@@ -4096,12 +4098,12 @@ if test -n "$at_traceon"; then
 fi
 
 if test -n "$at_trace_this"; then
-    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
     at_status=$?
     grep '^ *+' "$at_stder1" >&2
     grep -v '^ *+' "$at_stder1" >"$at_stderr"
 else
-    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p SUnit ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
     at_status=$?
 fi
 
@@ -4143,19 +4145,20 @@ $at_traceon
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
   esac
 
-  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:72: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Parser); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo "$at_srcdir/testsuite.at:72: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Parser ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
 echo testsuite.at:72 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
-    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
         *'
 '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
  *) at_trace_this=yes ;;
@@ -4163,12 +4166,12 @@ if test -n "$at_traceon"; then
 fi
 
 if test -n "$at_trace_this"; then
-    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
     at_status=$?
     grep '^ *+' "$at_stder1" >&2
     grep -v '^ *+' "$at_stder1" >"$at_stderr"
 else
-    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Parser ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
     at_status=$?
 fi
 
@@ -8583,19 +8586,20 @@ _ATEOF
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
   esac
 
-  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:142: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Complex); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo "$at_srcdir/testsuite.at:142: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Complex ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
 echo testsuite.at:142 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
-    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
         *'
 '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
  *) at_trace_this=yes ;;
@@ -8603,12 +8607,12 @@ if test -n "$at_traceon"; then
 fi
 
 if test -n "$at_trace_this"; then
-    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
     at_status=$?
     grep '^ *+' "$at_stder1" >&2
     grep -v '^ *+' "$at_stder1" >"$at_stderr"
 else
-    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Complex ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
     at_status=$?
 fi
 
@@ -8650,19 +8654,20 @@ $at_traceon
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
   esac
 
-  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:143: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Continuations); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo "$at_srcdir/testsuite.at:143: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Continuations ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
 echo testsuite.at:143 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
-    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
         *'
 '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
  *) at_trace_this=yes ;;
@@ -8670,12 +8675,12 @@ if test -n "$at_traceon"; then
 fi
 
 if test -n "$at_trace_this"; then
-    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
     at_status=$?
     grep '^ *+' "$at_stder1" >&2
     grep -v '^ *+' "$at_stder1" >"$at_stderr"
 else
-    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Continuations ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
     at_status=$?
 fi
 
@@ -8717,19 +8722,20 @@ $at_traceon
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
   esac
 
-  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:144: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p DebugTools); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo "$at_srcdir/testsuite.at:144: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p DebugTools ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
 echo testsuite.at:144 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
-    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
         *'
 '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
  *) at_trace_this=yes ;;
@@ -8737,12 +8743,12 @@ if test -n "$at_traceon"; then
 fi
 
 if test -n "$at_trace_this"; then
-    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
     at_status=$?
     grep '^ *+' "$at_stder1" >&2
     grep -v '^ *+' "$at_stder1" >"$at_stderr"
 else
-    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DebugTools ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
     at_status=$?
 fi
 
@@ -8784,19 +8790,20 @@ $at_traceon
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
   esac
 
-  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:145: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo "$at_srcdir/testsuite.at:145: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
 echo testsuite.at:145 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
-    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
         *'
 '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
  *) at_trace_this=yes ;;
@@ -8804,12 +8811,12 @@ if test -n "$at_traceon"; then
 fi
 
 if test -n "$at_trace_this"; then
-    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
     at_status=$?
     grep '^ *+' "$at_stder1" >&2
     grep -v '^ *+' "$at_stder1" >"$at_stderr"
 else
-    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p DhbNumericalMethods ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
     at_status=$?
 fi
 
@@ -8851,19 +8858,20 @@ $at_traceon
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
   esac
 
-  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:146: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Digest); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo "$at_srcdir/testsuite.at:146: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p Digest ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
 echo testsuite.at:146 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
-    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
         *'
 '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
  *) at_trace_this=yes ;;
@@ -8871,12 +8879,12 @@ if test -n "$at_traceon"; then
 fi
 
 if test -n "$at_trace_this"; then
-    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
     at_status=$?
     grep '^ *+' "$at_stder1" >&2
     grep -v '^ *+' "$at_stder1" >"$at_stderr"
 else
-    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p Digest ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
     at_status=$?
 fi
 
@@ -8918,6 +8926,7 @@ $at_traceon
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
@@ -9001,6 +9010,7 @@ $at_traceon
 
 
 
+
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
     *) image_path="" ;;
@@ -9071,10 +9081,10 @@ $at_traceon
     at_status=`cat "$at_status_file"`
     ;;
 
-  115 ) # 115. testsuite.at:149: ZLib
+  115 ) # 115. testsuite.at:149: MySQL
     at_setup_line='testsuite.at:149'
-    at_desc="ZLib"
-    $at_quiet $ECHO_N "115: ZLib                                           $ECHO_C"
+    at_desc="MySQL"
+    $at_quiet $ECHO_N "115: MySQL                                          $ECHO_C"
     at_xfail=no
     echo "#                             -*- compilation -*-" >> "$at_group_log"
     (
@@ -9083,6 +9093,115 @@ $at_traceon
 
 
 
+  $at_traceoff
+echo "$at_srcdir/testsuite.at:149: test \"\$enable_mysql_tests\" = yes || exit 77"
+echo testsuite.at:149 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+    case "test \"$enable_mysql_tests\" = yes || exit 77" in
+        *'
+'*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
+ *) at_trace_this=yes ;;
+    esac
+fi
+
+if test -n "$at_trace_this"; then
+    ( $at_traceon; test "$enable_mysql_tests" = yes || exit 77 ) >"$at_stdout" 2>"$at_stder1"
+    at_status=$?
+    grep '^ *+' "$at_stder1" >&2
+    grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+    ( :; test "$enable_mysql_tests" = yes || exit 77 ) >"$at_stdout" 2>"$at_stderr"
+    at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+$at_diff "$at_devnull" "$at_stdout" || at_failed=:
+case $at_status in
+   77) echo 77 > "$at_status_file"; exit 77;;
+   0) ;;
+   *) echo "$at_srcdir/testsuite.at:149: exit code was $at_status, expected 0"
+      at_failed=:;;
+esac
+if $at_failed; then
+
+
+  echo 1 > "$at_status_file"
+  exit 1
+fi
+
+$at_traceon
+
+
+  case $AUTOTEST_PATH in
+    tests) image_path="-I $abs_top_builddir/gst.im" ;;
+    *) image_path="" ;;
+  esac
+
+  echo "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p MySQL ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
+  $at_traceoff
+echo "$at_srcdir/testsuite.at:149: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p MySQL ); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
+echo testsuite.at:149 >"$at_check_line_file"
+
+at_trace_this=
+if test -n "$at_traceon"; then
+    case "{ (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p MySQL ); echo exit $? > retcode; } | tr -d '\\r' | tee stdout; . retcode" in
+        *'
+'*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
+ *) at_trace_this=yes ;;
+    esac
+fi
+
+if test -n "$at_trace_this"; then
+    ( $at_traceon; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p MySQL ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stder1"
+    at_status=$?
+    grep '^ *+' "$at_stder1" >&2
+    grep -v '^ *+' "$at_stder1" >"$at_stderr"
+else
+    ( :; { (cd $abs_top_builddir && gst $image_path -f $abs_top_srcdir/scripts/Test.st --verbose -p MySQL ); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode ) >"$at_stdout" 2>"$at_stderr"
+    at_status=$?
+fi
+
+at_failed=false
+$at_diff "$at_devnull" "$at_stderr" || at_failed=:
+echo stdout:; cat "$at_stdout"
+case $at_status in
+   77) echo 77 > "$at_status_file"; exit 77;;
+   0) ;;
+   *) echo "$at_srcdir/testsuite.at:149: exit code was $at_status, expected 0"
+      at_failed=:;;
+esac
+if $at_failed; then
+
+
+  echo 1 > "$at_status_file"
+  exit 1
+fi
+
+$at_traceon
+
+
+        $at_traceoff
+      $at_times_p && times >"$at_times_file"
+    ) 5>&1 2>&1 | eval $at_tee_pipe
+    at_status=`cat "$at_status_file"`
+    ;;
+
+  116 ) # 116. testsuite.at:150: ZLib
+    at_setup_line='testsuite.at:150'
+    at_desc="ZLib"
+    $at_quiet $ECHO_N "116: ZLib                                           $ECHO_C"
+    at_xfail=no
+    echo "#                             -*- compilation -*-" >> "$at_group_log"
+    (
+      echo "116. testsuite.at:150: testing ..."
+      $at_traceon
+
+
+
+
 
   case $AUTOTEST_PATH in
     tests) image_path="-I $abs_top_builddir/gst.im" ;;
@@ -9096,13 +9215,13 @@ $at_traceon
       0|1) exit $ret ;;
     esac); echo exit $? > retcode; } | tr -d '\r' | tee stdout; . retcode"
   $at_traceoff
-echo "$at_srcdir/testsuite.at:149: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p ZLib
+echo "$at_srcdir/testsuite.at:150: { (cd \$abs_top_builddir && gst \$image_path -f \$abs_top_srcdir/scripts/Test.st --verbose -p ZLib
     ret=\$?
     case \$ret in
       2) exit 77 ;;
       0|1) exit \$ret ;;
     esac); echo exit \$? > retcode; } | tr -d '\\r' | tee stdout; . retcode"
-echo testsuite.at:149 >"$at_check_line_file"
+echo testsuite.at:150 >"$at_check_line_file"
 
 at_trace_this=
 if test -n "$at_traceon"; then
@@ -9135,7 +9254,7 @@ echo stdout:; cat "$at_stdout"
 case $at_status in
    77) echo 77 > "$at_status_file"; exit 77;;
    0) ;;
-   *) echo "$at_srcdir/testsuite.at:149: exit code was $at_status, expected 0"
+   *) echo "$at_srcdir/testsuite.at:150: exit code was $at_status, expected 0"
       at_failed=:;;
 esac
 if $at_failed; then


--- orig/tests/testsuite.at
+++ mod/tests/testsuite.at
@@ -146,4 +146,5 @@ AT_PACKAGE_TEST([DhbNumericalMethods])
 AT_PACKAGE_TEST([Digest])
 AT_OPTIONAL_PACKAGE_TEST([GDBM])
 AT_OPTIONAL_PACKAGE_TEST([Iconv])
+AT_PACKAGE_TEST([MySQL], [], [], [test "$enable_mysql_tests" = yes])
 AT_OPTIONAL_PACKAGE_TEST([ZLib])




_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk