Index: Tests/types.eagle ================================================================== --- Tests/types.eagle +++ Tests/types.eagle @@ -21,20 +21,20 @@ ############################################################################### proc bindValueCallback1 { convert command flags parameter typeName index userData completeVarName } { - lappend ::log(bind) [list convert [isObjectHandle $convert]] lappend ::log(bind) [list command [isObjectHandle $command]] lappend ::log(bind) [list flags [getStringFromObjectHandle $flags]] lappend ::log(bind) [list parameter [isObjectHandle $parameter]] lappend ::log(bind) [list typeName [getStringFromObjectHandle $typeName]] lappend ::log(bind) [list index [getStringFromObjectHandle $index]] lappend ::log(bind) [list userData [getStringFromObjectHandle $userData]] if {[getStringFromObjectHandle $userData] == 3} then { + upvar 1 $completeVarName complete; unset complete error "parameter binding canceled" } if {[getStringFromObjectHandle $userData] == 2} then { $parameter DbType String @@ -45,23 +45,25 @@ upvar 1 $completeVarName complete set complete [object invoke -create System.Boolean Parse True] } } +############################################################################### + proc readValueCallback1 { convert dataReader flags eventArgs typeName index userData completeVarName } { - lappend ::log(read) [list convert [isObjectHandle $convert]] lappend ::log(read) [list dataReader [isObjectHandle $dataReader]] lappend ::log(read) [list flags [getStringFromObjectHandle $flags]] lappend ::log(read) [list eventArgs [isObjectHandle $eventArgs]] lappend ::log(read) [list typeName [getStringFromObjectHandle $typeName]] lappend ::log(read) [list index [getStringFromObjectHandle $index]] lappend ::log(read) [list userData [getStringFromObjectHandle $userData]] if {[getStringFromObjectHandle $userData] == 3} then { + upvar 1 $completeVarName complete; unset complete error "reading of value canceled" } if {[getStringFromObjectHandle $userData] == 1} then { upvar 1 $completeVarName complete @@ -103,144 +105,151 @@ } -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {0 True True 1 True True}} ############################################################################### -set readArguments [list \ +set readArgs [list \ convert dataReader flags eventArgs typeName index userData \ completeVarName] -set readMappings [list \ - [list Boolean GetBoolean false BooleanValue true 0 \ - {False False True False False False False False}] \ - [list Byte GetByte false ByteValue true 0 \ - {0 0 1 0 0 0 0 0}] \ - [list Byte GetBytes true BytesValue false 0 \ - {0 1 48 1 49 3 {49 46 50} 5 {116 104 114 101 101} 1 4 27\ - {50 48 49 54 45 48 54 45 49 57 32 49 57 58 53 48 58 48 52\ - 46 49 50 51 52 53 54 55} 36 {55 52 102 49 102 52 48 50 45\ - 100 100 101 102 45 52 48 50 55 45 97 55 56 102 45 51 56 52\ - 55 102 97 57 55 98 56 51 48}}] \ - [list Char GetChar false CharValue true 0 \ - " \x01 "] \ - [list Char GetChars true CharsValue false 0 \ - "0 1 0 1 1 3 {1 . 2} 1 t 1 \x04 1 2 1 7"] \ - [list DateTime GetDateTime false DateTimeValue true 0 \ - {{0001-01-01 00:00:00Z} {0001-01-01 00:00:00Z}\ +set params [list \ + [list Boolean GetBoolean false BooleanValue true 0] \ + [list Byte GetByte false ByteValue true 0] \ + [list Byte GetBytes true BytesValue false 0] \ + [list Char GetChar false CharValue true 0] \ + [list Char GetChars true CharsValue false 0] \ + [list DateTime GetDateTime false DateTimeValue true 0] \ + [list Decimal GetDecimal false DecimalValue true 0] \ + [list Double GetDouble false DoubleValue true 0] \ + [list Single GetFloat false FloatValue true 0] \ + [list Guid GetGuid false GuidValue true \ + 00000000-0000-0000-0000-000000000000] \ + [list Int16 GetInt16 false Int16Value true 0] \ + [list Int32 GetInt32 false Int32Value true 0] \ + [list Int64 GetInt64 false Int64Value true 0] \ + [list String GetString false StringValue false null] \ + [list Object GetValue false Value false null]] + +############################################################################### + +set expectedResults [list \ + {False False True False False False False False} \ + {0 0 1 0 0 0 0 0} \ + {0 1 48 1 49 3 {49 46 50} 5 {116 104 114\ + 101 101} 1 4 27 {50 48 49 54 45 48 54\ + 45 49 57 32 49 57 58 53 48 58 48 52 46\ + 49 50 51 52 53 54 55} 36 {55 52 102 49\ + 102 52 48 50 45 100 100 101 102 45 52\ + 48 50 55 45 97 55 56 102 45 51 56 52 55\ + 102 97 57 55 98 56 51 48}} \ + " \x01 " \ + "0 1 0 1 1 3 {1 . 2} 1 t 1 \x04 1 2 1 7" \ + {{0001-01-01 00:00:00Z} {0001-01-01 00:00:00Z}\ {0001-01-01 00:00:00Z} {0001-01-01 00:00:00Z}\ {0001-01-01 00:00:00Z} {0001-01-01 00:00:00Z}\ - {2016-06-19 19:50:04.1234567Z} {0001-01-01 00:00:00Z}}] \ - [list Decimal GetDecimal false DecimalValue true 0 \ - {0 0 1 1.2 0 0 0 0}] \ - [list Double GetDouble false DoubleValue true 0 \ - {0 0 1 1.2 0 0 0 0}] \ - [list Single GetFloat false FloatValue true 0 \ - {0 0 1 1.2 0 0 0 0}] \ - [list Guid GetGuid false GuidValue true [guid null] \ - {00000000-0000-0000-0000-000000000000\ + {2016-06-19 19:50:04.1234567Z} {0001-01-01\ + 00:00:00Z}} \ + {0 0 1 1.2 0 0 0 0} \ + {0 0 1 1.2 0 0 0 0} \ + {0 0 1 1.2 0 0 0 0} \ + {00000000-0000-0000-0000-000000000000\ 00000000-0000-0000-0000-000000000000\ 00000000-0000-0000-0000-000000000000\ 00000000-0000-0000-0000-000000000000\ 00000000-0000-0000-0000-000000000000\ 00060504-0000-0000-0000-000000000000\ 00000000-0000-0000-0000-000000000000\ - 74f1f402-ddef-4027-a78f-3847fa97b830}] \ - [list Int16 GetInt16 false Int16Value true 0 \ - {0 0 1 0 0 0 0 0}] \ - [list Int32 GetInt32 false Int32Value true 0 \ - {0 0 1 0 0 0 0 0}] \ - [list Int64 GetInt64 false Int64Value true 0 \ - {0 0 1 0 0 0 0 0}] \ - [list String GetString false StringValue false null \ - " three \x04\x05\x06 {2016-06-19 19:50:04.1234567}\ - 74f1f402-ddef-4027-a78f-3847fa97b830"] \ - [list Object GetValue false Value false null \ - "{} 0 1 1.2 three {4 5 6} {2016-06-19 19:50:04.1234567}\ - 74f1f402-ddef-4027-a78f-3847fa97b830"]] + 74f1f402-ddef-4027-a78f-3847fa97b830} \ + {0 0 1 0 0 0 0 0} \ + {0 0 1 0 0 0 0 0} \ + {0 0 1 0 0 0 0 0} \ + " three \x04\x05\x06\ + {2016-06-19 19:50:04.1234567}\ + 74f1f402-ddef-4027-a78f-3847fa97b830" \ + {{} 0 1 1.2 three {4 5 6} {2016-06-19\ + 19:50:04.1234567}\ + 74f1f402-ddef-4027-a78f-3847fa97b830}] ############################################################################### set savedDateTimeFormat [object invoke Interpreter.GetActive DateTimeFormat] if {![isObjectHandle $savedDateTimeFormat]} then {set savedDateTimeFormat null} object invoke Interpreter.GetActive DateTimeFormat [getDateTimeFormat] ############################################################################### -for {set i 0} {$i < [llength $readMappings]} {incr i} { +for {set i 0} {$i < [llength $params]} {incr i} { foreach { - typeName methodName isArray propertyName - isRequired value expectedResult - } [lindex $readMappings $i] break + typeName methodName isArray propertyName isRequired value + } [lindex $params $i] break - proc readValueCallback2 $readArguments [subst { + set expectedResult [lindex $expectedResults $i] + + ############################################################################# + + proc readValueCallback2 $readArgs [subst { if {$isArray} then { if {\[catch { - set keyValue \[\$dataReader GetInt64 0\] + set dataOffset \[\$eventArgs ArrayEventArgs.DataOffset\] -set dataOffset \[\$eventArgs ArrayEventArgs.DataOffset\] -set buffer \[\$eventArgs -create [appendArgs ArrayEventArgs. $typeName Buffer]\] -set bufferOffset \[\$eventArgs ArrayEventArgs.BufferOffset\] -set length \[\$eventArgs ArrayEventArgs.Length\] -set readValue \[\$dataReader \[\$eventArgs MethodName\] \$index \$dataOffset \$buffer \$bufferOffset \$length\] + set buffer \[\$eventArgs -create [appendArgs ArrayEventArgs. \ + $typeName Buffer]\] + + set bufferOffset \[\$eventArgs ArrayEventArgs.BufferOffset\] + set length \[\$eventArgs ArrayEventArgs.Length\] + + set readValue \[\$dataReader \[\$eventArgs MethodName\] \ + \$index \$dataOffset \$buffer \$bufferOffset \$length\] \$eventArgs \[appendArgs Value. $propertyName\] \$readValue } error\]} then { - - - - set readValue \[\$dataReader -tostring GetValue \$index\] - - + set readValue \[\$dataReader -tostring GetValue \$index\] if {"$typeName" eq "Char"} then { set string \[object create -alias String \$readValue\] - - - set buffer \[\$string -create -alias ToCharArray] - - - } else { - set buffer \[object invoke -create -alias System.Text.Encoding.UTF8 GetBytes \$readValue\] - } - - \$eventArgs ArrayEventArgs.Length \[\$buffer Length\] - - \$eventArgs \[appendArgs Value. $propertyName\] \$buffer - - } else { - - set buffer \[\$eventArgs -create [appendArgs ArrayEventArgs. $typeName Buffer]\] - \$eventArgs \[appendArgs Value. $propertyName\] \$buffer - - - + set buffer \[\$string -create -alias ToCharArray] + } else { + set buffer \[object invoke -create -alias \ + System.Text.Encoding.UTF8 GetBytes \$readValue\] + } + + \$eventArgs \[appendArgs Value. $propertyName\] \$buffer + \$eventArgs ArrayEventArgs.Length \[\$buffer Length\] + } else { + set buffer \[\$eventArgs -create [appendArgs ArrayEventArgs. \ + $typeName Buffer]\] + + \$eventArgs \[appendArgs Value. $propertyName\] \$buffer } } else { if {\[catch { - set keyValue \[\$dataReader GetInt64 0\] set readValue \[\$dataReader \[\$eventArgs MethodName\] \$index\] if {"$typeName" eq "Char"} then { set readValue \[object invoke -create Char Parse \$readValue\] } \$eventArgs \[appendArgs Value. $propertyName\] \$readValue } error\]} then { - \$eventArgs \[appendArgs Value. $propertyName\] {$value} } } + upvar 1 \$completeVarName complete set complete \[object invoke -create System.Boolean Parse True\] }] - runTest {test [appendArgs types-2. $i] [appendArgs $methodName " callback"] -setup [subst -nocommands { + ############################################################################# + + runTest {test [appendArgs types-2. $i] [appendArgs $methodName " callback"] \ + -setup [subst -nocommands { set typeName {$typeName} set methodName {$methodName} set isArray {$isArray} - setupDb [set fileName [appendArgs types-2. $i .db]] "" "" "" UseConnectionReadValueCallbacks + setupDb [set fileName [appendArgs types-2. $i .db]] "" "" "" \ + UseConnectionReadValueCallbacks }] -body { sql execute $db { CREATE TABLE t1(x INTEGER, y SPECIAL); INSERT INTO t1 (x, y) VALUES(1, NULL); INSERT INTO t1 (x, y) VALUES(2, 0); @@ -250,66 +259,70 @@ INSERT INTO t1 (x, y) VALUES(6, X'040506'); INSERT INTO t1 (x, y) VALUES(7, '2016-06-19 19:50:04.1234567'); INSERT INTO t1 (x, y) VALUES(8, '74f1f402-ddef-4027-a78f-3847fa97b830'); } + set callback {-callbackflags +Default readValueCallback2} set connection [getDbConnection] set result [list] set typeCallbacks [object invoke -marshalflags +DynamicCallback \ - System.Data.SQLite.SQLiteTypeCallbacks Create null \ - {-callbackflags +Default readValueCallback2} null null] + System.Data.SQLite.SQLiteTypeCallbacks Create null $callback \ + null null] $connection SetTypeCallbacks SPECIAL $typeCallbacks set dataReader [sql execute -execute reader -format datareader \ - -alias $db "SELECT x, y FROM t1 ORDER BY x;"] + -alias $db "SELECT y FROM t1 ORDER BY x;"] while {[$dataReader Read]} { if {$isArray} then { - set buffer [object invoke -create Array CreateInstance $typeName 100] + set buffer [object invoke \ + -create Array CreateInstance $typeName 100] if {[catch { - $dataReader $methodName 1 0 $buffer 0 1 + $dataReader $methodName 0 0 $buffer 0 1 } value] == 0} then { lappend result $value if {$value > 0} then { set list [object create -alias StringList $buffer] - lappend result [object invoke StringList GetRange $list 0 [expr {$value - 1}] false] + lappend result [object invoke StringList GetRange \ + $list 0 [expr {$value - 1}] false] } } else { - lappend result [list array_error $::errorCode] + lappend result [list error(array) $::errorCode] } } else { if {[catch { - $dataReader $methodName 1 + $dataReader $methodName 0 } value] == 0} then { - if {$value eq "\x00"} then { lappend result } else { lappend result [getStringFromObjectHandle $value] } - } else { - lappend result [list value_error $::errorCode] + lappend result [list error(value) $::errorCode] } } } set result } -cleanup { + catch {object removecallback $callback} + unset -nocomplain dataReader freeDbConnection cleanupDb $fileName - unset -nocomplain buffer typeCallbacks isArray methodName typeName - unset -nocomplain value result connection db fileName + unset -nocomplain buffer typeCallbacks callback value list + unset -nocomplain result connection db fileName + unset -nocomplain typeName methodName isArray } -constraints {eagle command.object monoBug28 command.sql compile.DATA\ SQLite System.Data.SQLite} -result $expectedResult} rename readValueCallback2 "" } @@ -319,12 +332,12 @@ object invoke Interpreter.GetActive DateTimeFormat $savedDateTimeFormat unset -nocomplain savedDateTimeFormat ############################################################################### -unset -nocomplain i readArguments readMappings typeName methodName isArray \ - propertyName isRequired value expectedResult +unset -nocomplain i readArgs params typeName methodName isArray propertyName \ + isRequired expectedResults expectedResult ############################################################################### runTest {test types-3.1 {bind callback (incomplete)} -setup { unset -nocomplain log @@ -334,33 +347,41 @@ } -body { sql execute $db { CREATE TABLE t1(x SPECIAL); } + set callback {-callbackflags +Default bindValueCallback1} set connection [getDbConnection] set typeCallbacks [object invoke -marshalflags +DynamicCallback \ - System.Data.SQLite.SQLiteTypeCallbacks Create \ - {-callbackflags +Default bindValueCallback1} null 0 null] + System.Data.SQLite.SQLiteTypeCallbacks Create $callback null \ + 0 null] $connection SetTypeCallbacks SPECIAL $typeCallbacks sql execute $db { INSERT INTO t1 (x) VALUES(?); } [list Special Int64 1234] - list [expr { + set result [list] + + lappend result [expr { [info exists log(bind)] ? $log(bind) : "" - }] [sql execute -execute reader -format list $db \ + }] + + lappend result [sql execute -execute reader -format list $db \ "SELECT * FROM t1 ORDER BY x;"] + + set result } -cleanup { + catch {object removecallback $callback} + freeDbConnection cleanupDb $fileName - unset -nocomplain typeCallbacks - unset -nocomplain log connection db fileName + unset -nocomplain result typeCallbacks callback log connection db fileName } -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {{{convert true} {command true} {flags\ {UseConnectionBindValueCallbacks, UseParameterNameForTypeName}} {parameter\ true} {typeName Special} {index 1} {userData 0}} 1234}} @@ -374,33 +395,41 @@ } -body { sql execute $db { CREATE TABLE t1(x SPECIAL); } + set callback {-callbackflags +Default bindValueCallback1} set connection [getDbConnection] set typeCallbacks [object invoke -marshalflags +DynamicCallback \ - System.Data.SQLite.SQLiteTypeCallbacks Create \ - {-callbackflags +Default bindValueCallback1} null 1 null] + System.Data.SQLite.SQLiteTypeCallbacks Create $callback null \ + 1 null] $connection SetTypeCallbacks SPECIAL $typeCallbacks sql execute $db { INSERT INTO t1 (x) VALUES(?); } [list Special Int64 5678] - list [expr { + set result [list] + + lappend result [expr { [info exists log(bind)] ? $log(bind) : "" - }] [sql execute -execute reader -format list $db \ + }] + + lappend result [sql execute -execute reader -format list $db \ "SELECT * FROM t1 ORDER BY x;"] + + set result } -cleanup { + catch {object removecallback $callback} + freeDbConnection cleanupDb $fileName - unset -nocomplain typeCallbacks - unset -nocomplain log connection db fileName + unset -nocomplain result typeCallbacks callback log connection db fileName } -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {{{convert true} {command true} {flags\ {UseConnectionBindValueCallbacks, UseParameterNameForTypeName}} {parameter\ true} {typeName Special} {index 1} {userData 1}} {}}} @@ -414,33 +443,41 @@ } -body { sql execute $db { CREATE TABLE t1(x SPECIAL); } + set callback {-callbackflags +Default bindValueCallback1} set connection [getDbConnection] set typeCallbacks [object invoke -marshalflags +DynamicCallback \ - System.Data.SQLite.SQLiteTypeCallbacks Create \ - {-callbackflags +Default bindValueCallback1} null 2 null] + System.Data.SQLite.SQLiteTypeCallbacks Create $callback null \ + 2 null] $connection SetTypeCallbacks SPECIAL $typeCallbacks sql execute $db { INSERT INTO t1 (x) VALUES(?); } [list Special Int64 9999] - list [expr { + set result [list] + + lappend result [expr { [info exists log(bind)] ? $log(bind) : "" - }] [sql execute -execute reader -format list $db \ + }] + + lappend result [sql execute -execute reader -format list $db \ "SELECT * FROM t1 ORDER BY x;"] + + set result } -cleanup { + catch {object removecallback $callback} + freeDbConnection cleanupDb $fileName - unset -nocomplain typeCallbacks - unset -nocomplain log connection db fileName + unset -nocomplain result typeCallbacks callback log connection db fileName } -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {{{convert true} {command true} {flags\ {UseConnectionBindValueCallbacks, UseParameterNameForTypeName}} {parameter\ true} {typeName Special} {index 1} {userData 2}} custom}} @@ -447,36 +484,52 @@ ############################################################################### runTest {test types-4.1 {read callback (exception)} -setup { unset -nocomplain log - setupDb [set fileName types-4.1.db] "" "" "" UseConnectionReadValueCallbacks + setupDb [set fileName types-4.1.db] "" "" "" \ + UseConnectionReadValueCallbacks } -body { sql execute $db { CREATE TABLE t1(x SPECIAL); INSERT INTO t1 (x) VALUES(8888); } + set callback {-callbackflags {+Default ThrowOnError} readValueCallback1} set connection [getDbConnection] set typeCallbacks [object invoke -marshalflags +DynamicCallback \ - System.Data.SQLite.SQLiteTypeCallbacks Create null \ - {-callbackflags "+Default ThrowOnError" readValueCallback1} \ + System.Data.SQLite.SQLiteTypeCallbacks Create null $callback \ null 3] $connection SetTypeCallbacks SPECIAL $typeCallbacks - list [catch {sql execute -execute reader -format list $db {SELECT * FROM t1 ORDER BY x;}} error] [extractSystemDataSQLiteExceptionMessage $error] [catch {sql execute -execute scalar $db {SELECT COUNT(*) FROM t1;}} error] [extractSystemDataSQLiteExceptionMessage $error] [expr { - [info exists log(read)] ? $log(read) : "" - }] + set result [list] + + lappend result [catch { + sql execute -execute reader -format list $db {SELECT * FROM t1 ORDER BY x;} + } error] + + lappend result [extractSystemDataSQLiteExceptionMessage $error] + + lappend result [catch { + sql execute -execute scalar $db {SELECT COUNT(*) FROM t1;} + } error] + + lappend result [extractSystemDataSQLiteExceptionMessage $error] + lappend result [expr {[info exists log(read)] ? $log(read) : ""}] + + set result } -cleanup { + catch {object removecallback $callback} + freeDbConnection cleanupDb $fileName - unset -nocomplain typeCallbacks - unset -nocomplain log connection db fileName + unset -nocomplain error result typeCallbacks callback log connection db \ + fileName } -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {1 {reading of value canceled} 0 1 {{convert true}\ {dataReader true} {flags UseConnectionReadValueCallbacks} {eventArgs true}\ {typeName SPECIAL} {index 0} {userData 3}}}} @@ -490,40 +543,51 @@ } -body { sql execute $db { CREATE TABLE t1(x SPECIAL); } + set callback {-callbackflags {+Default ThrowOnError} bindValueCallback1} set connection [getDbConnection] set typeCallbacks [object invoke -marshalflags +DynamicCallback \ - System.Data.SQLite.SQLiteTypeCallbacks Create \ - {-callbackflags "+Default ThrowOnError" bindValueCallback1} \ - null 3 null] + System.Data.SQLite.SQLiteTypeCallbacks Create $callback null \ + 3 null] $connection SetTypeCallbacks SPECIAL $typeCallbacks catch { sql execute $db { INSERT INTO t1 (x) VALUES(?); } [list Special Int64 4321] } - list [expr { + set result [list] + + lappend result [expr { [info exists log(bind)] ? $log(bind) : "" - }] [sql execute -execute reader -format list $db \ + }] + + lappend result [sql execute -execute reader -format list $db \ "SELECT * FROM t1 ORDER BY x;"] + + set result } -cleanup { + catch {object removecallback $callback} + freeDbConnection cleanupDb $fileName - unset -nocomplain typeCallbacks - unset -nocomplain log connection db fileName + unset -nocomplain result typeCallbacks callback log connection db fileName } -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\ System.Data.SQLite} -result {{{convert true} {command true} {flags\ {UseConnectionBindValueCallbacks, UseParameterNameForTypeName}} {parameter\ true} {typeName Special} {index 1} {userData 3}} {}}} + +############################################################################### + +catch {eval object dispose [info objects System#Boolean#*]} ############################################################################### rename readValueCallback1 "" rename bindValueCallback1 ""