downpour 0.0.2 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/downpour/connection.c +58 -3
- data/ext/downpour/downpour.c +3 -0
- data/ext/downpour/downpour.h +11 -2
- data/ext/downpour/memory_allocation.c +93 -0
- data/ext/downpour/module.c +1 -1
- data/ext/downpour/query.c +27 -0
- data/ext/downpour/result.c +13 -13
- data/ext/downpour/status.c +36 -1
- data/lib/downpour/version.rb +1 -1
- data/spec/downpour/concurrent_spec.rb +31 -0
- data/spec/downpour/connect_type_spec.rb +35 -0
- data/spec/downpour/connection_spec.rb +41 -0
- data/spec/downpour/insert_spec.rb +1 -1
- data/spec/downpour/select_spec.rb +7 -10
- metadata +10 -4
- data/spec/downpour/query_spec.rb +0 -27
data/ext/downpour/connection.c
CHANGED
@@ -1,6 +1,24 @@
|
|
1
1
|
#include "downpour.h"
|
2
2
|
|
3
3
|
#define SELF_TYPE drizzle_con_st
|
4
|
+
#define attr(foo, conversion) static VALUE attr_##foo(VALUE self)\
|
5
|
+
{\
|
6
|
+
read_self_ptr();\
|
7
|
+
return conversion(drizzle_con_##foo(self_ptr));\
|
8
|
+
}
|
9
|
+
#define settr(foo) static VALUE settr_##foo(VALUE self, VALUE newValue)\
|
10
|
+
{\
|
11
|
+
read_self_ptr();\
|
12
|
+
Check_Type(newValue, T_STRING);\
|
13
|
+
drizzle_con_set_##foo(self_ptr, RSTRING_PTR(newValue));\
|
14
|
+
return newValue;\
|
15
|
+
}
|
16
|
+
#define attr_string(foo) attr(foo, rb_str_new2)
|
17
|
+
#define prop(foo) attr_string(foo) settr(foo)
|
18
|
+
|
19
|
+
#define define_attr(foo) rb_define_method(DrizzleConnection, #foo, attr_##foo, 0)
|
20
|
+
#define define_settr(foo) rb_define_method(DrizzleConnection, #foo "=", settr_##foo, 1)
|
21
|
+
#define define_prop(foo) define_attr(foo); define_settr(foo)
|
4
22
|
|
5
23
|
static VALUE query(VALUE self, VALUE query)
|
6
24
|
{
|
@@ -16,15 +34,52 @@ static VALUE query(VALUE self, VALUE query)
|
|
16
34
|
return downpour_result_constructor(result, self);
|
17
35
|
}
|
18
36
|
|
37
|
+
static VALUE connection_close(VALUE self)
|
38
|
+
{
|
39
|
+
read_self_ptr();
|
40
|
+
drizzle_con_close(self_ptr);
|
41
|
+
return Qnil;
|
42
|
+
}
|
43
|
+
|
44
|
+
attr_string(error);
|
45
|
+
attr(errno, INT2NUM);
|
46
|
+
attr(error_code, UINT2NUM);
|
47
|
+
attr_string(sqlstate);
|
48
|
+
attr_string(host);
|
49
|
+
attr(port, UINT2NUM);
|
50
|
+
prop(uds);
|
51
|
+
attr_string(user);
|
52
|
+
attr_string(password);
|
53
|
+
prop(db);
|
54
|
+
attr(protocol_version, UINT2NUM);
|
55
|
+
attr_string(server_version);
|
56
|
+
attr(server_version_number, UINT2NUM);
|
57
|
+
attr(thread_id, UINT2NUM);
|
58
|
+
attr(max_packet_size, UINT2NUM);
|
59
|
+
|
19
60
|
VALUE downpour_connection_constructor(drizzle_con_st *self_ptr, VALUE status)
|
20
61
|
{
|
21
|
-
|
22
|
-
rb_iv_set(ret, "@status", status);
|
23
|
-
return ret;
|
62
|
+
return to_ruby_object(self_ptr, DrizzleConnection, status, drizzle_con_free, drizzle_con_set_context);
|
24
63
|
}
|
25
64
|
|
26
65
|
void init_drizzle_connection()
|
27
66
|
{
|
28
67
|
DrizzleConnection = drizzle_gem_create_class_with_private_constructor("Connection", rb_cObject);
|
29
68
|
rb_define_method(DrizzleConnection, "query", query, 1);
|
69
|
+
define_attr(error);
|
70
|
+
define_attr(errno);
|
71
|
+
define_attr(error_code);
|
72
|
+
define_attr(sqlstate);
|
73
|
+
define_attr(host);
|
74
|
+
define_attr(port);
|
75
|
+
define_prop(uds);
|
76
|
+
define_attr(user);
|
77
|
+
define_attr(password);
|
78
|
+
define_prop(db);
|
79
|
+
define_attr(protocol_version);
|
80
|
+
define_attr(server_version);
|
81
|
+
define_attr(server_version_number);
|
82
|
+
define_attr(thread_id);
|
83
|
+
define_attr(max_packet_size);
|
84
|
+
rb_define_method(DrizzleConnection, "close!", connection_close, 0);
|
30
85
|
}
|
data/ext/downpour/downpour.c
CHANGED
@@ -4,11 +4,13 @@ VALUE DownpourModule;
|
|
4
4
|
VALUE DrizzleStatus;
|
5
5
|
VALUE DrizzleConnection;
|
6
6
|
VALUE DrizzleResult;
|
7
|
+
VALUE DrizzleQuery;
|
7
8
|
|
8
9
|
void init_downpour_module();
|
9
10
|
void init_drizzle_status();
|
10
11
|
void init_drizzle_connection();
|
11
12
|
void init_drizzle_result();
|
13
|
+
void init_drizzle_query();
|
12
14
|
|
13
15
|
void Init_downpour()
|
14
16
|
{
|
@@ -16,4 +18,5 @@ void Init_downpour()
|
|
16
18
|
init_drizzle_status();
|
17
19
|
init_drizzle_connection();
|
18
20
|
init_drizzle_result();
|
21
|
+
init_drizzle_query();
|
19
22
|
}
|
data/ext/downpour/downpour.h
CHANGED
@@ -9,23 +9,32 @@ extern VALUE DownpourModule;
|
|
9
9
|
extern VALUE DrizzleStatus;
|
10
10
|
extern VALUE DrizzleConnection;
|
11
11
|
extern VALUE DrizzleResult;
|
12
|
+
extern VALUE DrizzleQuery;
|
13
|
+
|
14
|
+
// All mark and release methods
|
15
|
+
typedef void (*FREE_METHOD)(void* ptr);
|
16
|
+
typedef void (*SET_CONTEXT)(void* ptr, void *context);
|
17
|
+
void *downpour_from_ruby_object(VALUE value);
|
18
|
+
VALUE downpour_to_ruby_object(void *ptr, VALUE klass, VALUE parent, FREE_METHOD free_method, SET_CONTEXT set_context);
|
19
|
+
VALUE downpour_get_ruby_object(void *ptr);
|
12
20
|
|
13
21
|
// All Constructors
|
14
22
|
VALUE downpour_constructor(drizzle_st *self_ptr);
|
15
23
|
VALUE downpour_connection_constructor(drizzle_con_st *self_ptr, VALUE status);
|
16
24
|
VALUE downpour_result_constructor(drizzle_result_st *self_ptr, VALUE connection);
|
25
|
+
VALUE downpour_query_constructor(drizzle_query_st *self_ptr, VALUE connection);
|
17
26
|
|
18
27
|
VALUE drizzle_gem_create_class_with_private_constructor(const char *name, VALUE super);
|
19
28
|
void drizzle_gem_assert_value_is_ok(drizzle_return_t value);
|
20
29
|
VALUE drizzle_gem_to_string_array(char **array, long count);
|
21
30
|
const char *drizzle_gem_read_string_with_default(VALUE string, const char *default_value);
|
22
31
|
|
23
|
-
#define convert_to_struct(datatype, var_name, value) datatype *var_name;
|
32
|
+
#define convert_to_struct(datatype, var_name, value) datatype *var_name; var_name = downpour_from_ruby_object(value)
|
24
33
|
#define read_self_ptr() convert_to_struct(SELF_TYPE, self_ptr, self)
|
25
34
|
#define CHECK_OK(value) drizzle_gem_assert_value_is_ok(value)
|
26
35
|
#define rb_call(self, string) rb_funcall(self, rb_intern(string), 0)
|
27
36
|
#define read_string(value, default_value) drizzle_gem_read_string_with_default(value, default_value)
|
28
37
|
#define drizzle_alloc(type) ((type *) malloc(sizeof(type)))
|
29
|
-
#define
|
38
|
+
#define to_ruby_object(ptr, klass, parent, free_method, set_context) downpour_to_ruby_object(ptr, klass, parent, (FREE_METHOD) (free_method), (SET_CONTEXT) (set_context))
|
30
39
|
|
31
40
|
#endif
|
@@ -0,0 +1,93 @@
|
|
1
|
+
#include "downpour.h"
|
2
|
+
|
3
|
+
typedef struct DownpourWrapper {
|
4
|
+
int reference_count;
|
5
|
+
void *ptr;
|
6
|
+
struct DownpourWrapper *parent;
|
7
|
+
FREE_METHOD free_method;
|
8
|
+
VALUE rb_object;
|
9
|
+
} DownpourWrapper;
|
10
|
+
|
11
|
+
static void downpour_mark(DownpourWrapper *wrapper)
|
12
|
+
{
|
13
|
+
if(wrapper == NULL)
|
14
|
+
return;
|
15
|
+
|
16
|
+
wrapper->reference_count++;
|
17
|
+
}
|
18
|
+
|
19
|
+
static void downpour_release(DownpourWrapper *wrapper)
|
20
|
+
{
|
21
|
+
if(wrapper == NULL)
|
22
|
+
return;
|
23
|
+
|
24
|
+
wrapper->reference_count--;
|
25
|
+
|
26
|
+
if(wrapper->reference_count == 0) {
|
27
|
+
wrapper->free_method(wrapper->ptr);
|
28
|
+
downpour_release(wrapper->parent);
|
29
|
+
free(wrapper);
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
static DownpourWrapper *downpour_wrap_pointer(void *ptr, DownpourWrapper *parent, FREE_METHOD free_method)
|
34
|
+
{
|
35
|
+
DownpourWrapper *wrapper = drizzle_alloc(DownpourWrapper);
|
36
|
+
wrapper->ptr = ptr;
|
37
|
+
wrapper->parent = parent;
|
38
|
+
wrapper->free_method = free_method;
|
39
|
+
wrapper->reference_count = 0;
|
40
|
+
|
41
|
+
downpour_mark(parent);
|
42
|
+
downpour_mark(wrapper);
|
43
|
+
return wrapper;
|
44
|
+
}
|
45
|
+
|
46
|
+
static void mark_for_ruby_gc(DownpourWrapper *wrapper)
|
47
|
+
{
|
48
|
+
if(wrapper == NULL)
|
49
|
+
return;
|
50
|
+
|
51
|
+
rb_gc_mark(wrapper->rb_object);
|
52
|
+
|
53
|
+
mark_for_ruby_gc(wrapper->parent);
|
54
|
+
}
|
55
|
+
|
56
|
+
static DownpourWrapper *get_wrapper_from_object(VALUE value)
|
57
|
+
{
|
58
|
+
if(value == Qnil)
|
59
|
+
return NULL;
|
60
|
+
|
61
|
+
DownpourWrapper *wrapper = NULL;
|
62
|
+
Data_Get_Struct(value, DownpourWrapper, wrapper);
|
63
|
+
return wrapper;
|
64
|
+
}
|
65
|
+
|
66
|
+
VALUE downpour_get_ruby_object(void *ptr)
|
67
|
+
{
|
68
|
+
if(ptr == NULL)
|
69
|
+
return Qnil;
|
70
|
+
|
71
|
+
DownpourWrapper *wrapper = (DownpourWrapper *)ptr;
|
72
|
+
return wrapper->rb_object;
|
73
|
+
}
|
74
|
+
|
75
|
+
void *downpour_from_ruby_object(VALUE value)
|
76
|
+
{
|
77
|
+
DownpourWrapper *wrapper;
|
78
|
+
wrapper = get_wrapper_from_object(value);
|
79
|
+
return wrapper == NULL? NULL : wrapper->ptr;
|
80
|
+
}
|
81
|
+
|
82
|
+
VALUE downpour_to_ruby_object(void *ptr, VALUE klass, VALUE parent, FREE_METHOD free_method, SET_CONTEXT set_context)
|
83
|
+
{
|
84
|
+
if(ptr == NULL)
|
85
|
+
return Qnil;
|
86
|
+
|
87
|
+
DownpourWrapper *wrapper = downpour_wrap_pointer(ptr, get_wrapper_from_object(parent), free_method);
|
88
|
+
|
89
|
+
if(set_context != NULL)
|
90
|
+
set_context(ptr, wrapper);
|
91
|
+
|
92
|
+
return wrapper->rb_object = Data_Wrap_Struct(klass, mark_for_ruby_gc, downpour_release, wrapper);
|
93
|
+
}
|
data/ext/downpour/module.c
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
#include "downpour.h"
|
2
|
+
|
3
|
+
#define SELF_TYPE drizzle_query_st
|
4
|
+
|
5
|
+
static VALUE get_result(VALUE self)
|
6
|
+
{
|
7
|
+
read_self_ptr();
|
8
|
+
|
9
|
+
VALUE cached_result = rb_iv_get(self, "@result");
|
10
|
+
if(cached_result != Qnil)
|
11
|
+
return cached_result;
|
12
|
+
|
13
|
+
drizzle_result_st *result = drizzle_query_result(self_ptr);
|
14
|
+
VALUE ret = rb_iv_set(self, "@result", downpour_result_constructor(result, rb_iv_get(self, "@connection")));
|
15
|
+
return ret;
|
16
|
+
}
|
17
|
+
|
18
|
+
VALUE downpour_query_constructor(drizzle_query_st *self_ptr, VALUE connection)
|
19
|
+
{
|
20
|
+
return to_ruby_object(self_ptr, DrizzleQuery, connection, drizzle_query_free, drizzle_query_set_context);
|
21
|
+
}
|
22
|
+
|
23
|
+
void init_drizzle_query()
|
24
|
+
{
|
25
|
+
DrizzleQuery = drizzle_gem_create_class_with_private_constructor("Query", rb_cObject);
|
26
|
+
rb_define_method(DrizzleQuery, "result", get_result, 0);
|
27
|
+
}
|
data/ext/downpour/result.c
CHANGED
@@ -7,19 +7,15 @@ static uint64_t do_column_count(drizzle_result_st *self_ptr)
|
|
7
7
|
return drizzle_result_column_count(self_ptr);
|
8
8
|
}
|
9
9
|
|
10
|
-
static
|
10
|
+
static bool is_buffered_bool(VALUE self)
|
11
11
|
{
|
12
|
-
|
13
|
-
|
14
|
-
if(buffered == Qnil || buffered == Qfalse)
|
15
|
-
return Qfalse;
|
16
|
-
|
17
|
-
return buffered;
|
12
|
+
read_self_ptr();
|
13
|
+
return self_ptr->options & (DRIZZLE_RESULT_BUFFER_ROW);
|
18
14
|
}
|
19
15
|
|
20
|
-
static
|
16
|
+
static VALUE is_buffered(VALUE self)
|
21
17
|
{
|
22
|
-
return
|
18
|
+
return is_buffered_bool(self) ? Qtrue : Qfalse;
|
23
19
|
}
|
24
20
|
|
25
21
|
static VALUE buffer_if_needed(VALUE self)
|
@@ -31,7 +27,6 @@ static VALUE buffer_if_needed(VALUE self)
|
|
31
27
|
return Qfalse;
|
32
28
|
|
33
29
|
CHECK_OK(drizzle_result_buffer(self_ptr));
|
34
|
-
rb_iv_set(self, "@buffered", Qtrue);
|
35
30
|
return Qtrue;
|
36
31
|
}
|
37
32
|
|
@@ -105,11 +100,15 @@ static VALUE insert_id(VALUE self)
|
|
105
100
|
return UINT2NUM(drizzle_result_insert_id(self_ptr));
|
106
101
|
}
|
107
102
|
|
103
|
+
static VALUE error_code(VALUE self)
|
104
|
+
{
|
105
|
+
read_self_ptr();
|
106
|
+
return UINT2NUM(drizzle_result_error_code(self_ptr));
|
107
|
+
}
|
108
|
+
|
108
109
|
VALUE downpour_result_constructor(drizzle_result_st *self_ptr, VALUE connection)
|
109
110
|
{
|
110
|
-
|
111
|
-
rb_iv_set(ret, "@connection", connection);
|
112
|
-
return ret;
|
111
|
+
return to_ruby_object(self_ptr, DrizzleResult, connection, drizzle_result_free, NULL);
|
113
112
|
}
|
114
113
|
|
115
114
|
void init_drizzle_result()
|
@@ -121,4 +120,5 @@ void init_drizzle_result()
|
|
121
120
|
rb_define_method(DrizzleResult, "buffered?", is_buffered, 0);
|
122
121
|
rb_define_method(DrizzleResult, "next_row", next_row, 0);
|
123
122
|
rb_define_method(DrizzleResult, "insert_id", insert_id, 0);
|
123
|
+
rb_define_method(DrizzleResult, "error_code", error_code, 0);
|
124
124
|
}
|
data/ext/downpour/status.c
CHANGED
@@ -60,9 +60,41 @@ static VALUE verbose_name(VALUE self)
|
|
60
60
|
return rb_str_new2(drizzle_verbose_name(drizzle_verbose(self_ptr)));
|
61
61
|
}
|
62
62
|
|
63
|
+
static VALUE add_query(VALUE self, VALUE connection, VALUE query)
|
64
|
+
{
|
65
|
+
read_self_ptr();
|
66
|
+
convert_to_struct(drizzle_con_st, connection_ptr, connection);
|
67
|
+
Check_Type(query, T_STRING);
|
68
|
+
|
69
|
+
drizzle_query_st *query_ptr = drizzle_query_add(self_ptr, NULL, connection_ptr, NULL,
|
70
|
+
RSTRING_PTR(query), RSTRING_LEN(query), 0, NULL);
|
71
|
+
|
72
|
+
return downpour_query_constructor(query_ptr, connection);
|
73
|
+
}
|
74
|
+
|
75
|
+
static VALUE run_all(VALUE self)
|
76
|
+
{
|
77
|
+
read_self_ptr();
|
78
|
+
CHECK_OK(drizzle_query_run_all(self_ptr));
|
79
|
+
return Qnil;
|
80
|
+
}
|
81
|
+
|
82
|
+
static VALUE run_one(VALUE self)
|
83
|
+
{
|
84
|
+
read_self_ptr();
|
85
|
+
drizzle_return_t ret;
|
86
|
+
drizzle_query_st *query = drizzle_query_run(self_ptr, &ret);
|
87
|
+
CHECK_OK(ret);
|
88
|
+
|
89
|
+
if(query == NULL)
|
90
|
+
return Qnil;
|
91
|
+
|
92
|
+
return downpour_get_ruby_object(drizzle_query_context(query));
|
93
|
+
}
|
94
|
+
|
63
95
|
VALUE downpour_constructor(drizzle_st *self_ptr)
|
64
96
|
{
|
65
|
-
return
|
97
|
+
return to_ruby_object(self_ptr, DrizzleStatus, Qnil, drizzle_free, drizzle_set_context);
|
66
98
|
}
|
67
99
|
|
68
100
|
void init_drizzle_status()
|
@@ -73,4 +105,7 @@ void init_drizzle_status()
|
|
73
105
|
rb_define_method(DrizzleStatus, "verbose=", set_verbose, 1);
|
74
106
|
rb_define_method(DrizzleStatus, "verbose", get_verbose, 0);
|
75
107
|
rb_define_method(DrizzleStatus, "verbose_name", verbose_name, 0);
|
108
|
+
rb_define_method(DrizzleStatus, "add_query", add_query, 2);
|
109
|
+
rb_define_method(DrizzleStatus, "run_all!", run_all, 0);
|
110
|
+
rb_define_method(DrizzleStatus, "run!", run_one, 0);
|
76
111
|
}
|
data/lib/downpour/version.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
describe "a concurrent query" do
|
2
|
+
|
3
|
+
before(:each) do
|
4
|
+
@status = Downpour.create
|
5
|
+
@conn = create_connection(@status)
|
6
|
+
@conn2 = create_connection(@status)
|
7
|
+
@query1 = @status.add_query(@conn, "select * from Test1 where name like '%oo'");
|
8
|
+
@query2 = @status.add_query(@conn2, "select name from Test1 where name like '%ar'");
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should buffer all queries" do
|
12
|
+
@status.run_all!
|
13
|
+
@query1.result.should be_buffered
|
14
|
+
@query2.result.should be_buffered
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should run all queries" do
|
18
|
+
@status.run_all!
|
19
|
+
@query1.result.next_row.should == ["foo"]
|
20
|
+
@query2.result.next_row.should == ["bar"]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should run a query" do
|
24
|
+
rows = []
|
25
|
+
rows << @status.run!.result.next_row
|
26
|
+
rows << @status.run!.result.next_row
|
27
|
+
rows.should include(["foo"])
|
28
|
+
rows.should include(["bar"])
|
29
|
+
@status.run!.should be_nil
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
describe "Downpour connections" do
|
2
|
+
|
3
|
+
before(:each) do
|
4
|
+
@status = Downpour.create
|
5
|
+
@user = ENV["USER"]
|
6
|
+
@password = ""
|
7
|
+
@database = "test"
|
8
|
+
end
|
9
|
+
|
10
|
+
shared_examples_for "a working downpour connection" do
|
11
|
+
it "should count records" do
|
12
|
+
results = @connection.query "select * from Test1"
|
13
|
+
results.row_count.should == 3
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should read a row" do
|
17
|
+
results = @connection.query "select * from Test1"
|
18
|
+
results.next_row.should == ["foo"]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be used concurrently" do
|
22
|
+
query = @status.add_query(@connection, "select * from Test1")
|
23
|
+
@status.run_all!
|
24
|
+
query.result.next_row.should == ["foo"]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "over drizzle tcp protocol" do
|
29
|
+
before(:each) do
|
30
|
+
@connection = @status.add_tcp_connection('localhost', @user, @password, @database)
|
31
|
+
end
|
32
|
+
|
33
|
+
it_should_behave_like "a working downpour connection"
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
describe Downpour do
|
2
|
+
before(:each) do
|
3
|
+
@status = Downpour.create
|
4
|
+
@connection = create_connection(@status)
|
5
|
+
end
|
6
|
+
|
7
|
+
context "error handling" do
|
8
|
+
|
9
|
+
it "should catch errors" do
|
10
|
+
begin
|
11
|
+
query = @connection.query "this is invalid sql"
|
12
|
+
raise "should have failed here"
|
13
|
+
rescue IOError
|
14
|
+
@status.error.should == "You have an error in your SQL syntax; check the manual that corresponds to your Drizzle server version for the right syntax to use near 'this is invalid sql' at line 1"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should only accept a string as query" do
|
19
|
+
lambda {@connection.query 42}.should raise_error(TypeError)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "simple attributes" do
|
24
|
+
it "should change the database" do
|
25
|
+
@connection.db.should == "test"
|
26
|
+
@connection.db = "blah"
|
27
|
+
@connection.db.should == "blah"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should read simple attributes" do
|
31
|
+
@connection.port.should == 4427
|
32
|
+
@connection.user.should == ENV["USER"]
|
33
|
+
@connection.password.should == ""
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should close the connection" do
|
38
|
+
@connection.close!
|
39
|
+
# TODO: Find a way to assert on this
|
40
|
+
end
|
41
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
describe "select query" do
|
1
|
+
describe "a select query" do
|
2
2
|
|
3
3
|
before(:each) do
|
4
4
|
@status = Downpour.create
|
@@ -22,15 +22,6 @@ describe "select query" do
|
|
22
22
|
@results.buffer!.should be_false
|
23
23
|
end
|
24
24
|
|
25
|
-
it "should count columns" do
|
26
|
-
@results.column_count.should == 1
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should not buffer when reading a single row" do
|
30
|
-
@results.next_row
|
31
|
-
@results.should_not be_buffered
|
32
|
-
end
|
33
|
-
|
34
25
|
shared_examples_for "a read query" do
|
35
26
|
it "should read all rows" do
|
36
27
|
@results.next_row.should == ["foo"]
|
@@ -38,10 +29,16 @@ describe "select query" do
|
|
38
29
|
@results.next_row.should == ["baz"]
|
39
30
|
@results.next_row.should be_nil
|
40
31
|
end
|
32
|
+
|
33
|
+
it "should count columns" do
|
34
|
+
@results.column_count.should == 1
|
35
|
+
end
|
41
36
|
end
|
42
37
|
|
43
38
|
context "without buffering" do
|
44
39
|
it_should_behave_like "a read query"
|
40
|
+
|
41
|
+
after(:each) {@results.should_not be_buffered}
|
45
42
|
end
|
46
43
|
|
47
44
|
context "with buffering" do
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: downpour
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Tejas Dinkar
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-06-02 00:00:00 +05:30
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -50,15 +50,19 @@ files:
|
|
50
50
|
- ext/downpour/downpour.h
|
51
51
|
- ext/downpour/extconf.rb
|
52
52
|
- ext/downpour/helpers.c
|
53
|
+
- ext/downpour/memory_allocation.c
|
53
54
|
- ext/downpour/module.c
|
55
|
+
- ext/downpour/query.c
|
54
56
|
- ext/downpour/result.c
|
55
57
|
- ext/downpour/status.c
|
56
58
|
- lib/downpour.rb
|
57
59
|
- lib/downpour/version.rb
|
58
60
|
- spec/bootstrap.sql
|
61
|
+
- spec/downpour/concurrent_spec.rb
|
62
|
+
- spec/downpour/connect_type_spec.rb
|
63
|
+
- spec/downpour/connection_spec.rb
|
59
64
|
- spec/downpour/insert_spec.rb
|
60
65
|
- spec/downpour/module_spec.rb
|
61
|
-
- spec/downpour/query_spec.rb
|
62
66
|
- spec/downpour/select_spec.rb
|
63
67
|
- spec/spec_helper.rb
|
64
68
|
- README.rdoc
|
@@ -93,8 +97,10 @@ specification_version: 3
|
|
93
97
|
summary: A simple, fast Mysql and Drizzle library for Ruby, binding to libdrizzle
|
94
98
|
test_files:
|
95
99
|
- spec/bootstrap.sql
|
100
|
+
- spec/downpour/concurrent_spec.rb
|
101
|
+
- spec/downpour/connect_type_spec.rb
|
102
|
+
- spec/downpour/connection_spec.rb
|
96
103
|
- spec/downpour/insert_spec.rb
|
97
104
|
- spec/downpour/module_spec.rb
|
98
|
-
- spec/downpour/query_spec.rb
|
99
105
|
- spec/downpour/select_spec.rb
|
100
106
|
- spec/spec_helper.rb
|
data/spec/downpour/query_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
describe Downpour do
|
2
|
-
before(:each) do
|
3
|
-
@status = Downpour.create
|
4
|
-
@connection = create_connection(@status)
|
5
|
-
end
|
6
|
-
|
7
|
-
context "error handling" do
|
8
|
-
|
9
|
-
it "should be able to catch errors" do
|
10
|
-
begin
|
11
|
-
query = @connection.query "this is invalid sql"
|
12
|
-
raise "should have failed here"
|
13
|
-
rescue IOError
|
14
|
-
@status.error.should == "You have an error in your SQL syntax; check the manual that corresponds to your Drizzle server version for the right syntax to use near 'this is invalid sql' at line 1"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should only accept a string as query" do
|
19
|
-
begin
|
20
|
-
@connection.query 42
|
21
|
-
raise "should have failed here"
|
22
|
-
rescue TypeError
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|