###############################################################################
#
# tkt-343d392b51.eagle --
#
# Written by Joe Mistachkin.
# Released to the public domain, use at your own risk!
#
###############################################################################
package require Eagle
package require Eagle.Library
package require Eagle.Test
runTestPrologue
###############################################################################
package require System.Data.SQLite.Test
runSQLiteTestPrologue
###############################################################################
set dateTimeFormats [list "" Ticks ISO8601 JulianDay UnixEpoch]
for {set i 1} {$i < 5} {incr i} {
set dateTimeFormat [lindex $dateTimeFormats $i]
runTest {test [appendArgs tkt-343d392b51-1. $i] [subst {DateTime\
binding $dateTimeFormat format}] -setup {
setupDb [set fileName [appendArgs tkt-343d392b51-1. $i .db]] "" \
$dateTimeFormat Utc
set dateTime "4 October, 2011 3:27:50 PM GMT"
} -body {
sql execute $db "CREATE TABLE t1(x DATETIME);"
set paramDateTime1 [clock format [clock scan $dateTime] -format \
[getDateTimeFormat] -gmt true]
switch -exact -- $dateTimeFormat {
Ticks {
set paramDateTime1 [object invoke \
-create -alias DateTime Parse $paramDateTime1]
set paramDateTime1 [$paramDateTime1 ToUniversalTime.Ticks]
set paramDateTime2 $paramDateTime1
}
ISO8601 {
set paramDateTime2 [appendArgs ' $paramDateTime1 ']
}
JulianDay {
set paramDateTime1 [object invoke \
-create -alias DateTime Parse $paramDateTime1]
set paramDateTime1 [$paramDateTime1 -create -alias ToUniversalTime]
set paramDateTime1 [expr {[$paramDateTime1 ToOADate] + \
[object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \
OleAutomationEpochAsJulianDay]}]
set paramDateTime2 $paramDateTime1
}
UnixEpoch {
set paramDateTime1 [clock scan $dateTime]
set paramDateTime2 $paramDateTime1
}
}
sql execute $db [appendArgs "INSERT INTO t1 (x) VALUES(" $paramDateTime2 \
");"]
list [sql execute -verbatim -execute reader -format list -datetimeformat \
[getDateTimeFormat] $db "SELECT x FROM t1 WHERE x = ?;" \
[list param1 String $paramDateTime1]] \
[sql execute -verbatim -execute reader -format list -datetimeformat \
[getDateTimeFormat] $db "SELECT x FROM t1 WHERE x = ?;" \
[list param1 DateTime $paramDateTime1]]
} -cleanup {
cleanupDb $fileName
unset -nocomplain paramDateTime2 paramDateTime1 dateTime db fileName
} -constraints {eagle command.object threadCulture.en_US monoBug28\
command.sql compile.DATA SQLite System.Data.SQLite} -result \
{{{2011-10-04 15:27:50Z}} {{2011-10-04 15:27:50Z}}}}
}
###############################################################################
unset -nocomplain dateTimeFormat i dateTimeFormats
###############################################################################
runTest {test tkt-343d392b51-2.1 {SQLiteDataAdapter update fail} -setup {
setupDb [set fileName tkt-343d392b51-2.1.db]
set otherFileName tkt-343d392b51-2.1-otherDb.db
} -body {
set id [object invoke Interpreter.GetActive NextId]
set dataSource [file join [getDatabaseDirectory] $fileName]
set otherDataSource [file join [getDatabaseDirectory] $otherFileName]
set otherDbName otherDb
set otherTable [appendArgs $otherDbName .t1]
set sql(inserts) ""
set sql(1) [subst { \
ATTACH DATABASE '${otherDataSource}' AS ${otherDbName}; \
CREATE TABLE ${otherTable}(x INTEGER PRIMARY KEY, y DATETIME); \
[for {set i 1} {$i < 3} {incr i} {
append sql(inserts) [appendArgs \
"INSERT INTO " ${otherTable} " (x, y) VALUES(" $i ", '" \
[clock format $i -format [getDateTimeFormat]] "'); "]
}; return [expr {[info exists sql(inserts)] ? $sql(inserts) : ""}]] \
}]
set sql(2) [subst { \
SELECT x, y FROM ${otherTable} ORDER BY x; \
}]
unset -nocomplain results errors
set code [compileCSharpWith [subst {
using System;
using System.Data;
using System.Data.SQLite;
namespace _Dynamic${id}
{
public static class Test${id}
{
public static void Main()
{
using (SQLiteConnection connection = new SQLiteConnection(
"Data Source=${dataSource};[getTestProperties]"))
{
connection.Open();
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "${sql(1)}";
command.ExecuteNonQuery();
}
using (SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(
"${sql(2)}", connection))
{
using (DataSet dataSet = new DataSet())
{
dataAdapter.Fill(dataSet, "${otherTable}");
DataTable dataTable = dataSet.Tables\["${otherTable}"\];
dataTable.Columns\["x"\].Unique = true;
dataTable.PrimaryKey = new DataColumn\[\] {
dataTable.Columns\["x"\]
};
[expr {[isMono] ? "#pragma warning disable 219" : ""}]
SQLiteCommandBuilder commandBuilder =
new SQLiteCommandBuilder(dataAdapter);
[expr {[isMono] ? "#pragma warning restore 219" : ""}]
foreach (DataRow dataRow in dataTable.Rows)
{
//
// NOTE: Update even rows and delete odd rows.
//
if ((long)dataRow\["x"\] % 2 == 0)
dataRow\["y"\] =
DateTime.UtcNow.ToString("[getDateTimeFormat]");
else
dataRow.Delete();
}
dataAdapter.Update(dataTable); // DBConcurrencyException (?)
}
}
}
}
}
}
}] true false true results errors System.Data.SQLite.dll]
list $code $results \
[expr {[info exists errors] ? $errors : ""}] \
[expr {$code eq "Ok" ? [catchCSharp {
object invoke _Dynamic${id}.Test${id} Main
} result] : [set result ""]}] $result
} -cleanup {
cleanupDb $fileName; unset -nocomplain db fileName
cleanupDb $otherFileName
unset -nocomplain result code results errors i sql otherTable otherDbName \
otherDataSource dataSource id otherFileName
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite compileCSharp} -match glob -result {*\
System.Data.DBConcurrencyException: *}}
###############################################################################
runTest {test tkt-343d392b51-2.2 {SQLiteDataAdapter update success} -setup {
setupDb [set fileName tkt-343d392b51-2.2.db] "" JulianDay
set otherFileName tkt-343d392b51-2.2-otherDb.db
} -body {
set id [object invoke Interpreter.GetActive NextId]
set dataSource [file join [getDatabaseDirectory] $fileName]
set otherDataSource [file join [getDatabaseDirectory] $otherFileName]
set otherDbName otherDb
set otherTable [appendArgs $otherDbName .t1]
set sql(inserts) ""
set sql(1) [subst { \
ATTACH DATABASE '${otherDataSource}' AS ${otherDbName}; \
CREATE TABLE ${otherTable}(x INTEGER PRIMARY KEY, y DATETIME); \
[for {set i 1} {$i < 3} {incr i} {
append sql(inserts) [appendArgs \
"INSERT INTO " ${otherTable} " (x, y) VALUES(" $i ", JULIANDAY('" \
[clock format $i -format [getDateTimeFormat]] "')); "]
}; return [expr {[info exists sql(inserts)] ? $sql(inserts) : ""}]] \
}]
set sql(2) [subst { \
SELECT x, y FROM ${otherTable} ORDER BY x; \
}]
unset -nocomplain results errors
set code [compileCSharpWith [subst {
using System;
using System.Data;
using System.Data.SQLite;
namespace _Dynamic${id}
{
public static class Test${id}
{
public static void Main()
{
using (SQLiteConnection connection = new SQLiteConnection(
"Data Source=${dataSource};DateTimeFormat=JulianDay;" +
"[getTestProperties]"))
{
connection.Open();
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "${sql(1)}";
command.ExecuteNonQuery();
}
using (SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(
"${sql(2)}", connection))
{
using (DataSet dataSet = new DataSet())
{
dataAdapter.Fill(dataSet, "${otherTable}");
DataTable dataTable = dataSet.Tables\["${otherTable}"\];
dataTable.Columns\["x"\].Unique = true;
dataTable.PrimaryKey = new DataColumn\[\] {
dataTable.Columns\["x"\]
};
[expr {[isMono] ? "#pragma warning disable 219" : ""}]
SQLiteCommandBuilder commandBuilder =
new SQLiteCommandBuilder(dataAdapter);
[expr {[isMono] ? "#pragma warning restore 219" : ""}]
foreach (DataRow dataRow in dataTable.Rows)
{
//
// NOTE: Update even rows and delete odd rows.
//
if ((long)dataRow\["x"\] % 2 == 0)
dataRow\["y"\] =
DateTime.UtcNow.ToString("[getDateTimeFormat]");
else
dataRow.Delete();
}
dataAdapter.Update(dataTable); // DBConcurrencyException (?)
}
}
}
}
}
}
}] true false true results errors System.Data.SQLite.dll]
list $code $results \
[expr {[info exists errors] ? $errors : ""}] \
[expr {$code eq "Ok" ? [catchCSharp {
object invoke _Dynamic${id}.Test${id} Main
} result] : [set result ""]}] $result
} -cleanup {
cleanupDb $fileName; unset -nocomplain db fileName
cleanupDb $otherFileName
unset -nocomplain result code results errors i sql otherTable otherDbName \
otherDataSource dataSource id otherFileName
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite compileCSharp} -match regexp -result {^Ok\
System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 \{\}$}}
###############################################################################
runTest {test tkt-343d392b51-3.1 {attached database, same table name} -setup {
setupDb [set fileName tkt-343d392b51-3.1.db]
set otherFileName tkt-343d392b51-3.1-otherDb.db
} -body {
set otherDataSource [file join [getDatabaseDirectory] $otherFileName]
set otherDbName otherDb
set otherTable [appendArgs $otherDbName .t1]
set sql(inserts) ""
set sql(1) [subst { \
CREATE TABLE t1(x INTEGER PRIMARY KEY); \
ATTACH DATABASE '${otherDataSource}' AS ${otherDbName}; \
CREATE TABLE ${otherTable}(x INTEGER PRIMARY KEY); \
[for {set i 1} {$i < 3} {incr i} {
append sql(inserts) [appendArgs \
"INSERT INTO t1 (x) VALUES(" $i "); "]
append sql(inserts) [appendArgs \
"INSERT INTO " ${otherTable} " (x) VALUES(" [expr {$i * 2}] "); "]
}; return [expr {[info exists sql(inserts)] ? $sql(inserts) : ""}]] \
}]
sql execute $db $sql(1)
list [sql execute -execute reader -format list $db "SELECT x FROM t1;"] \
[sql execute -execute reader -format list $db [appendArgs \
"SELECT x FROM " ${otherTable} ";"]]
} -cleanup {
cleanupDb $fileName; unset -nocomplain db fileName
cleanupDb $otherFileName
unset -nocomplain i sql otherTable otherDbName otherDataSource otherFileName
} -constraints \
{eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite} -result \
{{1 2} {2 4}}}
###############################################################################
runTest {test tkt-343d392b51-3.2 {adapter, attached db, table names} -setup {
setupDb [set fileName tkt-343d392b51-3.2.db]
set otherFileName tkt-343d392b51-3.2-otherDb.db
} -body {
set id [object invoke Interpreter.GetActive NextId]
set dataSource [file join [getDatabaseDirectory] $fileName]
set otherDataSource [file join [getDatabaseDirectory] $otherFileName]
set otherDbName otherDb
set otherTable [appendArgs $otherDbName .t1]
set sql(inserts) ""
set sql(1) [subst { \
CREATE TABLE t1(x INTEGER PRIMARY KEY); \
ATTACH DATABASE '${otherDataSource}' AS ${otherDbName}; \
CREATE TABLE ${otherTable}(x INTEGER PRIMARY KEY); \
[for {set i 1} {$i < 3} {incr i} {
append sql(inserts) [appendArgs \
"INSERT INTO t1 (x) VALUES(" $i ");"]
append sql(inserts) [appendArgs \
"INSERT INTO " ${otherTable} " (x) VALUES(" [expr {$i * 2}] "); "]
}; return [expr {[info exists sql(inserts)] ? $sql(inserts) : ""}]] \
}]
set sql(2) [subst { \
SELECT x FROM ${otherTable} ORDER BY x; \
}]
unset -nocomplain results errors
set code [compileCSharpWith [subst {
using System.Data;
using System.Data.SQLite;
namespace _Dynamic${id}
{
public static class Test${id}
{
public static void Main()
{
using (SQLiteConnection connection = new SQLiteConnection(
"Data Source=${dataSource};[getTestProperties]"))
{
connection.Open();
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "${sql(1)}";
command.ExecuteNonQuery();
}
using (SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(
"${sql(2)}", connection))
{
using (DataSet dataSet = new DataSet())
{
dataAdapter.Fill(dataSet, "${otherTable}");
DataTable dataTable = dataSet.Tables\["${otherTable}"\];
dataTable.Columns\["x"\].Unique = true;
dataTable.PrimaryKey = new DataColumn\[\] {
dataTable.Columns\["x"\]
};
[expr {[isMono] ? "#pragma warning disable 219" : ""}]
SQLiteCommandBuilder commandBuilder =
new SQLiteCommandBuilder(dataAdapter);
[expr {[isMono] ? "#pragma warning restore 219" : ""}]
foreach (DataRow dataRow in dataTable.Rows)
dataRow.Delete();
dataAdapter.Update(dataTable); // DBConcurrencyException (?)
}
}
}
}
}
}
}] true false true results errors System.Data.SQLite.dll]
list $code $results \
[expr {[info exists errors] ? $errors : ""}] \
[expr {$code eq "Ok" ? [catchCSharp {
object invoke _Dynamic${id}.Test${id} Main
} result] : [set result ""]}] $result
} -cleanup {
cleanupDb $fileName; unset -nocomplain db fileName
cleanupDb $otherFileName
unset -nocomplain result code results errors i sql otherTable otherDbName \
otherDataSource dataSource id otherFileName
} -constraints {eagle command.object monoBug28 monoBug211 command.sql\
compile.DATA SQLite System.Data.SQLite compileCSharp} -match regexp -result \
{^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 \{\}$}}
###############################################################################
runSQLiteTestEpilogue
runTestEpilogue
|