disqlite3functions.pas
来自「DELPHI 访问SQLITE3 数据库的VCL控件」· PAS 代码 · 共 689 行 · 第 1/2 页
PAS
689 行
try
sqlite3_result_double(Context, Cot(sqlite3_value_double(p)));
except
on e: EMathError do
sqlite3_result_null(Context);
end;
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_degrees(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
sqlite3_result_double(Context, sqlite3_value_double(p) * 180.0 / PI);
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_exp(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
sqlite3_result_double(Context, exp(sqlite3_value_double(p)))
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_floor(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
sqlite3_result_int64(Context, Floor(sqlite3_value_double(p)));
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_ln(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
v: Double;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
begin
v := sqlite3_value_double(p);
if v > 0.0 then
sqlite3_result_double(Context, Ln(v))
else
sqlite3_result_null(Context);
end;
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_log10(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
v: Double;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
begin
v := sqlite3_value_double(p);
if v > 0.0 then
sqlite3_result_double(Context, log10(v))
else
sqlite3_result_null(Context);
end;
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_log2(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
v: Double;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
begin
v := sqlite3_value_double(p);
if v > 0.0 then
sqlite3_result_double(Context, Log2(v))
else
sqlite3_result_null(Context);
end;
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_logN(Context: Pointer; nArgs: Integer; Args: PPointerArray);
label
ResultNull;
var
p1, p2: Pointer;
v1, V2: Double;
begin
p1 := Args[0];
if sqlite3_value_type(p1) in [SQLITE_INTEGER, SQLITE_FLOAT] then
begin
v1 := sqlite3_value_double(p1);
if (v1 > 0.0) and (v1 <> 1.0) then
begin
p2 := Args[1];
if sqlite3_value_type(p2) in [SQLITE_INTEGER, SQLITE_FLOAT] then
begin
V2 := sqlite3_value_double(p2);
if V2 > 0.0 then
sqlite3_result_double(Context, LogN(v1, V2))
else
ResultNull:
sqlite3_result_null(Context);
Exit;
end;
end
else
goto ResultNull;
end;
sqlite3_result_argument_error(Context);
end;
procedure sqlite3_function_mod(Context: Pointer; nArgs: Integer; Args: PPointerArray);
label
1;
var
p1, p2: Pointer;
begin
p1 := Args[0];
case sqlite3_value_type(p1) of
SQLITE_INTEGER:
begin
p2 := Args[1];
case sqlite3_value_type(p2) of
SQLITE_INTEGER:
begin
sqlite3_result_int64(Context, sqlite3_value_int64(p1) mod sqlite3_value_int64(p2));
Exit;
end;
SQLITE_FLOAT:
goto 1;
end;
end;
SQLITE_FLOAT:
begin
p2 := Args[1];
case sqlite3_value_type(p2) of
SQLITE_INTEGER, SQLITE_FLOAT:
begin
1:
sqlite3_result_double(Context, ModDouble(sqlite3_value_double(p1), sqlite3_value_double(p2)));
Exit;
end;
end;
end;
end;
sqlite3_result_argument_error(Context);
end;
procedure sqlite3_function_pi(Context: Pointer; nArgs: Integer; Args: PPointerArray);
begin
sqlite3_result_double(Context, PI);
end;
procedure sqlite3_function_pow(Context: Pointer; nArgs: Integer; Args: PPointerArray);
label
ResultNull;
var
p1, p2: Pointer;
begin
p1 := Args[0];
if sqlite3_value_type(p1) in [SQLITE_INTEGER, SQLITE_FLOAT] then
begin
p2 := Args[1];
if sqlite3_value_type(p2) in [SQLITE_INTEGER, SQLITE_FLOAT] then
begin
try
sqlite3_result_double(Context, Power(sqlite3_value_double(p1), sqlite3_value_double(p2)));
except
on e: EMathError do
sqlite3_result_null(Context);
end;
Exit;
end;
end;
sqlite3_result_argument_error(Context);
end;
procedure sqlite3_function_radians(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
sqlite3_result_double(Context, sqlite3_value_double(p) * PI / 180.0);
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_sign(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
d: Double;
i: Int64;
r: Integer;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER:
begin
i := sqlite3_value_int64(p);
if i < 0 then
r := -1
else
if i > 0 then
r := 1
else
r := 0;
sqlite3_result_int(Context, r);
end;
SQLITE_FLOAT:
begin
d := sqlite3_value_double(p);
if d < 0 then
r := -1
else
if d > 0 then
r := 1
else
r := 0;
sqlite3_result_int(Context, r);
end;
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_sin(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
sqlite3_result_double(Context, Sin(sqlite3_value_double(p)));
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_sqrt(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
v: Double;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
begin
v := sqlite3_value_double(p);
if v >= 0.0 then
sqlite3_result_double(Context, Sqrt(v))
else
sqlite3_result_null(Context);
end;
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_function_tan(Context: Pointer; nArgs: Integer; Args: PPointerArray);
var
p: Pointer;
begin
p := Args[0];
case sqlite3_value_type(p) of
SQLITE_INTEGER, SQLITE_FLOAT:
sqlite3_result_double(Context, Tan(sqlite3_value_double(p)));
else
sqlite3_result_argument_error(Context);
end;
end;
procedure sqlite3_create_math_functions(const ADBHandle: TDISQLite3DatabaseHandle);
begin
if Assigned(ADBHandle) then
begin
sqlite3_check(sqlite3_create_function(ADBHandle, 'acos', 1, 0, nil, sqlite3_function_acos, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'asin', 1, 0, nil, sqlite3_function_asin, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'atan', 1, 0, nil, sqlite3_function_atan, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'atan', 2, 0, nil, sqlite3_function_atan2, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'atan2', 2, 0, nil, sqlite3_function_atan2, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'ceil', 1, 0, nil, sqlite3_function_ceiling, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'ceiling', 1, 0, nil, sqlite3_function_ceiling, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'cos', 1, 0, nil, sqlite3_function_cos, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'cot', 1, 0, nil, sqlite3_function_cot, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'degrees', 1, 0, nil, sqlite3_function_degrees, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'exp', 1, 0, nil, sqlite3_function_exp, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'floor', 1, 0, nil, sqlite3_function_floor, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'ln', 1, 0, nil, sqlite3_function_ln, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'log', 1, 0, nil, sqlite3_function_ln, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'log', 2, 0, nil, sqlite3_function_logN, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'log2', 1, 0, nil, sqlite3_function_log2, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'log10', 1, 0, nil, sqlite3_function_log10, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'mod', 2, 0, nil, sqlite3_function_mod, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'pi', 0, 0, nil, sqlite3_function_pi, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'pow', 2, 0, nil, sqlite3_function_pow, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'radians', 1, 0, nil, sqlite3_function_radians, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'sign', 1, 0, nil, sqlite3_function_sign, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'sin', 1, 0, nil, sqlite3_function_sin, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'sqrt', 1, 0, nil, sqlite3_function_sqrt, nil, nil), ADBHandle);
sqlite3_check(sqlite3_create_function(ADBHandle, 'tan', 1, 0, nil, sqlite3_function_tan, nil, nil), ADBHandle);
end;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?