Imported Upstream version 3.8.0

Former-commit-id: 6a76a29bd07d86e57c6c8da45c65ed5447d38a61
This commit is contained in:
Jo Shields
2014-09-04 09:07:35 +01:00
parent a575963da9
commit fe777c5c82
1062 changed files with 12460 additions and 5983 deletions

View File

@@ -652,11 +652,37 @@ namespace Mono.Data.Sqlite
return UnsafeNativeMethods.sqlite3_aggregate_count(context);
}
#if MONOTOUCH
class FunctionData {
public SQLiteCallback Func;
public SQLiteCallback FuncStep;
public SQLiteFinalCallback FuncFinal;
}
#endif
internal override void CreateFunction(string strFunction, int nArgs, bool needCollSeq, SQLiteCallback func, SQLiteCallback funcstep, SQLiteFinalCallback funcfinal)
{
int n;
#if !SQLITE_STANDARD
#if MONOTOUCH
var data = new FunctionData();
data.Func = func;
data.FuncStep = funcstep;
data.FuncFinal = funcfinal;
SQLiteCallback func_callback = func == null ? null : new SQLiteCallback(scalar_callback);
SQLiteCallback funcstep_callback = funcstep == null ? null : new SQLiteCallback(step_callback);
SQLiteFinalCallback funcfinal_callback = funcfinal == null ? null : new SQLiteFinalCallback(final_callback);
IntPtr user_data;
user_data = GCHandle.ToIntPtr(GCHandle.Alloc(data));
n = UnsafeNativeMethods.sqlite3_create_function_v2(_sql, ToUTF8(strFunction), nArgs, 4, user_data, func_callback, funcstep_callback, funcfinal_callback, destroy_callback);
if (n == 0) {
// sqlite3_create_function_v2 will call 'destroy_callback' if it fails, so we need to recreate the gchandle here.
user_data = GCHandle.ToIntPtr(GCHandle.Alloc(data));
n = UnsafeNativeMethods.sqlite3_create_function_v2(_sql, ToUTF8(strFunction), nArgs, 1, user_data, func_callback, funcstep_callback, funcfinal_callback, destroy_callback);
}
#elif !SQLITE_STANDARD
n = UnsafeNativeMethods.sqlite3_create_function_interop(_sql, ToUTF8(strFunction), nArgs, 4, IntPtr.Zero, func, funcstep, funcfinal, (needCollSeq == true) ? 1 : 0);
if (n == 0) n = UnsafeNativeMethods.sqlite3_create_function_interop(_sql, ToUTF8(strFunction), nArgs, 1, IntPtr.Zero, func, funcstep, funcfinal, (needCollSeq == true) ? 1 : 0);
#else
@@ -673,6 +699,38 @@ namespace Mono.Data.Sqlite
if (n > 0) throw new SqliteException(n, SQLiteLastError());
}
#if MONOTOUCH
[MonoTouch.MonoPInvokeCallback(typeof(SQLiteCallback))]
internal static void scalar_callback(IntPtr context, int nArgs, IntPtr argsptr)
{
var handle = GCHandle.FromIntPtr (UnsafeNativeMethods.sqlite3_user_data(context));
var func = (FunctionData)handle.Target;
func.Func(context, nArgs, argsptr);
}
[MonoTouch.MonoPInvokeCallback(typeof(SQLiteCallback))]
internal static void step_callback(IntPtr context, int nArgs, IntPtr argsptr)
{
var handle = GCHandle.FromIntPtr(UnsafeNativeMethods.sqlite3_user_data(context));
var func = (FunctionData)handle.Target;
func.FuncStep(context, nArgs, argsptr);
}
[MonoTouch.MonoPInvokeCallback(typeof(SQLiteFinalCallback))]
internal static void final_callback(IntPtr context)
{
var handle = GCHandle.FromIntPtr(UnsafeNativeMethods.sqlite3_user_data(context));
var func = (FunctionData)handle.Target;
func.FuncFinal(context);
}
[MonoTouch.MonoPInvokeCallback(typeof(SQLiteFinalCallback))]
internal static void destroy_callback(IntPtr context)
{
GCHandle.FromIntPtr(context).Free();
}
#endif
internal override int ContextCollateCompare(CollationEncodingEnum enc, IntPtr context, string s1, string s2)
{
#if !SQLITE_STANDARD