###############################################################################
#
# tkt-201128cc88.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
###############################################################################
runTest {test tkt-201128cc88-1.1 {custom function with byte[] arg} -setup {
set fileName tkt-201128cc88-1.1.db
} -body {
set id [object invoke Interpreter.GetActive NextId]
unset -nocomplain results errors
set code [compileCSharpWith [subst {
using System;
using System.Data.SQLite;
namespace _Dynamic${id}
{
\[SQLiteFunction(Name = "Base64", FuncType = FunctionType.Scalar)\]
public class Test${id} : SQLiteFunction
{
public override object Invoke(
object\[\] args
)
{
if (args == null)
return null;
if (args.Length != 1)
return new ArgumentException(String.Format(
"need exactly one argument, got {0}", args.Length));
object arg = args\[0\];
if (arg == null)
return String.Empty;
Type type = arg.GetType();
if (type == typeof(DBNull))
return String.Empty;
if (type != typeof(byte\[\]))
return new ArgumentException(String.Format(
"argument must be byte array, got {0}", type));
return Convert.ToBase64String((byte\[\]) arg);
}
///////////////////////////////////////////////////////////////////////
public static void Main()
{
SQLiteFunction.RegisterFunction(typeof(Test${id}));
}
}
}
}] true false true results errors System.Data.SQLite.dll]
#
# NOTE: Compile the C# code (above) to register the custom SQLite function
# and then open the database for this test case and attempt to execute
# the function. Normally, we would open the database in the test setup
# phase; however, that will not work correctly because newly registered
# functions are only picked up and used by databases opened after they
# have been registered.
#
list $code $results \
[expr {[info exists errors] ? $errors : ""}] \
[expr {$code eq "Ok" ? [catch {
object invoke _Dynamic${id}.Test${id} Main
} result] : [set result ""]}] $result [setupDb $fileName] \
[sql execute -execute scalar $db "SELECT Base64(CAST(NULL AS BLOB));"] \
[sql execute -execute scalar $db "SELECT Base64(CAST('' AS BLOB));"] \
[sql execute -execute scalar $db "SELECT Base64(CAST('foo' AS BLOB));"]
} -cleanup {
cleanupDb $fileName
unset -nocomplain result code results errors id db fileName
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite compileCSharp} -match regexp -result {^Ok\
System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 \{\}\
System#Data#SQLite#SQLiteConnection#\d+ \{\} \{\} Zm9v$}}
###############################################################################
runSQLiteTestEpilogue
runTestEpilogue