%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%

%%

-module(sqlserver).

%% Note: This directive should only be used in test suites.
-compile(export_all).

%-------------------------------------------------------------------------
connection_string() ->
  "DSN=sql-server;UID=odbctest;PWD=gurka".

%-------------------------------------------------------------------------
insert_result() ->
    {selected,["ID","DATA"],[{1,"bar"}]}.

update_result() ->
    {selected,["ID","DATA"],[{1,"foo"}]}.

selected_ID(N, _) ->
    {selected,["ID"],[{N}]}.

selected_next_N(1)->
    {selected,["ID"],
     [{1},
      {2},
      {3}]};

selected_next_N(2)->
    {selected,["ID"],
     [{4},
      {5}]}.

selected_relative_N(1)->
    {selected,["ID"],
     [{2},
      {3},
      {4}]};

selected_relative_N(2)->
    {selected,["ID"],
     [{7},
      {8}]}.

selected_absolute_N(1)->
    {selected,["ID"],
     [{1},
      {2},
      {3}]};

selected_absolute_N(2)->
    {selected,["ID"],
     [{1},
      {2},
      {3},
      {4},
      {5}]}.

selected_list_rows() ->
    {selected,["ID", "DATA"],[[1, "bar"],[2,"foo"]]}.

first_list_rows() ->
    {selected,["ID", "DATA"],[[1, "bar"]]}.
last_list_rows() ->
    {selected,["ID", "DATA"],[[2, "foo"]]}.
prev_list_rows() ->
    {selected,["ID", "DATA"],[[1, "bar"]]}.
next_list_rows() ->
    {selected,["ID", "DATA"],[[2, "foo"]]}.

multiple_select()->
    [{selected,["ID", "DATA"],[{1, "bar"},{2, "foo"}]},
     {selected,["DATA"],[{"foo"}]}].

multiple_mix()->
    [{updated, 1},{updated, 1},
     {selected,["ID", "DATA"],[{1, "foobar"},{2, "foo"}]},
     {updated, 1}, {selected,["DATA"],[{"foo"}]}].

%-------------------------------------------------------------------------
fixed_char_min() ->
    1.

fixed_char_max() ->
    8000.

create_fixed_char_table(Size) ->
    " (FIELD char(" ++ integer_to_list(Size) ++ "))".

%-------------------------------------------------------------------------
var_char_min() ->
    1.
var_char_max() ->
    8000. 

create_var_char_table(Size) ->
    " (FIELD varchar(" ++ integer_to_list(Size) ++ "))".
%-------------------------------------------------------------------------
text_min() ->
    1.
text_max() ->
    2147483647. %% 2^31 - 1 

create_text_table() ->
    " (FIELD text)".

%-------------------------------------------------------------------------
create_unicode_table() ->
    " (FIELD nvarchar(50))".

%-------------------------------------------------------------------------
create_timestamp_table() ->
    " (FIELD DATETIME)". 

%-------------------------------------------------------------------------
tiny_int_min() ->
    0.
tiny_int_max() ->
    255.

create_tiny_int_table() ->
     " (FIELD tinyint)".

tiny_int_min_selected() ->
    {selected,["FIELD"],[{tiny_int_min()}]}.

tiny_int_max_selected() ->
    {selected,["FIELD"], [{tiny_int_max()}]}.

%-------------------------------------------------------------------------
small_int_min() ->
    -32768. % -2^15
small_int_max() ->
    32767. % 2^15-1

create_small_int_table() ->
     " (FIELD smallint)".

small_int_min_selected() ->
    {selected,["FIELD"],[{small_int_min()}]}.

small_int_max_selected() ->
    {selected,["FIELD"], [{small_int_max()}]}.

%-------------------------------------------------------------------------
int_min() ->
    -2147483648. % -2^31
int_max() ->
    2147483647.  % 2^31-1

create_int_table() ->
     " (FIELD int)".

int_min_selected() ->
    {selected,["FIELD"],[{int_min()}]}.

int_max_selected() ->
    {selected,["FIELD"], [{int_max()}]}.

%-------------------------------------------------------------------------
big_int_min() ->
    -9223372036854775808. % -2^63
big_int_max() ->
    9223372036854775807. % 2^63-1

create_big_int_table() ->
     " (FIELD bigint)". 

big_int_min_selected() ->
    {selected,["FIELD"],[{integer_to_list(big_int_min())}]}.

big_int_max_selected() ->
    {selected,["FIELD"], [{integer_to_list(big_int_max())}]}.

%-------------------------------------------------------------------------
bit_false() ->
    0.
bit_true() ->
    1.

create_bit_table() ->
     " (FIELD bit)".

bit_false_selected() ->
    {selected,["FIELD"],[{false}]}.

bit_true_selected() ->
    {selected,["FIELD"], [{true}]}.
%-------------------------------------------------------------------------
float_min() ->
    -1.79e+308.
float_max() ->
    1.79e+308.

float_underflow() ->
    "'-1.80e+308'".

float_overflow() ->
    "'-1.80e+308'".

create_float_table() ->
    " (FIELD float)".

float_zero_selected() ->
    {selected,["FIELD"],[{0.00000e+0}]}.
%-------------------------------------------------------------------------
real_min() ->
    -3.40e+38.
real_max() ->
    3.40e+38.

real_underflow() ->
    -3.41e+38.

real_overflow() ->
    3.41e+38.

create_real_table() ->
    " (FIELD real)".

real_zero_selected() ->
    {selected,["FIELD"],[{0.00000e+0}]}.
%-------------------------------------------------------------------------
param_select_tiny_int() ->
    {selected,["FIELD"],[{1}, {2}]}.

param_select_small_int() ->
    {selected,["FIELD"],[{1}, {2}]}.

param_select_int() ->
    Int = small_int_max() + 1,
    {selected,["FIELD"],[{1}, {Int}]}.

param_select_decimal() ->
    {selected,["FIELD"],[{1},{2}]}.

param_select_numeric() ->
    {selected,["FIELD"],[{1},{2}]}.

param_select_float() ->
    {selected,["FIELD"],[{1.30000},{1.20000}]}.

param_select_real() ->
    {selected,["FIELD"],[{1.30000},{1.20000}]}.

param_select_double() ->
   {selected,["FIELD"],[{1.30000},{1.20000}]}.

param_select_mix() ->
    {selected,["ID","DATA"],[{1, "foo"}, {2, "bar"}]}.

param_update() ->
    {selected,["ID","DATA"],[{1, "foobar"}, {2, "foobar"}, {3, "baz"}]}.

param_delete() ->
    {selected,["ID","DATA"],[{3, "baz"}]}.

param_select() ->
    {selected,["ID","DATA"],[{1, "foo"},{3, "foo"}]}.

%-------------------------------------------------------------------------

describe_integer() ->
    {ok,[{"int1", sql_smallint},{"int2", sql_integer},
	 {"int3", sql_integer}]}.

describe_string() ->
    {ok,[{"str1",{sql_char,10}},                           
	 {"str2",{sql_char,10}},
	 {"str3",{sql_varchar,10}},
	 {"str4",{sql_varchar,10}}]}.

describe_floating() ->
    {ok,[{"f", sql_real},{"r", sql_real}, {"d", {sql_float, 53}}]}.

describe_dec_num() ->
    {ok,[{"dec",{sql_decimal,9,3}},{"num",{sql_numeric,9,2}}]}.

describe_timestamp() ->
    {ok, [{"field", sql_timestamp}]}.