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 + -
显示快捷键?