ext/duckdb/result.c in duckdb-1.0.0.2 vs ext/duckdb/result.c in duckdb-1.1.0.0

- old
+ new

@@ -16,24 +16,15 @@ static ID id__to_time_from_duckdb_timestamp_s; static ID id__to_time_from_duckdb_timestamp_ms; static ID id__to_time_from_duckdb_timestamp_ns; static ID id__to_time_from_duckdb_time_tz; static ID id__to_time_from_duckdb_timestamp_tz; +static ID id__to_infinity; static void deallocate(void *ctx); static VALUE allocate(VALUE klass); static size_t memsize(const void *p); -static VALUE to_ruby_obj_boolean(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_utinyint(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_hugeint(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_decimal(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx); -static VALUE to_ruby_obj_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx); static VALUE duckdb_result_column_count(VALUE oDuckDBResult); static VALUE duckdb_result_row_count(VALUE oDuckDBResult); static VALUE duckdb_result_rows_changed(VALUE oDuckDBResult); static VALUE duckdb_result_columns(VALUE oDuckDBResult); static VALUE duckdb_result_streaming_p(VALUE oDuckDBResult); @@ -41,36 +32,27 @@ static VALUE duckdb_result_chunk_each(VALUE oDuckDBResult); static VALUE duckdb_result__chunk_stream(VALUE oDuckDBResult); static VALUE yield_rows(VALUE arg); static VALUE duckdb_result__column_type(VALUE oDuckDBResult, VALUE col_idx); -static VALUE duckdb_result__is_null(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_boolean(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_smallint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_utinyint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_integer(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result___to_hugeint_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result___to_decimal_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_string_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); -static VALUE duckdb_result__to_blob(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx); +static VALUE duckdb_result__return_type(VALUE oDuckDBResult); +static VALUE duckdb_result__statement_type(VALUE oDuckDBResult); static VALUE duckdb_result__enum_internal_type(VALUE oDuckDBResult, VALUE col_idx); static VALUE duckdb_result__enum_dictionary_size(VALUE oDuckDBResult, VALUE col_idx); static VALUE duckdb_result__enum_dictionary_value(VALUE oDuckDBResult, VALUE col_idx, VALUE idx); +static VALUE infinite_date_value(duckdb_date date); static VALUE vector_date(void *vector_data, idx_t row_idx); static VALUE vector_timestamp(void* vector_data, idx_t row_idx); static VALUE vector_time(void* vector_data, idx_t row_idx); static VALUE vector_interval(void* vector_data, idx_t row_idx); static VALUE vector_blob(void* vector_data, idx_t row_idx); static VALUE vector_varchar(void* vector_data, idx_t row_idx); static VALUE vector_hugeint(void* vector_data, idx_t row_idx); static VALUE vector_uhugeint(void* vector_data, idx_t row_idx); static VALUE vector_decimal(duckdb_logical_type ty, void* vector_data, idx_t row_idx); +static VALUE infinite_timestamp_value(duckdb_timestamp timestamp); static VALUE vector_timestamp_s(void* vector_data, idx_t row_idx); static VALUE vector_timestamp_ms(void* vector_data, idx_t row_idx); static VALUE vector_timestamp_ns(void* vector_data, idx_t row_idx); static VALUE vector_enum(duckdb_logical_type ty, void* vector_data, idx_t row_idx); static VALUE vector_array(duckdb_logical_type ty, duckdb_vector vector, idx_t row_idx); @@ -111,118 +93,10 @@ rubyDuckDBResult *ctx; TypedData_Get_Struct(obj, rubyDuckDBResult, &result_data_type, ctx); return ctx; } -static VALUE to_ruby_obj_boolean(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_boolean` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - bool bval = duckdb_value_boolean(result, col_idx, row_idx); - return bval ? Qtrue : Qfalse; -#endif -} - -static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_smallint` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - int16_t i16val = duckdb_value_int16(result, col_idx, row_idx); - return INT2FIX(i16val); -#endif -} - -static VALUE to_ruby_obj_utinyint(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_utinyint` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - uint8_t ui8val = duckdb_value_uint8(result, col_idx, row_idx); - return UINT2NUM(ui8val); -#endif -} - -static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_integer` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - int32_t i32val = duckdb_value_int32(result, col_idx, row_idx); - return INT2NUM(i32val); -#endif -} - -static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_bigint` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - int64_t i64val = duckdb_value_int64(result, col_idx, row_idx); - return LL2NUM(i64val); -#endif -} - -static VALUE to_ruby_obj_hugeint(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `__to_hugeint_internal` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - duckdb_hugeint hugeint = duckdb_value_hugeint(result, col_idx, row_idx); - return rb_ary_new3(2, ULL2NUM(hugeint.lower), LL2NUM(hugeint.upper)); -#endif -} - -static VALUE to_ruby_obj_decimal(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `__to_decimal_internal` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - duckdb_decimal decimal = duckdb_value_decimal(result, col_idx, row_idx); - return rb_ary_new3(4, ULL2NUM(decimal.value.lower), LL2NUM(decimal.value.upper), UINT2NUM(decimal.width), UINT2NUM(decimal.scale)); -#endif -} - -static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_float` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - float fval = duckdb_value_float(result, col_idx, row_idx); - return DBL2NUM(fval); -#endif -} - -static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx) { -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_double` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - double dval = duckdb_value_double(result, col_idx, row_idx); - return DBL2NUM(dval); -#endif -} - -static VALUE to_ruby_obj_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx) { - -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - VALUE str; - rb_warn("private method `_to_blob` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - duckdb_blob bval = duckdb_value_blob(result, col_idx, row_idx); - str = rb_str_new(bval.data, bval.size); - - if (bval.data) { - duckdb_free(bval.data); - } - - return str; -#endif -} - /* * call-seq: * result.rows_changed -> integer * * Returns the count of rows changed. @@ -431,134 +305,22 @@ rubyDuckDBResult *ctx; TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); return LL2NUM(duckdb_column_type(&(ctx->result), NUM2LL(col_idx))); } -static VALUE duckdb_result__is_null(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { +static VALUE duckdb_result__return_type(VALUE oDuckDBResult) { rubyDuckDBResult *ctx; - bool is_null; -#ifdef DUCKDB_API_NO_DEPRECATED - return Qfalse; -#else - rb_warn("private method `_null?` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - is_null = duckdb_value_is_null(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); - return is_null ? Qtrue : Qfalse; -#endif + return INT2FIX(duckdb_result_return_type(ctx->result)); } -static VALUE duckdb_result__to_boolean(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { +static VALUE duckdb_result__statement_type(VALUE oDuckDBResult) { rubyDuckDBResult *ctx; TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_boolean(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)) ? Qtrue : Qfalse; + return INT2FIX(duckdb_result_statement_type(ctx->result)); } -static VALUE duckdb_result__to_smallint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_smallint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result__to_utinyint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_utinyint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result__to_integer(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_integer(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_bigint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result___to_hugeint_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_hugeint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result___to_decimal_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_decimal(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_float(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_double(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - -static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - duckdb_string p; - VALUE obj; - -#ifdef DUCKDB_API_NO_DEPRECATED - return Qnil; -#else - rb_warn("private method `_to_string` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - p = duckdb_value_string(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); - if (p.data) { - obj = rb_utf8_str_new(p.data, p.size); - duckdb_free(p.data); - return obj; - } -#endif - return Qnil; -} - -static VALUE duckdb_result__to_string_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - duckdb_string p; - VALUE obj; -#ifdef DUCKDB_API_NO_DEPRECATED - // duckdb_value_string_internal will be deprecated in the future. -#else - rb_warn("private method `_to_string_internal` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true."); - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - p = duckdb_value_string_internal(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); - if (p.data) { - obj = rb_utf8_str_new(p.data, p.size); - return obj; - } -#endif - return Qnil; -} - -static VALUE duckdb_result__to_blob(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) { - rubyDuckDBResult *ctx; - TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx); - - return to_ruby_obj_blob(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)); -} - static VALUE duckdb_result__enum_internal_type(VALUE oDuckDBResult, VALUE col_idx) { rubyDuckDBResult *ctx; VALUE type = Qnil; duckdb_logical_type logical_type; @@ -606,31 +368,51 @@ VALUE rbduckdb_create_result(void) { return allocate(cDuckDBResult); } +static VALUE infinite_date_value(duckdb_date date) { + if (duckdb_is_finite_date(date) == false) { + return rb_funcall(mDuckDBConverter, id__to_infinity, 1, + INT2NUM(date.days) + ); + } + return Qnil; +} + static VALUE vector_date(void *vector_data, idx_t row_idx) { - duckdb_date_struct date = duckdb_from_date(((duckdb_date *) vector_data)[row_idx]); + duckdb_date date = ((duckdb_date *) vector_data)[row_idx]; + VALUE obj = infinite_date_value(date); - return rb_funcall(mDuckDBConverter, id__to_date, 3, - INT2FIX(date.year), - INT2FIX(date.month), - INT2FIX(date.day) - ); + if (obj == Qnil) { + duckdb_date_struct date_st = duckdb_from_date(date); + obj = rb_funcall(mDuckDBConverter, id__to_date, 3, + INT2FIX(date_st.year), + INT2FIX(date_st.month), + INT2FIX(date_st.day) + ); + } + return obj; } static VALUE vector_timestamp(void* vector_data, idx_t row_idx) { - duckdb_timestamp_struct data = duckdb_from_timestamp(((duckdb_timestamp *)vector_data)[row_idx]); - return rb_funcall(mDuckDBConverter, id__to_time, 7, - INT2FIX(data.date.year), - INT2FIX(data.date.month), - INT2FIX(data.date.day), - INT2FIX(data.time.hour), - INT2FIX(data.time.min), - INT2FIX(data.time.sec), - INT2NUM(data.time.micros) - ); + duckdb_timestamp data = ((duckdb_timestamp *)vector_data)[row_idx]; + VALUE obj = infinite_timestamp_value(data); + + if (obj == Qnil) { + duckdb_timestamp_struct data_st = duckdb_from_timestamp(data); + return rb_funcall(mDuckDBConverter, id__to_time, 7, + INT2FIX(data_st.date.year), + INT2FIX(data_st.date.month), + INT2FIX(data_st.date.day), + INT2FIX(data_st.time.hour), + INT2FIX(data_st.time.min), + INT2FIX(data_st.time.sec), + INT2NUM(data_st.time.micros) + ); + } + return obj; } static VALUE vector_time(void* vector_data, idx_t row_idx) { duckdb_time_struct data = duckdb_from_time(((duckdb_time *)vector_data)[row_idx]); return rb_funcall(mDuckDBConverter, id__to_time_from_duckdb_time, 4, @@ -721,15 +503,24 @@ upper, lower ); } +static VALUE infinite_timestamp_value(duckdb_timestamp timestamp) { + if (duckdb_is_finite_timestamp(timestamp) == false) { + return rb_funcall(mDuckDBConverter, id__to_infinity, 1, + LL2NUM(timestamp.micros) + ); + } + return Qnil; +} + static VALUE vector_timestamp_s(void* vector_data, idx_t row_idx) { duckdb_timestamp data = ((duckdb_timestamp *)vector_data)[row_idx]; return rb_funcall(mDuckDBConverter, id__to_time_from_duckdb_timestamp_s, 1, LL2NUM(data.micros) - ); + ); } static VALUE vector_timestamp_ms(void* vector_data, idx_t row_idx) { duckdb_timestamp data = ((duckdb_timestamp *)vector_data)[row_idx]; return rb_funcall(mDuckDBConverter, id__to_time_from_duckdb_timestamp_ms, 1, @@ -1097,10 +888,11 @@ id__to_time_from_duckdb_timestamp_s = rb_intern("_to_time_from_duckdb_timestamp_s"); id__to_time_from_duckdb_timestamp_ms = rb_intern("_to_time_from_duckdb_timestamp_ms"); id__to_time_from_duckdb_timestamp_ns = rb_intern("_to_time_from_duckdb_timestamp_ns"); id__to_time_from_duckdb_time_tz = rb_intern("_to_time_from_duckdb_time_tz"); id__to_time_from_duckdb_timestamp_tz = rb_intern("_to_time_from_duckdb_timestamp_tz"); + id__to_infinity = rb_intern("_to_infinity"); rb_define_alloc_func(cDuckDBResult, allocate); rb_define_method(cDuckDBResult, "column_count", duckdb_result_column_count, 0); rb_define_method(cDuckDBResult, "row_count", duckdb_result_row_count, 0); /* deprecated */ @@ -1108,23 +900,12 @@ rb_define_method(cDuckDBResult, "columns", duckdb_result_columns, 0); rb_define_method(cDuckDBResult, "streaming?", duckdb_result_streaming_p, 0); rb_define_method(cDuckDBResult, "chunk_each", duckdb_result_chunk_each, 0); rb_define_private_method(cDuckDBResult, "_chunk_stream", duckdb_result__chunk_stream, 0); rb_define_private_method(cDuckDBResult, "_column_type", duckdb_result__column_type, 1); + rb_define_private_method(cDuckDBResult, "_return_type", duckdb_result__return_type, 0); + rb_define_private_method(cDuckDBResult, "_statement_type", duckdb_result__statement_type, 0); - rb_define_private_method(cDuckDBResult, "_null?", duckdb_result__is_null, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_boolean", duckdb_result__to_boolean, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_smallint", duckdb_result__to_smallint, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_utinyint", duckdb_result__to_utinyint, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_integer", duckdb_result__to_integer, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_bigint", duckdb_result__to_bigint, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "__to_hugeint_internal", duckdb_result___to_hugeint_internal, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "__to_decimal_internal", duckdb_result___to_decimal_internal, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_float", duckdb_result__to_float, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_double", duckdb_result__to_double, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_string", duckdb_result__to_string, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_string_internal", duckdb_result__to_string_internal, 2); /* deprecated */ - rb_define_private_method(cDuckDBResult, "_to_blob", duckdb_result__to_blob, 2); /* deprecated */ rb_define_private_method(cDuckDBResult, "_enum_internal_type", duckdb_result__enum_internal_type, 1); rb_define_private_method(cDuckDBResult, "_enum_dictionary_size", duckdb_result__enum_dictionary_size, 1); rb_define_private_method(cDuckDBResult, "_enum_dictionary_value", duckdb_result__enum_dictionary_value, 2); }