do_oracle 0.10.1-x86-mswin32-60 → 0.10.2-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog.markdown CHANGED
@@ -1,3 +1,6 @@
1
- ## 0.10.1 (unreleased, in git)
1
+ ## 0.10.2 2010-05-19
2
+ * Rework logging for making callbacks possible
3
+
4
+ ## 0.10.1 2010-01-08
2
5
 
3
6
  Initial release.
@@ -38,6 +38,7 @@ static ID ID_NEW_DATE;
38
38
  static ID ID_LOGGER;
39
39
  static ID ID_DEBUG;
40
40
  static ID ID_LEVEL;
41
+ static ID ID_LOG;
41
42
  static ID ID_TO_S;
42
43
  static ID ID_RATIONAL;
43
44
 
@@ -91,6 +92,8 @@ static VALUE cDO_Connection;
91
92
  static VALUE cDO_Command;
92
93
  static VALUE cDO_Result;
93
94
  static VALUE cDO_Reader;
95
+ static VALUE cDO_Logger;
96
+ static VALUE cDO_Logger_Message;
94
97
 
95
98
  static VALUE rb_cDate;
96
99
  static VALUE rb_cDateTime;
@@ -113,31 +116,19 @@ static VALUE eSQLError;
113
116
  static VALUE eConnectionError;
114
117
  static VALUE eDataError;
115
118
 
116
- static void data_objects_debug(VALUE string, struct timeval* start) {
119
+ static void data_objects_debug(VALUE connection, VALUE string, struct timeval* start) {
117
120
  struct timeval stop;
118
- char *message;
121
+ VALUE message;
119
122
 
120
- char *query = RSTRING_PTR(string);
121
- int length = RSTRING_LEN(string);
122
- char total_time[32];
123
- do_int64 duration = 0;
123
+ gettimeofday(&stop, NULL);
124
+ do_int64 duration = (stop.tv_sec - start->tv_sec) * 1000000 + stop.tv_usec - start->tv_usec;
124
125
 
125
- VALUE logger = rb_funcall(mOracle, ID_LOGGER, 0);
126
- int log_level = NUM2INT(rb_funcall(logger, ID_LEVEL, 0));
126
+ message = rb_funcall(cDO_Logger_Message, ID_NEW, 3, string, rb_time_new(start->tv_sec, start->tv_usec), INT2NUM(duration));
127
127
 
128
- if (0 == log_level) {
129
- gettimeofday(&stop, NULL);
130
-
131
- duration = (stop.tv_sec - start->tv_sec) * 1000000 + stop.tv_usec - start->tv_usec;
132
-
133
- snprintf(total_time, 32, "%.6f", duration / 1000000.0);
134
- message = (char *)calloc(length + strlen(total_time) + 4, sizeof(char));
135
- snprintf(message, length + strlen(total_time) + 4, "(%s) %s", total_time, query);
136
- rb_funcall(logger, ID_DEBUG, 1, rb_str_new(message, length + strlen(total_time) + 3));
137
- free(message);
138
- }
128
+ rb_funcall(connection, ID_LOG, 1, message);
139
129
  }
140
130
 
131
+
141
132
  static char * get_uri_option(VALUE query_hash, char * key) {
142
133
  VALUE query_value;
143
134
  char * value = NULL;
@@ -392,13 +383,6 @@ static VALUE typecast(VALUE r_value, const VALUE type) {
392
383
  } else if (type == rb_cClass) {
393
384
  return rb_funcall(mDO, ID_FULL_CONST_GET, 1, r_value);
394
385
 
395
- // TODO: where are tests for this mapping?
396
- } else if (type == rb_cObject) {
397
- if (rb_obj_class(r_value) == cOCI8_CLOB)
398
- return rb_marshal_load(rb_funcall(r_value, ID_READ, 0));
399
- else
400
- return rb_marshal_load(r_value);
401
-
402
386
  } else if (type == rb_cNilClass) {
403
387
  return Qnil;
404
388
 
@@ -411,8 +395,9 @@ static VALUE typecast(VALUE r_value, const VALUE type) {
411
395
 
412
396
  }
413
397
 
414
- static VALUE typecast_bind_value(VALUE oci8_conn, VALUE r_value) {
398
+ static VALUE typecast_bind_value(VALUE connection, VALUE r_value) {
415
399
  VALUE r_class = rb_obj_class(r_value);
400
+ VALUE oci8_conn = rb_iv_get(connection, "@connection");
416
401
  // replace nil value with '' as otherwise OCI8 cannot get bind variable type
417
402
  // '' will be inserted as NULL by Oracle
418
403
  if (NIL_P(r_value))
@@ -483,7 +468,7 @@ static VALUE cCommand_set_types(int argc, VALUE *argv, VALUE self) {
483
468
 
484
469
  typedef struct {
485
470
  VALUE self;
486
- VALUE oci8_conn;
471
+ VALUE connection;
487
472
  VALUE cursor;
488
473
  VALUE statement_type;
489
474
  VALUE args;
@@ -495,12 +480,16 @@ static VALUE cCommand_execute_try(cCommand_execute_try_t *arg);
495
480
  static VALUE cCommand_execute_ensure(cCommand_execute_try_t *arg);
496
481
 
497
482
  // called by Command#execute that is written in Ruby
498
- static VALUE cCommand_execute_internal(VALUE self, VALUE oci8_conn, VALUE sql, VALUE args) {
483
+ static VALUE cCommand_execute_internal(VALUE self, VALUE connection, VALUE sql, VALUE args) {
499
484
  cCommand_execute_try_t arg;
500
485
  arg.self = self;
501
- arg.oci8_conn = oci8_conn;
486
+ arg.connection = connection;
502
487
  arg.sql = sql;
503
488
  // store start time before SQL parsing
489
+ VALUE oci8_conn = rb_iv_get(connection, "@connection");
490
+ if (Qnil == oci8_conn) {
491
+ rb_raise(eConnectionError, "This connection has already been closed.");
492
+ }
504
493
  gettimeofday(&arg.start, NULL);
505
494
  arg.cursor = rb_funcall(oci8_conn, ID_PARSE, 1, sql);
506
495
  arg.statement_type = rb_funcall(arg.cursor, ID_TYPE, 0);
@@ -510,8 +499,8 @@ static VALUE cCommand_execute_internal(VALUE self, VALUE oci8_conn, VALUE sql, V
510
499
  }
511
500
 
512
501
  // wrapper for simple SQL calls without arguments
513
- static VALUE execute_sql(VALUE oci8_conn, VALUE sql) {
514
- return cCommand_execute_internal(Qnil, oci8_conn, sql, Qnil);
502
+ static VALUE execute_sql(VALUE connection, VALUE sql) {
503
+ return cCommand_execute_internal(Qnil, connection, sql, Qnil);
515
504
  }
516
505
 
517
506
  static VALUE cCommand_execute_try(cCommand_execute_try_t *arg) {
@@ -532,7 +521,7 @@ static VALUE cCommand_execute_try(cCommand_execute_try_t *arg) {
532
521
  VALUE r_orig_value, r_new_value;
533
522
  for (i = 0; i < RARRAY_LEN(arg->args); i++) {
534
523
  r_orig_value = rb_ary_entry(arg->args, i);
535
- r_new_value = typecast_bind_value(arg->oci8_conn, r_orig_value);
524
+ r_new_value = typecast_bind_value(arg->connection, r_orig_value);
536
525
  if (r_orig_value != r_new_value)
537
526
  rb_ary_store(arg->args, i, r_new_value);
538
527
  }
@@ -557,7 +546,7 @@ static VALUE cCommand_execute_ensure(cCommand_execute_try_t *arg) {
557
546
  if (SYM2ID(arg->statement_type) != ID_SELECT_STMT)
558
547
  rb_funcall(arg->cursor, ID_CLOSE, 0);
559
548
  // Log SQL and execution time
560
- data_objects_debug(arg->sql, &(arg->start));
549
+ data_objects_debug(arg->connection, arg->sql, &(arg->start));
561
550
  return Qnil;
562
551
  }
563
552
 
@@ -588,7 +577,9 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
588
577
  }
589
578
 
590
579
  r_path = rb_funcall(uri, rb_intern("path"), 0);
591
- path = StringValuePtr(r_path);
580
+ if ( Qnil != r_path ) {
581
+ path = StringValuePtr(r_path);
582
+ }
592
583
 
593
584
  // If just host name is specified then use it as TNS names alias
594
585
  if ((r_host != Qnil && RSTRING_LEN(r_host) > 0) &&
@@ -596,7 +587,7 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
596
587
  (r_path == Qnil || RSTRING_LEN(r_path) == 0)) {
597
588
  connect_string = host;
598
589
  // If database name is specified in path (in format "/database")
599
- } else if (strlen(path) > 1) {
590
+ } else if (path != NULL && strlen(path) > 1) {
600
591
  connect_string_length = strlen(host) + strlen(port) + strlen(path) + 4;
601
592
  connect_string = (char *)calloc(connect_string_length, sizeof(char));
602
593
  snprintf(connect_string, connect_string_length, "//%s:%s%s", host, port, path);
@@ -622,6 +613,10 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
622
613
  // Set session time zone
623
614
  // at first look for option in connection string
624
615
  time_zone = get_uri_option(r_query, "time_zone");
616
+
617
+ rb_iv_set(self, "@uri", uri);
618
+ rb_iv_set(self, "@connection", oci8_conn);
619
+
625
620
  // if no option specified then look in ENV['TZ']
626
621
  if (time_zone == NULL) {
627
622
  r_time_zone = rb_funcall(cConnection, rb_intern("ruby_time_zone"), 0);
@@ -630,15 +625,12 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
630
625
  }
631
626
  if (time_zone) {
632
627
  snprintf(set_time_zone_command, 80, "alter session set time_zone = '%s'", time_zone);
633
- execute_sql(oci8_conn, RUBY_STRING(set_time_zone_command));
628
+ execute_sql(self, RUBY_STRING(set_time_zone_command));
634
629
  }
635
630
 
636
- execute_sql(oci8_conn, RUBY_STRING("alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'"));
637
- execute_sql(oci8_conn, RUBY_STRING("alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF'"));
638
- execute_sql(oci8_conn, RUBY_STRING("alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM'"));
639
-
640
- rb_iv_set(self, "@uri", uri);
641
- rb_iv_set(self, "@connection", oci8_conn);
631
+ execute_sql(self, RUBY_STRING("alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'"));
632
+ execute_sql(self, RUBY_STRING("alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF'"));
633
+ execute_sql(self, RUBY_STRING("alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM'"));
642
634
 
643
635
  return Qtrue;
644
636
  }
@@ -808,6 +800,7 @@ void Init_do_oracle() {
808
800
  ID_LOGGER = rb_intern("logger");
809
801
  ID_DEBUG = rb_intern("debug");
810
802
  ID_LEVEL = rb_intern("level");
803
+ ID_LOG = rb_intern("log");
811
804
  ID_TO_S = rb_intern("to_s");
812
805
  ID_RATIONAL = rb_intern("Rational");
813
806
 
@@ -871,6 +864,8 @@ void Init_do_oracle() {
871
864
  cDO_Command = CONST_GET(mDO, "Command");
872
865
  cDO_Result = CONST_GET(mDO, "Result");
873
866
  cDO_Reader = CONST_GET(mDO, "Reader");
867
+ cDO_Logger = CONST_GET(mDO, "Logger");
868
+ cDO_Logger_Message = CONST_GET(cDO_Logger, "Message");
874
869
 
875
870
  // Top Level Module that all the classes live under
876
871
  mOracle = rb_define_module_under(mDO, "Oracle");
data/lib/do_oracle.rb CHANGED
@@ -41,11 +41,8 @@ if RUBY_PLATFORM !~ /java/
41
41
  private
42
42
 
43
43
  def execute(*args)
44
- oci8_conn = @connection.instance_variable_get("@connection")
45
- raise ConnectionError, "This connection has already been closed." unless oci8_conn
46
-
47
44
  sql, bind_variables = replace_argument_placeholders(@text, args)
48
- execute_internal(oci8_conn, sql, bind_variables)
45
+ execute_internal(@connection, sql, bind_variables)
49
46
  rescue OCIError => e
50
47
  raise SQLError.new(e.message, e.code, nil, e.sql, @connection.to_s)
51
48
  end
Binary file
Binary file
@@ -1,5 +1,5 @@
1
1
  module DataObjects
2
2
  module Oracle
3
- VERSION = '0.10.1'.freeze
3
+ VERSION = '0.10.2'
4
4
  end
5
5
  end
data/tasks/compile.rake CHANGED
@@ -34,7 +34,7 @@ begin
34
34
  # Gem::Specification API.
35
35
  gem.dependencies.delete_if { |d| d.name == 'ruby-oci8'}
36
36
 
37
- gem.add_dependency "do_jdbc", '0.10.1'
37
+ gem.add_dependency "do_jdbc", '0.10.2'
38
38
  end
39
39
  end
40
40
  rescue LoadError
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: do_oracle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 10
8
+ - 2
9
+ version: 0.10.2
5
10
  platform: x86-mswin32-60
6
11
  authors:
7
12
  - Raimonds Simanovskis
@@ -9,49 +14,62 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-01-09 00:00:00 +01:00
17
+ date: 2010-05-19 00:00:00 +02:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: data_objects
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - "="
22
26
  - !ruby/object:Gem::Version
23
- version: 0.10.1
24
- version:
27
+ segments:
28
+ - 0
29
+ - 10
30
+ - 2
31
+ version: 0.10.2
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: ruby-oci8
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - ~>
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 2
43
+ - 0
33
44
  version: "2.0"
34
- version:
45
+ type: :runtime
46
+ version_requirements: *id002
35
47
  - !ruby/object:Gem::Dependency
36
48
  name: bacon
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
49
+ prerelease: false
50
+ requirement: &id003 !ruby/object:Gem::Requirement
40
51
  requirements:
41
52
  - - ~>
42
53
  - !ruby/object:Gem::Version
54
+ segments:
55
+ - 1
56
+ - 1
43
57
  version: "1.1"
44
- version:
58
+ type: :development
59
+ version_requirements: *id003
45
60
  - !ruby/object:Gem::Dependency
46
61
  name: rake-compiler
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
50
64
  requirements:
51
65
  - - ~>
52
66
  - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ - 7
53
70
  version: "0.7"
54
- version:
71
+ type: :development
72
+ version_requirements: *id004
55
73
  description: Implements the DataObjects API for Oracle
56
74
  email: raimonds.simanovskis@gmail.com
57
75
  executables: []
@@ -113,18 +131,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
113
131
  requirements:
114
132
  - - ">="
115
133
  - !ruby/object:Gem::Version
134
+ segments:
135
+ - 0
116
136
  version: "0"
117
- version:
118
137
  required_rubygems_version: !ruby/object:Gem::Requirement
119
138
  requirements:
120
139
  - - ">="
121
140
  - !ruby/object:Gem::Version
141
+ segments:
142
+ - 0
122
143
  version: "0"
123
- version:
124
144
  requirements: []
125
145
 
126
146
  rubyforge_project: dorb
127
- rubygems_version: 1.3.5
147
+ rubygems_version: 1.3.6
128
148
  signing_key:
129
149
  specification_version: 3
130
150
  summary: DataObjects Oracle Driver