ruby-oci8 1.0.7 → 2.0.0

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.
Files changed (89) hide show
  1. data/ChangeLog +1254 -390
  2. data/Makefile +10 -13
  3. data/README +56 -385
  4. data/VERSION +1 -1
  5. data/dist-files +26 -27
  6. data/ext/oci8/.document +1 -0
  7. data/ext/oci8/MANIFEST +0 -4
  8. data/ext/oci8/apiwrap.c.tmpl +172 -0
  9. data/ext/oci8/apiwrap.h.tmpl +61 -0
  10. data/ext/oci8/apiwrap.rb +91 -0
  11. data/ext/oci8/apiwrap.yml +1243 -0
  12. data/ext/oci8/attr.c +124 -384
  13. data/ext/oci8/bind.c +472 -164
  14. data/ext/oci8/encoding.c +196 -0
  15. data/ext/oci8/env.c +84 -253
  16. data/ext/oci8/error.c +196 -127
  17. data/ext/oci8/extconf.rb +82 -59
  18. data/ext/oci8/lob.c +710 -370
  19. data/ext/oci8/metadata.c +359 -0
  20. data/ext/oci8/object.c +622 -0
  21. data/ext/oci8/oci8.c +577 -161
  22. data/ext/oci8/oci8.h +354 -258
  23. data/ext/oci8/oci8lib.c +493 -0
  24. data/ext/oci8/ocidatetime.c +473 -0
  25. data/ext/oci8/ocinumber.c +1123 -24
  26. data/ext/oci8/oraconf.rb +72 -106
  27. data/ext/oci8/oradate.c +511 -321
  28. data/ext/oci8/stmt.c +752 -572
  29. data/ext/oci8/win32.c +131 -0
  30. data/ext/oci8/xmldb.c +383 -0
  31. data/lib/.document +2 -0
  32. data/lib/dbd/OCI8.rb +2 -17
  33. data/lib/oci8.rb.in +41 -1622
  34. data/lib/oci8/.document +5 -0
  35. data/lib/oci8/compat.rb +108 -0
  36. data/lib/oci8/datetime.rb +489 -0
  37. data/lib/oci8/encoding-init.rb +40 -0
  38. data/lib/oci8/encoding.yml +537 -0
  39. data/lib/oci8/metadata.rb +2077 -0
  40. data/lib/oci8/object.rb +548 -0
  41. data/lib/oci8/oci8.rb +773 -0
  42. data/lib/oci8/oracle_version.rb +144 -0
  43. data/metaconfig +3 -3
  44. data/ruby-oci8.gemspec +5 -5
  45. data/setup.rb +4 -4
  46. data/test/config.rb +64 -84
  47. data/test/test_all.rb +14 -21
  48. data/test/test_array_dml.rb +317 -0
  49. data/test/test_bind_raw.rb +18 -25
  50. data/test/test_bind_time.rb +78 -91
  51. data/test/test_break.rb +37 -35
  52. data/test/test_clob.rb +33 -89
  53. data/test/test_connstr.rb +5 -4
  54. data/test/test_datetime.rb +469 -0
  55. data/test/test_dbi.rb +99 -60
  56. data/test/test_dbi_clob.rb +3 -8
  57. data/test/test_metadata.rb +65 -51
  58. data/test/test_oci8.rb +151 -55
  59. data/test/test_oracle_version.rb +70 -0
  60. data/test/test_oradate.rb +76 -83
  61. data/test/test_oranumber.rb +405 -71
  62. data/test/test_rowid.rb +6 -11
  63. metadata +31 -32
  64. data/NEWS +0 -420
  65. data/ext/oci8/const.c +0 -165
  66. data/ext/oci8/define.c +0 -53
  67. data/ext/oci8/describe.c +0 -81
  68. data/ext/oci8/descriptor.c +0 -39
  69. data/ext/oci8/handle.c +0 -273
  70. data/ext/oci8/oranumber.c +0 -445
  71. data/ext/oci8/param.c +0 -37
  72. data/ext/oci8/server.c +0 -182
  73. data/ext/oci8/session.c +0 -99
  74. data/ext/oci8/svcctx.c +0 -238
  75. data/ruby-oci8.spec +0 -62
  76. data/support/README +0 -4
  77. data/support/runit/assert.rb +0 -281
  78. data/support/runit/cui/testrunner.rb +0 -101
  79. data/support/runit/error.rb +0 -4
  80. data/support/runit/method_mappable.rb +0 -20
  81. data/support/runit/robserver.rb +0 -25
  82. data/support/runit/setuppable.rb +0 -15
  83. data/support/runit/teardownable.rb +0 -16
  84. data/support/runit/testcase.rb +0 -113
  85. data/support/runit/testfailure.rb +0 -25
  86. data/support/runit/testresult.rb +0 -121
  87. data/support/runit/testsuite.rb +0 -43
  88. data/support/runit/version.rb +0 -3
  89. data/test/test_describe.rb +0 -137
@@ -48,69 +48,48 @@ module MiniRegistry
48
48
  # copy the minimum code and reorganize it.
49
49
  ERROR_SUCCESS = 0
50
50
  ERROR_FILE_NOT_FOUND = 2
51
- ERROR_NO_MORE_ITEMS = 259
52
51
 
53
52
  HKEY_LOCAL_MACHINE = 0x80000002
54
- KEY_ENUMERATE_SUB_KEYS = 0x0008
55
- KEY_QUERY_VALUE = 0x0001
56
53
  RegOpenKeyExA = Win32API.new('advapi32', 'RegOpenKeyExA', 'LPLLP', 'L')
57
- RegEnumKeyExA = Win32API.new('advapi32', 'RegEnumKeyExA', 'LLPPPPPP', 'L')
58
54
  RegQueryValueExA = Win32API.new('advapi32','RegQueryValueExA','LPPPPP','L')
59
55
  RegCloseKey = Win32API.new('advapi32', 'RegCloseKey', 'L', 'L')
60
56
 
61
- def self.get_str_value(hKey, name)
62
- lpcbData = [0].pack('L')
63
- code = RegQueryValueExA.call(hKey, name, nil, nil, nil, lpcbData)
64
- if code == ERROR_FILE_NOT_FOUND
65
- return nil
66
- elsif code != ERROR_SUCCESS
67
- raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
68
- end
69
- len = lpcbData.unpack('L')[0]
70
- lpType = [0].pack('L')
71
- lpData = "\0"*len
72
- lpcbData = [len].pack('L')
73
- code = RegQueryValueExA.call(hKey, name, nil, lpType, lpData, lpcbData)
74
- if code != ERROR_SUCCESS
75
- raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
76
- end
77
- lpData.unpack('Z*')[0]
78
- end
79
-
80
- def self.enum_homes
81
- phkResult = [0].pack('L')
82
- code = RegOpenKeyExA.call(HKEY_LOCAL_MACHINE, 'SOFTWARE\ORACLE', 0, 0x20019, phkResult)
57
+ def get_reg_value(root, subkey, name)
58
+ result = [0].pack('L')
59
+ code = RegOpenKeyExA.call(root, subkey, 0, 0x20019, result)
83
60
  if code != ERROR_SUCCESS
84
61
  raise MiniRegistryError.new("Win32::RegOpenKeyExA", code)
85
62
  end
86
- hKey = phkResult.unpack('L')[0]
87
- idx = 0
88
- maxkeylen = 256
89
- loop do
90
- lpName = "\0" * maxkeylen
91
- lpcName = [maxkeylen].pack('L')
92
- code = RegEnumKeyExA.call(hKey, idx, lpName, lpcName, nil, nil, nil, nil);
93
- break if code == ERROR_NO_MORE_ITEMS
94
- if code != ERROR_SUCCESS
95
- RegCloseKey.call(hKey)
96
- raise MiniRegistryError.new("Win32::RegEnumKeyEx", code)
63
+ hkey = result.unpack('L')[0]
64
+ begin
65
+ lpcbData = [0].pack('L')
66
+ code = RegQueryValueExA.call(hkey, name, nil, nil, nil, lpcbData)
67
+ if code == ERROR_FILE_NOT_FOUND
68
+ return nil
69
+ elsif code != ERROR_SUCCESS
70
+ raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
97
71
  end
98
- code = RegOpenKeyExA.call(hKey, lpName, 0, KEY_QUERY_VALUE, phkResult)
72
+ len = lpcbData.unpack('L')[0]
73
+ lpType = "\0\0\0\0"
74
+ lpData = "\0"*len
75
+ lpcbData = [len].pack('L')
76
+ code = RegQueryValueExA.call(hkey, name, nil, lpType, lpData, lpcbData)
99
77
  if code != ERROR_SUCCESS
100
- RegCloseKey.call(hKey)
101
- raise MiniRegistryError.new("Win32::RegEnumKeyEx", code)
78
+ raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
102
79
  end
103
- hSubkey = phkResult.unpack('L')[0]
104
-
105
- name = get_str_value(hSubkey, 'ORACLE_HOME_NAME')
106
- path = get_str_value(hSubkey, 'ORACLE_HOME')
107
- yield name, path
108
- RegCloseKey.call(hSubkey)
109
- idx += 1
80
+ lpData.unpack('Z*')[0]
81
+ ensure
82
+ RegCloseKey.call(hkey)
110
83
  end
111
- RegCloseKey.call(hKey)
112
84
  end
113
-
85
+ def get_local_registry(subkey, name)
86
+ get_reg_value(HKEY_LOCAL_MACHINE, subkey, name)
87
+ end
88
+ else
89
+ # UNIX
90
+ def get_local_registry(subkey, name)
91
+ nil
92
+ end
114
93
  end
115
94
  end # module MiniRegistry
116
95
 
@@ -314,6 +293,8 @@ class MiniSOReader
314
293
  end
315
294
 
316
295
  class OraConf
296
+ include MiniRegistry
297
+
317
298
  attr_reader :cc_is_gcc
318
299
  attr_reader :version
319
300
  attr_reader :cflags
@@ -353,10 +334,8 @@ EOS
353
334
  end
354
335
  print <<EOS
355
336
  ---------------------------------------------------
356
- Error Message:
357
- #{$!.to_s.gsub(/\n/, "\n ")}
358
- Backtrace:
359
- #{$!.backtrace.join("\n ")}
337
+ error messages:
338
+ #{$!.to_s}
360
339
  ---------------------------------------------------
361
340
  See:
362
341
  * http://ruby-oci8.rubyforge.org/#{lang}/HowToInstall.html
@@ -385,16 +364,15 @@ EOS
385
364
  # get library load path names
386
365
  oci_basename = 'libclntsh'
387
366
  oci_glob_postfix = '.[0-9]*'
388
- nls_data_basename = ['libociei', 'libociicus']
367
+ ocidata_basename = ['libociei', 'libociicus']
389
368
  @@ld_envs = %w[LD_LIBRARY_PATH]
390
369
  so_ext = 'so'
391
- nls_data_ext = nil
392
370
  check_proc = nil
393
371
  case RUBY_PLATFORM
394
372
  when /mswin32|cygwin|mingw32|bccwin32/
395
373
  oci_basename = 'oci'
396
374
  oci_glob_postfix = ''
397
- nls_data_basename = ['oraociei11', 'oraociicus11', 'oraociei10', 'oraociicus10']
375
+ ocidata_basename = ['oraociei11', 'oraociicus11', 'oraociei10', 'oraociicus10']
398
376
  @@ld_envs = %w[PATH]
399
377
  so_ext = 'dll'
400
378
  when /i.86-linux/
@@ -437,7 +415,6 @@ EOS
437
415
  oci_glob_postfix = ''
438
416
  @@ld_envs = %w[LIBPATH]
439
417
  so_ext = 'a'
440
- nls_data_ext = 'so'
441
418
  when /hppa.*-hpux/
442
419
  if [0].pack('l!').length == 4
443
420
  @@ld_envs = %w[SHLIB_PATH]
@@ -448,7 +425,7 @@ EOS
448
425
  so_ext = 'dylib'
449
426
  check_proc = Proc.new do |file|
450
427
  is_32bit = [0].pack('l!').size == 4
451
- is_big_endian = "\x01\x02".unpack('s')[0] == 0x0102
428
+ is_big_endian = "\x01\x02".unpack('s') == 0x0102
452
429
  if is_32bit
453
430
  if is_big_endian
454
431
  this_cpu = :ppc # 32-bit big-endian
@@ -467,12 +444,7 @@ EOS
467
444
  if so.cpu.include? this_cpu
468
445
  true
469
446
  else
470
- if so.cpu.size > 1
471
- arch_types = so.cpu[0..-2].join(', ') + ' and ' + so.cpu[-1].to_s
472
- else
473
- arch_types = so.cpu[0]
474
- end
475
- puts " skip: #{file} is for #{arch_types} cpu."
447
+ puts " skip: #{file} is for #{so.cpu} cpu."
476
448
  false
477
449
  end
478
450
  else
@@ -533,9 +505,8 @@ EOS
533
505
  end
534
506
 
535
507
  if ld_path
536
- nls_data_ext ||= so_ext # nls_data_ext is same with so_ext by default.
537
- nls_data_basename.each do |basename|
538
- if File.exist?(File.join(ld_path, "#{basename}.#{nls_data_ext}"))
508
+ ocidata_basename.each do |basename|
509
+ if File.exist?(File.join(ld_path, "#{basename}.#{so_ext}"))
539
510
  puts " #{file} looks like an instant client."
540
511
  return ld_path
541
512
  end
@@ -618,7 +589,6 @@ You need /usr/include/sys/types.h to compile ruby-oci8.
618
589
  EOS
619
590
  end
620
591
  puts "ok"
621
- $stdout.flush
622
592
  end # check_ruby_header
623
593
 
624
594
  def try_link_oci
@@ -781,10 +751,26 @@ class OraConfFC < OraConf
781
751
  if oracle_home.nil?
782
752
  struct = Struct.new("OracleHome", :name, :path)
783
753
  oracle_homes = []
784
- MiniRegistry.enum_homes do |name, path|
785
- path.chomp!("\\") if path
786
- oracle_homes << struct.new(name, path) if is_valid_home?(path)
754
+ begin
755
+ last_home = get_local_registry("SOFTWARE\\ORACLE\\ALL_HOMES", 'LAST_HOME')
756
+ 0.upto last_home.to_i do |id|
757
+ oracle_homes << "HOME#{id}"
758
+ end
759
+ rescue MiniRegistryError
760
+ end
761
+ oracle_homes << "KEY_XE"
762
+ oracle_homes << "KEY_XEClient"
763
+ oracle_homes.collect! do |home|
764
+ begin
765
+ name = get_local_registry("SOFTWARE\\ORACLE\\#{home}", 'ORACLE_HOME_NAME')
766
+ path = get_local_registry("SOFTWARE\\ORACLE\\#{home}", 'ORACLE_HOME')
767
+ path.chomp!("\\")
768
+ struct.new(name, path) if is_valid_home?(path)
769
+ rescue MiniRegistryError
770
+ nil
771
+ end
787
772
  end
773
+ oracle_homes.compact!
788
774
  if oracle_homes.empty?
789
775
  raise <<EOS
790
776
  Set the environment variable ORACLE_HOME if Oracle Full Client.
@@ -866,33 +852,10 @@ EOS
866
852
  def get_home
867
853
  oracle_home = ENV['ORACLE_HOME']
868
854
  if oracle_home.nil?
869
- msg = <<EOS
855
+ raise <<EOS
870
856
  Set the environment variable ORACLE_HOME if Oracle Full Client.
871
857
  Append the path of Oracle client libraries to #{OraConf.ld_envs[0]} if Oracle Instant Client.
872
858
  EOS
873
-
874
- # check sudo environment
875
- sudo_command = ENV['SUDO_COMMAND']
876
- if /\w*make\b/ =~ sudo_command
877
- msg += <<EOS
878
-
879
- The 'sudo' command unset some environment variables for security reasons.
880
- Use it only when running 'make install' as follows
881
- make
882
- sudo make install
883
- EOS
884
- end
885
- if /\w+\/gem\b/ =~ sudo_command
886
- msg += <<EOS
887
-
888
- The 'sudo' command unset some environment variables for security reasons.
889
- Pass required varialbes as follows
890
- sudo env #{OraConf.ld_envs[0]}=$#{OraConf.ld_envs[0]} #{sudo_command}
891
- or
892
- sudo env ORACLE_HOME=$ORACLE_HOME #{sudo_command}
893
- EOS
894
- end
895
- raise msg
896
859
  end
897
860
  oracle_home
898
861
  end
@@ -977,18 +940,21 @@ EOS
977
940
  end
978
941
  end
979
942
 
980
- # check whether object files are included.
981
- if /\S+\.o\b/ =~ libs
982
-
983
- # monkey patching!
984
- Object.module_eval do
985
- alias :link_command_pre_oci8 :link_command
986
- def link_command(*args)
987
- args[1] = "" if args[1] == $libs
988
- link_command_pre_oci8(*args)
989
- end
943
+ # remove object files from libs.
944
+ objs = []
945
+ libs.gsub!(/\S+\.o\b/) do |obj|
946
+ objs << obj
947
+ ""
948
+ end
949
+ # change object files to an archive file to work around.
950
+ if objs.length > 0
951
+ Logging::open do
952
+ puts "change object files to an archive file."
953
+ command = Config::CONFIG["AR"] + " cru oracle_objs.a " + objs.join(" ")
954
+ puts command
955
+ system(command)
956
+ libs = "oracle_objs.a " + libs
990
957
  end
991
-
992
958
  end
993
959
  libs
994
960
  end # get_libs
@@ -1,16 +1,37 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
1
2
  /*
2
- oradate.c - part of ruby-oci8
3
-
4
- Copyright (C) 2002 KUBO Takehiro <kubo@jiubao.org>
5
-
6
- =begin
7
- == OraDate
8
- date and time between 4712 B.C. and 9999 A.D.
9
- =end
10
- */
3
+ * oradate.c
4
+ *
5
+ * $Author: kubo $
6
+ * $Date: 2009-01-04 01:58:01 +0900 (Sun, 04 Jan 2009) $
7
+ *
8
+ * Copyright (C) 2002-2008 KUBO Takehiro <kubo@jiubao.org>
9
+ *
10
+ * date and time between 4712 B.C. and 9999 A.D.
11
+ */
11
12
  #include "oci8.h"
12
13
  #include <time.h>
13
14
 
15
+ static VALUE cOraDate;
16
+
17
+ /*
18
+ * Document-class: OraDate
19
+ *
20
+ * ruby class compatible with Oracle <tt>DATE</tt> data type.
21
+ * Date and time between 4712 B.C. and 9999 A.D.
22
+ *
23
+ */
24
+ struct ora_date {
25
+ unsigned char century;
26
+ unsigned char year;
27
+ unsigned char month;
28
+ unsigned char day;
29
+ unsigned char hour;
30
+ unsigned char minute;
31
+ unsigned char second;
32
+ };
33
+ typedef struct ora_date ora_date_t;
34
+
14
35
  #define Set_year(od, y) (od)->century = y / 100 + 100, (od)->year = y % 100 + 100
15
36
  #define Set_month(od, m) (od)->month = m
16
37
  #define Set_day(od, d) (od)->day = d
@@ -26,401 +47,570 @@ date and time between 4712 B.C. and 9999 A.D.
26
47
  #define Get_second(od) ((od)->second - 1)
27
48
 
28
49
  #define Check_year(year) \
29
- if (year < -4712 || 9999 < year) \
30
- rb_raise(rb_eRangeError, "Out of range for year %d (expect -4712 .. 9999)", year)
50
+ if (year < -4712 || 9999 < year) \
51
+ rb_raise(rb_eRangeError, "Out of range for year %d (expect -4712 .. 9999)", year)
31
52
  #define Check_month(month) \
32
- if (month < 1 || 12 < month) \
33
- rb_raise(rb_eRangeError, "Out of range for month %d (expect 1 .. 12)", month)
53
+ if (month < 1 || 12 < month) \
54
+ rb_raise(rb_eRangeError, "Out of range for month %d (expect 1 .. 12)", month)
34
55
  #define Check_day(day) \
35
- if (day < 1 || 31 < day) \
36
- rb_raise(rb_eRangeError, "Out of range for day %d (expect 1 .. 31)", day)
56
+ if (day < 1 || 31 < day) \
57
+ rb_raise(rb_eRangeError, "Out of range for day %d (expect 1 .. 31)", day)
37
58
  #define Check_hour(hour) \
38
- if (hour < 0 || 23 < hour) \
39
- rb_raise(rb_eRangeError, "Out of range for hour %d (expect 0 .. 24)", hour)
59
+ if (hour < 0 || 23 < hour) \
60
+ rb_raise(rb_eRangeError, "Out of range for hour %d (expect 0 .. 24)", hour)
40
61
  #define Check_minute(min) \
41
- if (min < 0 || 59 < min) \
42
- rb_raise(rb_eRangeError, "Out of range for minute %d (expect 0 .. 59)", min)
62
+ if (min < 0 || 59 < min) \
63
+ rb_raise(rb_eRangeError, "Out of range for minute %d (expect 0 .. 59)", min)
43
64
  #define Check_second(sec) \
44
- if (sec < 0 || 59 < sec) \
45
- rb_raise(rb_eRangeError, "Out of range for second %d (expect 0 .. 59)", sec)
46
-
65
+ if (sec < 0 || 59 < sec) \
66
+ rb_raise(rb_eRangeError, "Out of range for second %d (expect 0 .. 59)", sec)
47
67
 
48
- static VALUE ora_date_s_allocate(VALUE klass)
68
+ static void oci8_set_ora_date(ora_date_t *od, int year, int month, int day, int hour, int minute, int second)
49
69
  {
50
- ora_date_t *od;
51
- return Data_Make_Struct(klass, ora_date_t, NULL, xfree, od);
70
+ Set_year(od, year);
71
+ Set_month(od, month);
72
+ Set_day(od, day);
73
+ Set_hour(od, hour);
74
+ Set_minute(od, minute);
75
+ Set_second(od, second);
52
76
  }
53
77
 
54
- #ifndef HAVE_RB_DEFINE_ALLOC_FUNC
55
- /* ruby 1.6 */
56
- static VALUE ora_date_s_new(int argc, VALUE *argv, VALUE klass)
78
+ static VALUE ora_date_s_allocate(VALUE klass)
57
79
  {
58
- VALUE obj = ora_date_s_allocate(klass);
59
- rb_obj_call_init(obj, argc, argv);
60
- return obj;
80
+ ora_date_t *od;
81
+ return Data_Make_Struct(klass, ora_date_t, NULL, xfree, od);
61
82
  }
62
- #endif
63
83
 
64
84
  /*
65
- =begin
66
- --- OraDate.new([year [, month [, day [, hour [, min [,sec]]]]]])
67
- =end
68
- */
85
+ * call-seq:
86
+ * OraDate.new(year = 1, month = 1, day = 1, hour = 0, min = 0, sec = 0) -> oradate
87
+ *
88
+ * Returns an <code>OraDate</code> object initialized to the specified date and time.
89
+ */
69
90
  static VALUE ora_date_initialize(int argc, VALUE *argv, VALUE self)
70
91
  {
71
- VALUE vyear, vmonth, vday, vhour, vmin, vsec;
72
- ora_date_t *od;
73
- int year, month, day, hour, min, sec;
74
-
75
- rb_scan_args(argc, argv, "06", &vyear, &vmonth, &vday, &vhour, &vmin, &vsec);
76
- /* set year */
77
- if (argc > 0) {
78
- year = NUM2INT(vyear);
79
- Check_year(year);
80
- } else {
81
- year = 1;
82
- }
83
- /* set month */
84
- if (argc > 1) {
85
- month = NUM2INT(vmonth);
86
- Check_month(month);
87
- } else {
88
- month = 1;
89
- }
90
- /* set day */
91
- if (argc > 2) {
92
- day = NUM2INT(vday);
93
- Check_day(day);
94
- } else {
95
- day = 1;
96
- }
97
- /* set hour */
98
- if (argc > 3) {
99
- hour = NUM2INT(vhour);
100
- Check_hour(hour);
101
- } else {
102
- hour = 0;
103
- }
104
- /* set minute */
105
- if (argc > 4) {
106
- min = NUM2INT(vmin);
107
- Check_minute(min);
108
- } else {
109
- min = 0;
110
- }
111
- /* set second */
112
- if (argc > 5) {
113
- sec = NUM2INT(vsec);
114
- Check_second(sec);
115
- } else {
116
- sec = 0;
117
- }
118
-
119
- Data_Get_Struct(self, ora_date_t, od);
120
- oci8_set_ora_date(od, year, month, day, hour, min, sec);
121
- return Qnil;
92
+ VALUE vyear, vmonth, vday, vhour, vmin, vsec;
93
+ ora_date_t *od = DATA_PTR(self);
94
+ int year, month, day, hour, min, sec;
95
+
96
+ rb_scan_args(argc, argv, "06", &vyear, &vmonth, &vday, &vhour, &vmin, &vsec);
97
+ /* set year */
98
+ if (argc > 0) {
99
+ year = NUM2INT(vyear);
100
+ Check_year(year);
101
+ } else {
102
+ year = 1;
103
+ }
104
+ /* set month */
105
+ if (argc > 1) {
106
+ month = NUM2INT(vmonth);
107
+ Check_month(month);
108
+ } else {
109
+ month = 1;
110
+ }
111
+ /* set day */
112
+ if (argc > 2) {
113
+ day = NUM2INT(vday);
114
+ Check_day(day);
115
+ } else {
116
+ day = 1;
117
+ }
118
+ /* set hour */
119
+ if (argc > 3) {
120
+ hour = NUM2INT(vhour);
121
+ Check_hour(hour);
122
+ } else {
123
+ hour = 0;
124
+ }
125
+ /* set minute */
126
+ if (argc > 4) {
127
+ min = NUM2INT(vmin);
128
+ Check_minute(min);
129
+ } else {
130
+ min = 0;
131
+ }
132
+ /* set second */
133
+ if (argc > 5) {
134
+ sec = NUM2INT(vsec);
135
+ Check_second(sec);
136
+ } else {
137
+ sec = 0;
138
+ }
139
+
140
+ oci8_set_ora_date(od, year, month, day, hour, min, sec);
141
+ return Qnil;
122
142
  }
123
143
 
144
+ /* :nodoc: */
124
145
  static VALUE ora_date_initialize_copy(VALUE lhs, VALUE rhs)
125
146
  {
126
- ora_date_t *l, *r;
147
+ ora_date_t *l, *r;
127
148
 
128
- #ifdef HAVE_RB_DEFINE_ALLOC_FUNC
129
- /* ruby 1.8 */
130
- rb_obj_init_copy(lhs, rhs);
131
- #endif
132
- Data_Get_Struct(lhs, ora_date_t, l);
133
- Data_Get_Struct(rhs, ora_date_t, r);
134
- memcpy(l, r, sizeof(ora_date_t));
135
- return lhs;
136
- }
137
-
138
- #ifndef HAVE_RB_DEFINE_ALLOC_FUNC
139
- /* ruby 1.6 */
140
- static VALUE ora_date_clone(VALUE self)
141
- {
142
- VALUE obj = ora_date_s_allocate(CLASS_OF(self));
143
- return ora_date_initialize_copy(obj, self);
149
+ rb_obj_init_copy(lhs, rhs);
150
+ Data_Get_Struct(lhs, ora_date_t, l);
151
+ Data_Get_Struct(rhs, ora_date_t, r);
152
+ memcpy(l, r, sizeof(ora_date_t));
153
+ return lhs;
144
154
  }
145
- #endif
146
155
 
147
156
  /*
148
- =begin
149
- --- OraDate.now()
150
- =end
151
- */
152
- static VALUE ora_date_s_now(int argc, VALUE *argv)
157
+ * call-seq:
158
+ * OraDate.now() -> oradate
159
+ *
160
+ * Returns an <code>OraDate</code> object initialized to the
161
+ * current local time.
162
+ */
163
+ static VALUE ora_date_s_now(int argc, VALUE *argv, VALUE klass)
153
164
  {
154
- ora_date_t *od;
155
- VALUE obj;
156
- int year, month, day, hour, min, sec;
157
- time_t tm;
158
- struct tm *tp;
159
-
160
- tm = time(0);
161
- tp = localtime(&tm);
162
- year = tp->tm_year + 1900;
163
- month = tp->tm_mon + 1;
164
- day = tp->tm_mday;
165
- hour = tp->tm_hour;
166
- min = tp->tm_min;
167
- sec = tp->tm_sec;
168
-
169
- obj = Data_Make_Struct(cOraDate, ora_date_t, NULL, xfree, od);
170
- oci8_set_ora_date(od, year, month, day, hour, min, sec);
171
- return obj;
165
+ VALUE obj = ora_date_s_allocate(klass);
166
+ ora_date_t *od = DATA_PTR(obj);
167
+ time_t tm = time(0);
168
+ int year, month, day, hour, min, sec;
169
+ #ifdef HAVE_LOCALTIME_R
170
+ struct tm t;
171
+ localtime_r(&tm, &t);
172
+ #define tp (&t)
173
+ #else
174
+ struct tm *tp;
175
+ tp = localtime(&tm);
176
+ #endif
177
+ year = tp->tm_year + 1900;
178
+ month = tp->tm_mon + 1;
179
+ day = tp->tm_mday;
180
+ hour = tp->tm_hour;
181
+ min = tp->tm_min;
182
+ sec = tp->tm_sec;
183
+
184
+ oci8_set_ora_date(od, year, month, day, hour, min, sec);
185
+ return obj;
172
186
  }
173
187
 
174
188
  /*
175
- =begin
176
- --- OraDate#to_s()
177
- =end
178
- */
189
+ * call-seq:
190
+ * oradate.to_s -> string
191
+ *
192
+ * Returns a string representing <i>oradate</i>.
193
+ * The string format is 'yyyy/mm/dd hh:mi:ss'.
194
+ */
179
195
  static VALUE ora_date_to_s(VALUE self)
180
196
  {
181
- ora_date_t *od;
182
- char buf[30];
183
-
184
- Data_Get_Struct(self, ora_date_t, od);
185
- sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", Get_year(od), Get_month(od),
186
- Get_day(od), Get_hour(od), Get_minute(od), Get_second(od));
187
- return rb_str_new2(buf);
197
+ ora_date_t *od;
198
+ char buf[30];
199
+
200
+ Data_Get_Struct(self, ora_date_t, od);
201
+ sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", Get_year(od), Get_month(od),
202
+ Get_day(od), Get_hour(od), Get_minute(od), Get_second(od));
203
+ return rb_usascii_str_new_cstr(buf);
188
204
  }
189
205
 
190
206
  /*
191
- =begin
192
- --- OraDate#to_a()
193
- =end
194
- */
207
+ * call-seq:
208
+ * oradate.to_a -> array
209
+ *
210
+ * Returns a 6-element <i>array</i> of values for <i>oradate</i>:
211
+ * {<code>[year, month, day, hour, minute, second]</code>}.
212
+ */
195
213
  static VALUE ora_date_to_a(VALUE self)
196
214
  {
197
- ora_date_t *od;
198
- VALUE ary[6];
199
-
200
- Data_Get_Struct(self, ora_date_t, od);
201
- ary[0] = INT2FIX(Get_year(od));
202
- ary[1] = INT2FIX(Get_month(od));
203
- ary[2] = INT2FIX(Get_day(od));
204
- ary[3] = INT2FIX(Get_hour(od));
205
- ary[4] = INT2FIX(Get_minute(od));
206
- ary[5] = INT2FIX(Get_second(od));
207
- return rb_ary_new4(6, ary);
215
+ ora_date_t *od;
216
+ VALUE ary[6];
217
+
218
+ Data_Get_Struct(self, ora_date_t, od);
219
+ ary[0] = INT2FIX(Get_year(od));
220
+ ary[1] = INT2FIX(Get_month(od));
221
+ ary[2] = INT2FIX(Get_day(od));
222
+ ary[3] = INT2FIX(Get_hour(od));
223
+ ary[4] = INT2FIX(Get_minute(od));
224
+ ary[5] = INT2FIX(Get_second(od));
225
+ return rb_ary_new4(6, ary);
208
226
  }
209
227
 
210
- #define DEFINE_GETTER_FUNC(where) \
211
- static VALUE ora_date_##where(VALUE self) \
212
- { \
213
- ora_date_t *od; \
214
- \
215
- Data_Get_Struct(self, ora_date_t, od); \
216
- return INT2FIX(Get_##where(od)); \
228
+ /*
229
+ * call-seq:
230
+ * oradate.year -> fixnum
231
+ *
232
+ * Returns the year (-4712..9999) for <i>oradate</i>.
233
+ */
234
+ static VALUE ora_date_year(VALUE self)
235
+ {
236
+ ora_date_t *od;
237
+
238
+ Data_Get_Struct(self, ora_date_t, od);
239
+ return INT2FIX(Get_year(od));
217
240
  }
218
241
 
219
- #define DEFINE_SETTER_FUNC(where) \
220
- static VALUE ora_date_set_##where(VALUE self, VALUE val) \
221
- { \
222
- ora_date_t *od; \
223
- int v; \
224
- \
225
- v = NUM2INT(val); \
226
- Check_##where(v); \
227
- Data_Get_Struct(self, ora_date_t, od); \
228
- Set_##where(od, v); \
229
- return self; \
242
+ /*
243
+ * call-seq:
244
+ * oradate.year = fixnum
245
+ *
246
+ * Sets the year (-4712..9999) for <i>oradate</i>.
247
+ */
248
+ static VALUE ora_date_set_year(VALUE self, VALUE val)
249
+ {
250
+ ora_date_t *od;
251
+ int v;
252
+
253
+ v = NUM2INT(val);
254
+ Check_year(v);
255
+ Data_Get_Struct(self, ora_date_t, od);
256
+ Set_year(od, v);
257
+ return self;
230
258
  }
231
259
 
232
260
  /*
233
- =begin
234
- --- OraDate#year
235
- =end
236
- */
237
- DEFINE_GETTER_FUNC(year)
238
- DEFINE_SETTER_FUNC(year)
261
+ * call-seq:
262
+ * oradate.month -> fixnum
263
+ *
264
+ * Returns the month of the year (1..12) for <i>oradate</i>.
265
+ */
266
+ static VALUE ora_date_month(VALUE self)
267
+ {
268
+ ora_date_t *od;
269
+
270
+ Data_Get_Struct(self, ora_date_t, od);
271
+ return INT2FIX(Get_month(od));
272
+ }
239
273
 
240
274
  /*
241
- =begin
242
- --- OraDate#month
243
- =end
244
- */
245
- DEFINE_GETTER_FUNC(month)
246
- DEFINE_SETTER_FUNC(month)
275
+ * call-seq:
276
+ * oradate.month = fixnum
277
+ *
278
+ * Sets the month of the year (1..12) for <i>oradate</i>.
279
+ */
280
+ static VALUE ora_date_set_month(VALUE self, VALUE val)
281
+ {
282
+ ora_date_t *od;
283
+ int v;
284
+
285
+ v = NUM2INT(val);
286
+ Check_month(v);
287
+ Data_Get_Struct(self, ora_date_t, od);
288
+ Set_month(od, v);
289
+ return self;
290
+ }
247
291
 
248
292
  /*
249
- =begin
250
- --- OraDate#day
251
- =end
252
- */
253
- DEFINE_GETTER_FUNC(day)
254
- DEFINE_SETTER_FUNC(day)
293
+ * call-seq:
294
+ * oradate.day -> fixnum
295
+ *
296
+ * Returns the day of the month (1..31) for <i>oradate</i>.
297
+ */
298
+ static VALUE ora_date_day(VALUE self)
299
+ {
300
+ ora_date_t *od;
301
+
302
+ Data_Get_Struct(self, ora_date_t, od);
303
+ return INT2FIX(Get_day(od));
304
+ }
255
305
 
256
306
  /*
257
- =begin
258
- --- OraDate#hour
259
- =end
260
- */
261
- DEFINE_GETTER_FUNC(hour)
262
- DEFINE_SETTER_FUNC(hour)
307
+ * call-seq:
308
+ * oradate.day = fixnum
309
+ *
310
+ * Sets the day of the month (1..31) for <i>oradate</i>.
311
+ */
312
+ static VALUE ora_date_set_day(VALUE self, VALUE val)
313
+ {
314
+ ora_date_t *od;
315
+ int v;
316
+
317
+ v = NUM2INT(val);
318
+ Check_day(v);
319
+ Data_Get_Struct(self, ora_date_t, od);
320
+ Set_day(od, v);
321
+ return self;
322
+ }
263
323
 
264
324
  /*
265
- =begin
266
- --- OraDate#minute
267
- =end
268
- */
269
- DEFINE_GETTER_FUNC(minute)
270
- DEFINE_SETTER_FUNC(minute)
325
+ * call-seq:
326
+ * oradate.hour -> fixnum
327
+ *
328
+ * Returns the hour of the day (0..23) for <i>oradate</i>.
329
+ */
330
+ static VALUE ora_date_hour(VALUE self)
331
+ {
332
+ ora_date_t *od;
333
+
334
+ Data_Get_Struct(self, ora_date_t, od);
335
+ return INT2FIX(Get_hour(od));
336
+ }
271
337
 
272
338
  /*
273
- =begin
274
- --- OraDate#second
275
- =end
276
- */
277
- DEFINE_GETTER_FUNC(second)
278
- DEFINE_SETTER_FUNC(second)
339
+ * call-seq:
340
+ * oradate.hour = fixnum
341
+ *
342
+ * Sets the hour of the day (0..23) for <i>oradate</i>.
343
+ */
344
+ static VALUE ora_date_set_hour(VALUE self, VALUE val)
345
+ {
346
+ ora_date_t *od;
347
+ int v;
348
+
349
+ v = NUM2INT(val);
350
+ Check_hour(v);
351
+ Data_Get_Struct(self, ora_date_t, od);
352
+ Set_hour(od, v);
353
+ return self;
354
+ }
279
355
 
280
356
  /*
281
- =begin
282
- --- OraDate#trunc()
283
- =end
284
- */
285
- static VALUE ora_date_trunc(VALUE self)
357
+ * call-seq:
358
+ * oradate.minute -> fixnum
359
+ *
360
+ * Returns the minute of the hour (0..59) for <i>oradate</i>.
361
+ */
362
+ static VALUE ora_date_minute(VALUE self)
286
363
  {
287
- ora_date_t *od;
364
+ ora_date_t *od;
288
365
 
289
- Data_Get_Struct(self, ora_date_t, od);
290
- od->hour = 1;
291
- od->minute = 1;
292
- od->second = 1;
293
- return self;
366
+ Data_Get_Struct(self, ora_date_t, od);
367
+ return INT2FIX(Get_minute(od));
294
368
  }
295
369
 
296
- static VALUE ora_date_hash(VALUE self)
370
+ /*
371
+ * call-seq:
372
+ * oradate.minute = fixnum
373
+ *
374
+ * Sets the minute of the hour (0..59) for <i>oradate</i>.
375
+ */
376
+ static VALUE ora_date_set_minute(VALUE self, VALUE val)
377
+ {
378
+ ora_date_t *od;
379
+ int v;
380
+
381
+ v = NUM2INT(val);
382
+ Check_minute(v);
383
+ Data_Get_Struct(self, ora_date_t, od);
384
+ Set_minute(od, v);
385
+ return self;
386
+ }
387
+
388
+ /*
389
+ * call-seq:
390
+ * oradate.second -> fixnum
391
+ *
392
+ * Returns the second of the minute (0..59) for <i>oradate</i>.
393
+ */
394
+ static VALUE ora_date_second(VALUE self)
297
395
  {
298
- ora_date_t *od;
299
- unsigned int v;
300
-
301
- Data_Get_Struct(self, ora_date_t, od);
302
- v = (od->century << 8)
303
- + (od->year << 15)
304
- + (od->month << 22)
305
- + (od->day << 26)
306
- + (od->hour << 12)
307
- + (od->minute << 6)
308
- + (od->second << 0);
309
- return INT2FIX(v);
396
+ ora_date_t *od;
397
+
398
+ Data_Get_Struct(self, ora_date_t, od);
399
+ return INT2FIX(Get_second(od));
400
+ }
401
+
402
+ /*
403
+ * call-seq:
404
+ * oradate.second = fixnum
405
+ *
406
+ * Sets the second of the minute (0..59) for <i>oradate</i>.
407
+ */
408
+ static VALUE ora_date_set_second(VALUE self, VALUE val)
409
+ {
410
+ ora_date_t *od;
411
+ int v;
412
+
413
+ v = NUM2INT(val);
414
+ Check_second(v);
415
+ Data_Get_Struct(self, ora_date_t, od);
416
+ Set_second(od, v);
417
+ return self;
418
+ }
419
+
420
+ /*
421
+ * call-seq:
422
+ * oradate.trunc
423
+ *
424
+ * Truncates hour, minute and second to zero for <i>oradate</i>.
425
+ *
426
+ * oradate = OraDate.now # 2008/07/17 11:07:30
427
+ * oradate.trunc # 2008/07/17 00:00:00
428
+ */
429
+ static VALUE ora_date_trunc(VALUE self)
430
+ {
431
+ ora_date_t *od;
432
+
433
+ Data_Get_Struct(self, ora_date_t, od);
434
+ od->hour = 1;
435
+ od->minute = 1;
436
+ od->second = 1;
437
+ return self;
310
438
  }
311
439
 
312
440
  /*
313
- =begin
314
- --- OraDate#<=>(other)
315
- =end
316
- */
441
+ * call-seq:
442
+ * oradate1 <=> oradate2 -> -1, 0, +1
443
+ *
444
+ * Comparison---Compares <i>oradate1</i> with <i>oradate2</i>.
445
+ * Other comparison operators are available because
446
+ * <code>Comparable</code> module is included.
447
+ */
317
448
  static VALUE ora_date_cmp(VALUE self, VALUE val)
318
449
  {
319
- ora_date_t *od1, *od2;
320
- Data_Get_Struct(self, ora_date_t, od1);
321
- Data_Get_Struct(val, ora_date_t, od2);
322
- if (od1->century < od2->century) return INT2FIX(-1);
323
- if (od1->century > od2->century) return INT2FIX(1);
324
- if (od1->year < od2->year) return INT2FIX(-1);
325
- if (od1->year > od2->year) return INT2FIX(1);
326
- if (od1->month < od2->month) return INT2FIX(-1);
327
- if (od1->month > od2->month) return INT2FIX(1);
328
- if (od1->day < od2->day) return INT2FIX(-1);
329
- if (od1->day > od2->day) return INT2FIX(1);
330
- if (od1->hour < od2->hour) return INT2FIX(-1);
331
- if (od1->hour > od2->hour) return INT2FIX(1);
332
- if (od1->minute < od2->minute) return INT2FIX(-1);
333
- if (od1->minute > od2->minute) return INT2FIX(1);
334
- if (od1->second < od2->second) return INT2FIX(-1);
335
- if (od1->second > od2->second) return INT2FIX(1);
336
- return INT2FIX(0);
450
+ ora_date_t *od1, *od2;
451
+ Data_Get_Struct(self, ora_date_t, od1);
452
+ Check_Object(val, cOraDate);
453
+ Data_Get_Struct(val, ora_date_t, od2);
454
+ if (od1->century < od2->century) return INT2FIX(-1);
455
+ if (od1->century > od2->century) return INT2FIX(1);
456
+ if (od1->year < od2->year) return INT2FIX(-1);
457
+ if (od1->year > od2->year) return INT2FIX(1);
458
+ if (od1->month < od2->month) return INT2FIX(-1);
459
+ if (od1->month > od2->month) return INT2FIX(1);
460
+ if (od1->day < od2->day) return INT2FIX(-1);
461
+ if (od1->day > od2->day) return INT2FIX(1);
462
+ if (od1->hour < od2->hour) return INT2FIX(-1);
463
+ if (od1->hour > od2->hour) return INT2FIX(1);
464
+ if (od1->minute < od2->minute) return INT2FIX(-1);
465
+ if (od1->minute > od2->minute) return INT2FIX(1);
466
+ if (od1->second < od2->second) return INT2FIX(-1);
467
+ if (od1->second > od2->second) return INT2FIX(1);
468
+ return INT2FIX(0);
337
469
  }
338
470
 
471
+ /* :nodoc: */
472
+ static VALUE ora_date_hash(VALUE self)
473
+ {
474
+ ora_date_t *od;
475
+ unsigned int v;
476
+
477
+ Data_Get_Struct(self, ora_date_t, od);
478
+ v = (od->century << 8)
479
+ + (od->year << 15)
480
+ + (od->month << 22)
481
+ + (od->day << 26)
482
+ + (od->hour << 12)
483
+ + (od->minute << 6)
484
+ + (od->second << 0);
485
+ return INT2FIX(v);
486
+ }
487
+
488
+ /*
489
+ * call-seq:
490
+ * oradate._dump -> string
491
+ *
492
+ * Dumps <i>oradate</i> for marshaling.
493
+ */
339
494
  static VALUE ora_date_dump(int argc, VALUE *argv, VALUE self)
340
495
  {
341
- ora_date_t *od;
342
- Data_Get_Struct(self, ora_date_t, od);
343
- return rb_str_new((const char*)od, sizeof(ora_date_t));
344
- }
496
+ ora_date_t *od;
497
+ Data_Get_Struct(self, ora_date_t, od);
498
+ return rb_str_new((const char*)od, sizeof(ora_date_t)); /* ASCII-8BIT */
499
+ }
345
500
 
501
+ /*
502
+ * call-seq:
503
+ * OraDate._load(string) -> oradate
504
+ *
505
+ * Unmarshals a dumped <code>OraDate</code> object.
506
+ */
346
507
  static VALUE ora_date_s_load(VALUE klass, VALUE str)
347
508
  {
348
- ora_date_t *od;
349
- VALUE obj;
350
-
351
- Check_Type(str, T_STRING);
352
- if (RSTRING_LEN(str) != sizeof(ora_date_t)) {
353
- rb_raise(rb_eTypeError, "marshaled OraDate format differ");
354
- }
355
- obj = Data_Make_Struct(cOraDate, ora_date_t, NULL, xfree, od);
356
- memcpy(od, RSTRING_PTR(str), sizeof(ora_date_t));
357
- return obj;
358
- }
509
+ ora_date_t *od;
510
+ VALUE obj;
511
+
512
+ Check_Type(str, T_STRING);
513
+ if (RSTRING_LEN(str) != sizeof(ora_date_t)) {
514
+ rb_raise(rb_eTypeError, "marshaled OraDate format differ");
515
+ }
516
+ obj = Data_Make_Struct(cOraDate, ora_date_t, NULL, xfree, od);
517
+ memcpy(od, RSTRING_PTR(str), sizeof(ora_date_t));
518
+ return obj;
519
+ }
359
520
 
360
- void Init_ora_date(void)
521
+ /*
522
+ * Document-class: OCI8::BindType::OraDate
523
+ *
524
+ * This is a helper class to bind OraDate as Oracle's <tt>DATE</tt> datatype.
525
+ *
526
+ */
527
+ static VALUE bind_oradate_get(oci8_bind_t *obind, void *data, void *null_struct)
361
528
  {
362
- #ifdef HAVE_RB_DEFINE_ALLOC_FUNC
363
- /* ruby 1.8 */
364
- rb_define_alloc_func(cOraDate, RUBY_METHOD_FUNC(ora_date_s_allocate));
365
- rb_define_method(cOraDate, "initialize", ora_date_initialize, -1);
366
- rb_define_method(cOraDate, "initialize_copy", ora_date_initialize_copy, 1);
367
- #else
368
- /* ruby 1.6 */
369
- rb_define_singleton_method(cOraDate, "new", ora_date_s_new, -1);
370
- rb_define_method(cOraDate, "initialize", ora_date_initialize, -1);
371
- rb_define_method(cOraDate, "clone", ora_date_clone, 0);
372
- rb_define_method(cOraDate, "dup", ora_date_clone, 0);
373
- #endif
529
+ ora_date_t *od;
374
530
 
375
- rb_define_singleton_method(cOraDate, "now", ora_date_s_now, 0);
376
- rb_define_method(cOraDate, "to_s", ora_date_to_s, 0);
377
- rb_define_method(cOraDate, "to_a", ora_date_to_a, 0);
531
+ VALUE obj = Data_Make_Struct(cOraDate, ora_date_t, NULL, xfree, od);
532
+ memcpy(od, data, sizeof(ora_date_t));
533
+ return obj;
534
+ }
378
535
 
379
- rb_define_method(cOraDate, "year", ora_date_year, 0);
380
- rb_define_method(cOraDate, "year=", ora_date_set_year, 1);
536
+ static void bind_oradate_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
537
+ {
538
+ ora_date_t *od;
381
539
 
382
- rb_define_method(cOraDate, "month", ora_date_month, 0);
383
- rb_define_method(cOraDate, "month=", ora_date_set_month, 1);
540
+ Check_Object(val, cOraDate);
541
+ Data_Get_Struct(val, ora_date_t, od);
542
+ memcpy(data, od, sizeof(ora_date_t));
543
+ }
384
544
 
385
- rb_define_method(cOraDate, "day", ora_date_day, 0);
386
- rb_define_method(cOraDate, "day=", ora_date_set_day, 1);
545
+ static void bind_oradate_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
546
+ {
547
+ obind->value_sz = sizeof(ora_date_t);
548
+ obind->alloc_sz = sizeof(ora_date_t);
549
+ }
387
550
 
388
- rb_define_method(cOraDate, "hour", ora_date_hour, 0);
389
- rb_define_method(cOraDate, "hour=", ora_date_set_hour, 1);
551
+ static void bind_oradate_init_elem(oci8_bind_t *obind, VALUE svc)
552
+ {
553
+ static const ora_date_t julian_day_0 = {100-47, 100-12, 1, 1, 1, 1, 1};
554
+ ub4 idx = 0;
555
+ do {
556
+ memcpy((ora_date_t*)obind->valuep + idx, &julian_day_0, sizeof(ora_date_t));
557
+ } while (++idx < obind->maxar_sz);
558
+ }
390
559
 
391
- rb_define_method(cOraDate, "minute", ora_date_minute, 0);
392
- rb_define_method(cOraDate, "minute=", ora_date_set_minute, 1);
560
+ static const oci8_bind_class_t bind_oradate_class = {
561
+ {
562
+ NULL,
563
+ oci8_bind_free,
564
+ sizeof(oci8_bind_t)
565
+ },
566
+ bind_oradate_get,
567
+ bind_oradate_set,
568
+ bind_oradate_init,
569
+ bind_oradate_init_elem,
570
+ NULL,
571
+ NULL,
572
+ NULL,
573
+ SQLT_DAT,
574
+ };
393
575
 
394
- rb_define_method(cOraDate, "second", ora_date_second, 0);
395
- rb_define_method(cOraDate, "second=", ora_date_set_second, 1);
576
+ void Init_ora_date(void)
577
+ {
578
+ cOraDate = rb_define_class("OraDate", rb_cObject);
396
579
 
397
- rb_define_method(cOraDate, "trunc", ora_date_trunc, 0);
580
+ rb_define_alloc_func(cOraDate, ora_date_s_allocate);
581
+ rb_define_method(cOraDate, "initialize", ora_date_initialize, -1);
582
+ rb_define_method(cOraDate, "initialize_copy", ora_date_initialize_copy, 1);
583
+ rb_define_singleton_method(cOraDate, "now", ora_date_s_now, 0);
584
+ rb_define_method(cOraDate, "to_s", ora_date_to_s, 0);
585
+ rb_define_method(cOraDate, "to_a", ora_date_to_a, 0);
398
586
 
399
- rb_define_method(cOraDate, "<=>", ora_date_cmp, 1);
400
- rb_include_module(cOraDate, rb_mComparable);
587
+ rb_define_method(cOraDate, "year", ora_date_year, 0);
588
+ rb_define_method(cOraDate, "year=", ora_date_set_year, 1);
401
589
 
402
- rb_define_method(cOraDate, "hash", ora_date_hash, 0);
590
+ rb_define_method(cOraDate, "month", ora_date_month, 0);
591
+ rb_define_method(cOraDate, "month=", ora_date_set_month, 1);
403
592
 
404
- rb_define_method(cOraDate, "_dump", ora_date_dump, -1);
405
- rb_define_singleton_method(cOraDate, "_load", ora_date_s_load, 1);
406
- }
593
+ rb_define_method(cOraDate, "day", ora_date_day, 0);
594
+ rb_define_method(cOraDate, "day=", ora_date_set_day, 1);
407
595
 
408
- void oci8_set_ora_date(ora_date_t *od, int year, int month, int day, int hour, int minute, int second)
409
- {
410
- Set_year(od, year);
411
- Set_month(od, month);
412
- Set_day(od, day);
413
- Set_hour(od, hour);
414
- Set_minute(od, minute);
415
- Set_second(od, second);
416
- }
596
+ rb_define_method(cOraDate, "hour", ora_date_hour, 0);
597
+ rb_define_method(cOraDate, "hour=", ora_date_set_hour, 1);
417
598
 
418
- void oci8_get_ora_date(ora_date_t *od, int *year, int *month, int *day, int *hour, int *minute, int *second)
419
- {
420
- *year = Get_year(od);
421
- *month = Get_month(od);
422
- *day = Get_day(od);
423
- *hour = Get_hour(od);
424
- *minute = Get_minute(od);
425
- *second = Get_second(od);
599
+ rb_define_method(cOraDate, "minute", ora_date_minute, 0);
600
+ rb_define_method(cOraDate, "minute=", ora_date_set_minute, 1);
601
+
602
+ rb_define_method(cOraDate, "second", ora_date_second, 0);
603
+ rb_define_method(cOraDate, "second=", ora_date_set_second, 1);
604
+
605
+ rb_define_method(cOraDate, "trunc", ora_date_trunc, 0);
606
+
607
+ rb_define_method(cOraDate, "<=>", ora_date_cmp, 1);
608
+ rb_include_module(cOraDate, rb_mComparable);
609
+
610
+ rb_define_method(cOraDate, "hash", ora_date_hash, 0);
611
+
612
+ rb_define_method(cOraDate, "_dump", ora_date_dump, -1);
613
+ rb_define_singleton_method(cOraDate, "_load", ora_date_s_load, 1);
614
+
615
+ oci8_define_bind_class("OraDate", &bind_oradate_class);
426
616
  }