do_openedge 0.10.9-java
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.markdown +3 -0
- data/LICENSE +19 -0
- data/README.markdown +107 -0
- data/Rakefile +25 -0
- data/lib/do_openedge.rb +29 -0
- data/lib/do_openedge/do_openedge.jar +0 -0
- data/lib/do_openedge/version.rb +5 -0
- data/spec/command_spec.rb +9 -0
- data/spec/connection_spec.rb +23 -0
- data/spec/encoding_spec.rb +8 -0
- data/spec/reader_spec.rb +8 -0
- data/spec/result_spec.rb +16 -0
- data/spec/spec_helper.rb +261 -0
- data/spec/typecast/array_spec.rb +8 -0
- data/spec/typecast/bigdecimal_spec.rb +54 -0
- data/spec/typecast/boolean_spec.rb +9 -0
- data/spec/typecast/byte_array_spec.rb +96 -0
- data/spec/typecast/class_spec.rb +68 -0
- data/spec/typecast/date_spec.rb +9 -0
- data/spec/typecast/datetime_spec.rb +9 -0
- data/spec/typecast/float_spec.rb +9 -0
- data/spec/typecast/integer_spec.rb +8 -0
- data/spec/typecast/nil_spec.rb +10 -0
- data/spec/typecast/other_spec.rb +8 -0
- data/spec/typecast/range_spec.rb +8 -0
- data/spec/typecast/string_spec.rb +8 -0
- data/spec/typecast/time_spec.rb +8 -0
- data/tasks/compile.rake +30 -0
- data/tasks/release.rake +14 -0
- data/tasks/spec.rake +11 -0
- metadata +191 -0
data/ChangeLog.markdown
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2012 Abe Voelker, other DataObjects contributors
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
# do_openedge
|
2
|
+
|
3
|
+
* <http://dataobjects.info>
|
4
|
+
|
5
|
+
## Description
|
6
|
+
|
7
|
+
An OpenEdge driver for DataObjects.
|
8
|
+
|
9
|
+
## Features/Problems
|
10
|
+
|
11
|
+
This driver implements the DataObjects API for the Progress OpenEdge relational database.
|
12
|
+
This driver is currently provided only for JRuby.
|
13
|
+
|
14
|
+
### Known Issues
|
15
|
+
|
16
|
+
* `BLOB`/`CLOB` fields cannot be used as predicates or arithmetic/comparison
|
17
|
+
operators. In other words, you cannot query rows based on their value. You
|
18
|
+
will have to query the rows using a different column value (there is no
|
19
|
+
issue doing reads or writes with `BLOB`/`CLOB` fields). See [ProKB P91964][0]
|
20
|
+
for more info.
|
21
|
+
* The 10.2B JDBC driver causes `DECIMAL`/`NUMERIC` SQL types to round up to the
|
22
|
+
nearest integer and then truncate all digits after the decimal point. According
|
23
|
+
to [ProKB P187898][1], it appears to be a regression bug in the JDBC driver.
|
24
|
+
|
25
|
+
## Synopsis
|
26
|
+
|
27
|
+
An example of usage:
|
28
|
+
|
29
|
+
@connection = DataObjects::Connection.new("openedge://localhost:4000/sports2000")
|
30
|
+
@reader = @connection.create_command('SELECT * FROM State').execute_reader
|
31
|
+
@reader.next!
|
32
|
+
|
33
|
+
The `Connection` constructor should be passed either a DataObjects-style URI or
|
34
|
+
JDBC-style URI:
|
35
|
+
|
36
|
+
openedge://user:password@host:port/database?option1=value1&option2=value2
|
37
|
+
jdbc:datadirect:openedge://host:port/database?user=<value>&password=<value>
|
38
|
+
|
39
|
+
Note that the DataDirect proprietary-style JDBC URI tokenized with `;`s:
|
40
|
+
|
41
|
+
jdbc:datadirect:openedge://host:port;databaseName=database;user=<value>;password=<value>
|
42
|
+
|
43
|
+
is **not** supported.
|
44
|
+
|
45
|
+
## Requirements
|
46
|
+
|
47
|
+
* JRuby 1.3.1 + (1.4+ recommended)
|
48
|
+
* `data_objects` gem
|
49
|
+
* `do_jdbc` gem (shared library)
|
50
|
+
|
51
|
+
## Install
|
52
|
+
|
53
|
+
To install the gem:
|
54
|
+
|
55
|
+
jruby -S gem install do_openedge
|
56
|
+
|
57
|
+
To compile and install from source:
|
58
|
+
|
59
|
+
* Install the Java Development Kit (provided if you are on a recent version of
|
60
|
+
Mac OS X) from <http://java.sun.com>
|
61
|
+
* Install a recent version of JRuby. Ensure `jruby` is in your `PATH` and/or
|
62
|
+
you have configured the `JRUBY_HOME` environment variable to point to your
|
63
|
+
JRuby installation.
|
64
|
+
* Install `data_objects` and `do_jdbc` with `jruby -S rake install`.
|
65
|
+
* Install this driver with `jruby -S rake install`.
|
66
|
+
|
67
|
+
## Developers
|
68
|
+
|
69
|
+
Follow the above installation instructions. Additionally, you'll need:
|
70
|
+
* `rspec` gem for running specs.
|
71
|
+
* `YARD` gem for generating documentation.
|
72
|
+
|
73
|
+
See the DataObjects wiki for more comprehensive information:
|
74
|
+
<http://wiki.github.com/datamapper/do/jruby>.
|
75
|
+
|
76
|
+
To run specs:
|
77
|
+
|
78
|
+
jruby -S rake spec
|
79
|
+
|
80
|
+
To run specs without compiling extensions first:
|
81
|
+
|
82
|
+
jruby -S rake spec_no_compile
|
83
|
+
|
84
|
+
To run individual specs:
|
85
|
+
|
86
|
+
jruby -S rake spec SPEC=spec/connection_spec.rb
|
87
|
+
|
88
|
+
### Spec data setup
|
89
|
+
|
90
|
+
The specs require an empty database to use for running tests against
|
91
|
+
(the database will be written/read from by the tests). Here are
|
92
|
+
some commands to be ran from `proenv` to create an empty
|
93
|
+
database that can be used for testing (note the use of UTF-8,
|
94
|
+
which is required for proper multibyte string support):
|
95
|
+
|
96
|
+
prodb test empty
|
97
|
+
proutil test -C convchar convert utf-8
|
98
|
+
sql_env
|
99
|
+
proserve test -S 4000
|
100
|
+
|
101
|
+
## License
|
102
|
+
|
103
|
+
This code is licensed under an **MIT License**. Please see the
|
104
|
+
accompanying `LICENSE` file.
|
105
|
+
|
106
|
+
[0]: http://knowledgebase.progress.com/articles/Article/P91964
|
107
|
+
[1]: http://knowledgebase.progress.com/articles/Article/P187898
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler'
|
4
|
+
require 'rubygems/package_task'
|
5
|
+
Bundler::GemHelper.install_tasks
|
6
|
+
|
7
|
+
require 'rake'
|
8
|
+
require 'rake/clean'
|
9
|
+
|
10
|
+
ROOT = Pathname(__FILE__).dirname.expand_path
|
11
|
+
|
12
|
+
require ROOT + 'lib/do_openedge/version'
|
13
|
+
|
14
|
+
JRUBY = RUBY_PLATFORM =~ /java/
|
15
|
+
IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ironruby'
|
16
|
+
WINDOWS = Gem.win_platform? || (JRUBY && ENV_JAVA['os.name'] =~ /windows/i)
|
17
|
+
SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
|
18
|
+
|
19
|
+
CLEAN.include(%w[ {tmp,pkg}/ **/*.{o,so,bundle,jar,log,a,gem,dSYM,obj,pdb,exp,DS_Store,rbc,db} ext-java/target ])
|
20
|
+
|
21
|
+
|
22
|
+
Rake::Task['build'].clear_actions if Rake::Task.task_defined?('build')
|
23
|
+
task :build => [ :java, :gem ]
|
24
|
+
|
25
|
+
FileList['tasks/**/*.rake'].each { |task| import task }
|
data/lib/do_openedge.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'data_objects'
|
2
|
+
|
3
|
+
if RUBY_PLATFORM =~ /java/
|
4
|
+
require 'do_jdbc'
|
5
|
+
require 'java'
|
6
|
+
|
7
|
+
module DataObjects
|
8
|
+
module Openedge
|
9
|
+
JDBC_DRIVER = 'com.ddtek.jdbc.openedge.OpenEdgeDriver'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
java.lang.Thread.currentThread.getContextClassLoader().loadClass(DataObjects::Openedge::JDBC_DRIVER, true)
|
15
|
+
rescue java.lang.ClassNotFoundException
|
16
|
+
# Load the JDBC driver
|
17
|
+
require 'jdbc/openedge' # the JDBC driver requires, packaged as a gem
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'do_openedge/do_openedge' # the Java extension for this DO driver
|
21
|
+
|
22
|
+
# Another way of loading the JDBC Class. This seems to be more reliable
|
23
|
+
# than Class.forName() within the data_objects.Connection Java class,
|
24
|
+
# which is currently not working as expected.
|
25
|
+
java_import DataObjects::Openedge::JDBC_DRIVER
|
26
|
+
|
27
|
+
else
|
28
|
+
warn "do_openedge is only for use with JRuby"
|
29
|
+
end
|
Binary file
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/command_spec'
|
5
|
+
|
6
|
+
describe DataObjects::Openedge::Command do
|
7
|
+
it_should_behave_like 'a Command'
|
8
|
+
# it_should_behave_like 'a Command with async'
|
9
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/connection_spec'
|
5
|
+
|
6
|
+
describe DataObjects::Openedge::Connection do
|
7
|
+
|
8
|
+
before :all do
|
9
|
+
@driver = CONFIG.scheme
|
10
|
+
@user = CONFIG.user
|
11
|
+
@password = CONFIG.pass
|
12
|
+
@host = CONFIG.host
|
13
|
+
@port = CONFIG.port
|
14
|
+
#TODO
|
15
|
+
#@service = CONFIG.service
|
16
|
+
@database = CONFIG.database
|
17
|
+
end
|
18
|
+
|
19
|
+
it_should_behave_like 'a Connection'
|
20
|
+
#it_should_behave_like 'a Connection with authentication support'
|
21
|
+
it_should_behave_like 'a Connection with JDBC URL support'
|
22
|
+
#it_should_behave_like 'a Connection via JDNI'
|
23
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/encoding_spec'
|
5
|
+
|
6
|
+
describe DataObjects::Openedge::Connection do
|
7
|
+
# it_should_behave_like 'a driver supporting different encodings'
|
8
|
+
end
|
data/spec/reader_spec.rb
ADDED
data/spec/result_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/result_spec'
|
5
|
+
|
6
|
+
# splitting the descibe into two separate declaration avoids
|
7
|
+
# concurrent execution of the "it_should_behave_like ....."
|
8
|
+
# needed by some databases (sqlite3)
|
9
|
+
|
10
|
+
describe DataObjects::Openedge::Result do
|
11
|
+
it_should_behave_like 'a Result'
|
12
|
+
end
|
13
|
+
|
14
|
+
describe DataObjects::Openedge::Result do
|
15
|
+
it_should_behave_like 'a Result which returns inserted key with sequences'
|
16
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
$TESTING=true
|
2
|
+
JRUBY = true
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'rspec'
|
6
|
+
require 'date'
|
7
|
+
require 'ostruct'
|
8
|
+
require 'fileutils'
|
9
|
+
|
10
|
+
driver_lib = File.expand_path('../../lib', __FILE__)
|
11
|
+
$LOAD_PATH.unshift(driver_lib) unless $LOAD_PATH.include?(driver_lib)
|
12
|
+
|
13
|
+
# Prepend data_objects/do_jdbc in the repository to the load path.
|
14
|
+
# DO NOT USE installed gems, except when running the specs from gem.
|
15
|
+
repo_root = File.expand_path('../../..', __FILE__)
|
16
|
+
['data_objects', 'do_jdbc'].each do |lib|
|
17
|
+
lib_path = "#{repo_root}/#{lib}/lib"
|
18
|
+
$LOAD_PATH.unshift(lib_path) if File.directory?(lib_path) && !$LOAD_PATH.include?(lib_path)
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'data_objects'
|
22
|
+
require 'data_objects/spec/setup'
|
23
|
+
require 'data_objects/spec/lib/pending_helpers'
|
24
|
+
require 'do_openedge'
|
25
|
+
|
26
|
+
DataObjects::Openedge.logger = DataObjects::Logger.new(STDOUT, :off)
|
27
|
+
at_exit { DataObjects.logger.flush }
|
28
|
+
|
29
|
+
|
30
|
+
CONFIG = OpenStruct.new
|
31
|
+
CONFIG.scheme = 'openedge'
|
32
|
+
CONFIG.driver = 'openedge'
|
33
|
+
CONFIG.jdbc_driver = DataObjects::Openedge.const_get('JDBC_DRIVER') rescue nil
|
34
|
+
CONFIG.user = ENV['DO_OPENEDGE_USER'] || 'test'
|
35
|
+
CONFIG.pass = ENV['DO_OPENEDGE_PASS'] || ''
|
36
|
+
CONFIG.host = ENV['DO_OPENEDGE_HOST'] || '192.168.1.241'
|
37
|
+
CONFIG.port = ENV['DO_OPENEDGE_PORT'] || '13370'
|
38
|
+
CONFIG.database = ENV['DO_OPENEDGE_DATABASE'] || 'test'
|
39
|
+
# Result of this query must be a value of "1":
|
40
|
+
CONFIG.testsql = "SELECT SIGN(1) FROM SYSPROGRESS.SYSCALCTABLE"
|
41
|
+
CONFIG.uri = ENV["DO_OPENEDGE_SPEC_URI"] ||"#{CONFIG.scheme}://#{CONFIG.user}:#{CONFIG.pass}@#{CONFIG.host}:#{CONFIG.port}/#{CONFIG.database}"
|
42
|
+
CONFIG.jdbc_uri = "jdbc:openedge://#{CONFIG.host}:#{CONFIG.port}/#{CONFIG.database}?user=#{CONFIG.user}&password=#{CONFIG.pass}"
|
43
|
+
|
44
|
+
module DataObjectsSpecHelpers
|
45
|
+
|
46
|
+
TABLE_NOT_FOUND_CODE = -20005
|
47
|
+
SEQUENCE_NOT_FOUND_CODE = -210051
|
48
|
+
SEQUENCE_NOT_VALID_CODE = -20170
|
49
|
+
TRIGGER_NOT_FOUND_CODE = -20147
|
50
|
+
|
51
|
+
def drop_table_seq_and_trig(conn, table_name, catalog="pub")
|
52
|
+
table_name = "#{catalog}.#{table_name}" if catalog && !catalog.empty?
|
53
|
+
begin
|
54
|
+
conn.create_command("DROP TABLE #{table_name}").execute_non_query
|
55
|
+
rescue DataObjects::SQLError => e
|
56
|
+
# OpenEdge does not support DROP TABLE IF EXISTS
|
57
|
+
raise e unless e.code == TABLE_NOT_FOUND_CODE
|
58
|
+
end
|
59
|
+
|
60
|
+
begin
|
61
|
+
conn.create_command("DROP SEQUENCE #{table_name}_id_seq").execute_non_query
|
62
|
+
rescue DataObjects::SQLError => e
|
63
|
+
raise e unless [SEQUENCE_NOT_FOUND_CODE, SEQUENCE_NOT_VALID_CODE].include?(e.code)
|
64
|
+
end
|
65
|
+
|
66
|
+
begin
|
67
|
+
conn.create_command("DROP TRIGGER #{table_name}_trigger").execute_non_query
|
68
|
+
rescue DataObjects::SQLError => e
|
69
|
+
raise e unless e.code == TRIGGER_NOT_FOUND_CODE
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_seq_and_trigger(conn, table_name, catalog="pub")
|
74
|
+
table_name = "#{catalog}.#{table_name}" if catalog && !catalog.empty?
|
75
|
+
conn.create_command(<<-EOF).execute_non_query
|
76
|
+
CREATE SEQUENCE #{table_name}_id_seq
|
77
|
+
START WITH 0,
|
78
|
+
INCREMENT BY 1,
|
79
|
+
NOCYCLE
|
80
|
+
EOF
|
81
|
+
|
82
|
+
# Not opening up sequence permissions causes weird errors.
|
83
|
+
# See ProKB P131308, P10499 for examples
|
84
|
+
# Also, GRANT ALL doesn't work on sequences; it raises error 12666 "invalid sequence name"
|
85
|
+
# (probably because some table operations don't apply to sequences)
|
86
|
+
%w{SELECT UPDATE}.each do |perm|
|
87
|
+
conn.create_command(<<-EOF).execute_non_query
|
88
|
+
GRANT #{perm} ON SEQUENCE #{table_name}_id_seq TO PUBLIC
|
89
|
+
EOF
|
90
|
+
end
|
91
|
+
|
92
|
+
conn.create_command(<<-EOF).execute_non_query
|
93
|
+
CREATE TRIGGER #{table_name}_trigger
|
94
|
+
BEFORE INSERT ON #{table_name}
|
95
|
+
REFERENCING NEWROW
|
96
|
+
FOR EACH ROW
|
97
|
+
IMPORT
|
98
|
+
import java.sql.*;
|
99
|
+
BEGIN
|
100
|
+
Long current_id = (Long)NEWROW.getValue(1, BIGINT);
|
101
|
+
if (current_id == -1) {
|
102
|
+
SQLCursor next_id_query = new SQLCursor("SELECT TOP 1 #{table_name}_id_seq.NEXTVAL FROM SYSPROGRESS.SYSCALCTABLE");
|
103
|
+
next_id_query.open();
|
104
|
+
next_id_query.fetch();
|
105
|
+
Long next_id = (Long)next_id_query.getValue(1,BIGINT);
|
106
|
+
next_id_query.close();
|
107
|
+
NEWROW.setValue(1, next_id);
|
108
|
+
}
|
109
|
+
END
|
110
|
+
EOF
|
111
|
+
end
|
112
|
+
|
113
|
+
def setup_test_environment
|
114
|
+
conn = DataObjects::Connection.new(CONFIG.uri)
|
115
|
+
|
116
|
+
drop_table_seq_and_trig(conn, "invoices")
|
117
|
+
drop_table_seq_and_trig(conn, "users")
|
118
|
+
drop_table_seq_and_trig(conn, "widgets")
|
119
|
+
|
120
|
+
# Users
|
121
|
+
conn.create_command(<<-EOF).execute_non_query
|
122
|
+
CREATE TABLE users (
|
123
|
+
id BIGINT PRIMARY KEY DEFAULT -1,
|
124
|
+
name VARCHAR(200) default 'Billy',
|
125
|
+
fired_at TIMESTAMP
|
126
|
+
)
|
127
|
+
EOF
|
128
|
+
create_seq_and_trigger(conn, "users", "")
|
129
|
+
|
130
|
+
# Invoices
|
131
|
+
conn.create_command(<<-EOF).execute_non_query
|
132
|
+
CREATE TABLE invoices (
|
133
|
+
id BIGINT PRIMARY KEY DEFAULT -1,
|
134
|
+
invoice_number VARCHAR(50) NOT NULL
|
135
|
+
)
|
136
|
+
EOF
|
137
|
+
create_seq_and_trigger(conn, "invoices", "")
|
138
|
+
|
139
|
+
# Widgets
|
140
|
+
conn.create_command(<<-EOF).execute_non_query
|
141
|
+
CREATE TABLE widgets (
|
142
|
+
id BIGINT PRIMARY KEY DEFAULT -1,
|
143
|
+
code CHAR(8) DEFAULT 'A14',
|
144
|
+
name VARCHAR(200) DEFAULT 'Super Widget',
|
145
|
+
shelf_location VARCHAR(4000),
|
146
|
+
description VARCHAR(4000),
|
147
|
+
image_data BLOB,
|
148
|
+
ad_description VARCHAR(4000),
|
149
|
+
ad_image BLOB,
|
150
|
+
whitepaper_text CLOB,
|
151
|
+
class_name VARCHAR(4000),
|
152
|
+
cad_drawing BLOB,
|
153
|
+
flags BIT DEFAULT 0,
|
154
|
+
number_in_stock SMALLINT DEFAULT 500,
|
155
|
+
number_sold INTEGER DEFAULT 0,
|
156
|
+
super_number BIGINT DEFAULT 9223372036854775807,
|
157
|
+
weight FLOAT DEFAULT 1.23,
|
158
|
+
cost1 REAL DEFAULT 10.23,
|
159
|
+
cost2 DECIMAL DEFAULT 50.23,
|
160
|
+
release_date DATE DEFAULT '2008-02-14',
|
161
|
+
release_datetime TIMESTAMP DEFAULT '2008-02-14 00:31:12',
|
162
|
+
release_timestamp TIMESTAMP DEFAULT '2008-02-14 00:31:31'
|
163
|
+
)
|
164
|
+
EOF
|
165
|
+
create_seq_and_trigger(conn, "widgets", "")
|
166
|
+
|
167
|
+
# XXX: OpenEdge has no ENUM
|
168
|
+
# status` enum('active','out of stock') NOT NULL default 'active'
|
169
|
+
|
170
|
+
command = conn.create_command(<<-EOF)
|
171
|
+
INSERT INTO widgets(
|
172
|
+
code,
|
173
|
+
name,
|
174
|
+
shelf_location,
|
175
|
+
description,
|
176
|
+
ad_description,
|
177
|
+
class_name,
|
178
|
+
super_number,
|
179
|
+
weight,
|
180
|
+
release_datetime,
|
181
|
+
release_timestamp)
|
182
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
183
|
+
EOF
|
184
|
+
|
185
|
+
1.upto(16) do |n|
|
186
|
+
command.execute_non_query(
|
187
|
+
"W#{n.to_s.rjust(7,'0')}",
|
188
|
+
"Widget #{n}",
|
189
|
+
'A14',
|
190
|
+
'This is a description',
|
191
|
+
'Buy this product now!',
|
192
|
+
'String',
|
193
|
+
1234,
|
194
|
+
13.4,
|
195
|
+
Time.local(2008,2,14,0,31,12),
|
196
|
+
Time.local(2008,2,14,0,31,12))
|
197
|
+
end
|
198
|
+
|
199
|
+
# These updates are done separately from the initial inserts because the
|
200
|
+
# BLOB/CLOB fields seem to stop the before insert trigger from running!
|
201
|
+
1.upto(16) do |i|
|
202
|
+
command = conn.create_command(<<-EOF)
|
203
|
+
update widgets set
|
204
|
+
image_data = ?,
|
205
|
+
ad_image = ?,
|
206
|
+
whitepaper_text = ?,
|
207
|
+
cad_drawing = ?
|
208
|
+
where id = #{i}
|
209
|
+
EOF
|
210
|
+
command.execute_non_query(
|
211
|
+
::Extlib::ByteArray.new('IMAGE DATA'),
|
212
|
+
::Extlib::ByteArray.new('AD IMAGE DATA'),
|
213
|
+
'1234567890'*500,
|
214
|
+
::Extlib::ByteArray.new("CAD \001 \000 DRAWING")
|
215
|
+
)
|
216
|
+
end
|
217
|
+
|
218
|
+
conn.create_command(<<-EOF).execute_non_query
|
219
|
+
update widgets set flags = 1 where id = 2
|
220
|
+
EOF
|
221
|
+
|
222
|
+
conn.create_command(<<-EOF).execute_non_query
|
223
|
+
update widgets set ad_description = NULL where id = 3
|
224
|
+
EOF
|
225
|
+
|
226
|
+
conn.create_command(<<-EOF).execute_non_query
|
227
|
+
update widgets set flags = NULL where id = 4
|
228
|
+
EOF
|
229
|
+
|
230
|
+
conn.create_command(<<-EOF).execute_non_query
|
231
|
+
update widgets set cost1 = NULL where id = 5
|
232
|
+
EOF
|
233
|
+
|
234
|
+
conn.create_command(<<-EOF).execute_non_query
|
235
|
+
update widgets set cost2 = NULL where id = 6
|
236
|
+
EOF
|
237
|
+
|
238
|
+
conn.create_command(<<-EOF).execute_non_query
|
239
|
+
update widgets set release_date = NULL where id = 7
|
240
|
+
EOF
|
241
|
+
|
242
|
+
conn.create_command(<<-EOF).execute_non_query
|
243
|
+
update widgets set release_datetime = NULL where id = 8
|
244
|
+
EOF
|
245
|
+
|
246
|
+
conn.create_command(<<-EOF).execute_non_query
|
247
|
+
update widgets set release_timestamp = NULL where id = 9
|
248
|
+
EOF
|
249
|
+
|
250
|
+
conn.create_command(<<-EOF).execute_non_query
|
251
|
+
update widgets set release_datetime = '2008-07-14 00:31:12' where id = 10
|
252
|
+
EOF
|
253
|
+
|
254
|
+
conn.close
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
RSpec.configure do |config|
|
259
|
+
config.include(DataObjectsSpecHelpers)
|
260
|
+
config.include(DataObjects::Spec::PendingHelpers)
|
261
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/bigdecimal_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with BigDecimal' do
|
7
|
+
it_should_behave_like 'supporting BigDecimal'
|
8
|
+
#it_should_behave_like 'supporting BigDecimal autocasting'
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'supporting BigDecimal autocasting' do
|
12
|
+
|
13
|
+
before :all do
|
14
|
+
setup_test_environment
|
15
|
+
end
|
16
|
+
|
17
|
+
before do
|
18
|
+
@connection = DataObjects::Connection.new(CONFIG.uri)
|
19
|
+
end
|
20
|
+
|
21
|
+
after do
|
22
|
+
@connection.close
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'reading a BigDecimal' do
|
26
|
+
|
27
|
+
describe 'with automatic typecasting' do
|
28
|
+
|
29
|
+
before do
|
30
|
+
@reader = @connection.create_command("SELECT cost2 FROM widgets WHERE ad_description = ?").execute_reader('Buy this product now!')
|
31
|
+
@reader.next!
|
32
|
+
@values = @reader.values
|
33
|
+
end
|
34
|
+
|
35
|
+
after do
|
36
|
+
@reader.close
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should return the correctly typed result' do
|
40
|
+
@values.first.should be_kind_of(BigDecimal)
|
41
|
+
end
|
42
|
+
|
43
|
+
# There is an error in the JDBC driver that truncates these results. See ProKB P187898:
|
44
|
+
# http://knowledgebase.progress.com/articles/Article/P187898
|
45
|
+
=begin
|
46
|
+
it 'should return the correct result' do
|
47
|
+
@values.first.should == 50.23
|
48
|
+
end
|
49
|
+
=end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/boolean_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with Boolean' do
|
7
|
+
it_should_behave_like 'supporting Boolean'
|
8
|
+
it_should_behave_like 'supporting Boolean autocasting'
|
9
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
|
5
|
+
# Can't use full shared spec due to ProKB P91964
|
6
|
+
#require 'data_objects/spec/shared/typecast/byte_array_spec'
|
7
|
+
|
8
|
+
describe 'supporting ByteArray' do
|
9
|
+
|
10
|
+
before :all do
|
11
|
+
setup_test_environment
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
@connection = DataObjects::Connection.new(CONFIG.uri)
|
16
|
+
end
|
17
|
+
|
18
|
+
after do
|
19
|
+
@connection.close
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'reading a ByteArray' do
|
23
|
+
|
24
|
+
describe 'with automatic typecasting' do
|
25
|
+
|
26
|
+
before do
|
27
|
+
@reader = @connection.create_command("SELECT cad_drawing FROM widgets WHERE ad_description = ?").execute_reader('Buy this product now!')
|
28
|
+
@reader.next!
|
29
|
+
@values = @reader.values
|
30
|
+
end
|
31
|
+
|
32
|
+
after do
|
33
|
+
@reader.close
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should return the correctly typed result' do
|
37
|
+
@values.first.should be_kind_of(::Extlib::ByteArray)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should return the correct result' do
|
41
|
+
@values.first.should == "CAD \001 \000 DRAWING"
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'with manual typecasting' do
|
47
|
+
|
48
|
+
before do
|
49
|
+
@command = @connection.create_command("SELECT cad_drawing FROM widgets WHERE ad_description = ?")
|
50
|
+
@command.set_types(::Extlib::ByteArray)
|
51
|
+
@reader = @command.execute_reader('Buy this product now!')
|
52
|
+
@reader.next!
|
53
|
+
@values = @reader.values
|
54
|
+
end
|
55
|
+
|
56
|
+
after do
|
57
|
+
@reader.close
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should return the correctly typed result' do
|
61
|
+
@values.first.should be_kind_of(::Extlib::ByteArray)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should return the correct result' do
|
65
|
+
@values.first.should == "CAD \001 \000 DRAWING"
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
# CLOB/BLOB fields cannot be used in a query predicate. See ProKB P91964:
|
73
|
+
# http://knowledgebase.progress.com/articles/Article/P91964
|
74
|
+
|
75
|
+
=begin
|
76
|
+
describe 'writing a ByteArray' do
|
77
|
+
|
78
|
+
before do
|
79
|
+
@reader = @connection.create_command("SELECT ad_description FROM widgets WHERE cad_drawing = ?").execute_reader(::Extlib::ByteArray.new("CAD \001 \000 DRAWING"))
|
80
|
+
@reader.next!
|
81
|
+
@values = @reader.values
|
82
|
+
end
|
83
|
+
|
84
|
+
after do
|
85
|
+
@reader.close
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should return the correct entry' do
|
89
|
+
#Some of the drivers starts autoincrementation from 0 not 1
|
90
|
+
@values.first.should == 'Buy this product now!'
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
=end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/class_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with Class' do
|
7
|
+
|
8
|
+
include DataObjectsSpecHelpers
|
9
|
+
|
10
|
+
before :all do
|
11
|
+
setup_test_environment
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
@connection = DataObjects::Connection.new(CONFIG.uri)
|
16
|
+
end
|
17
|
+
|
18
|
+
after do
|
19
|
+
@connection.close
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'reading a Class' do
|
23
|
+
|
24
|
+
describe 'with manual typecasting' do
|
25
|
+
|
26
|
+
before do
|
27
|
+
@command = @connection.create_command("SELECT class_name FROM widgets WHERE ad_description = ?")
|
28
|
+
@command.set_types(Class)
|
29
|
+
@reader = @command.execute_reader('Buy this product now!')
|
30
|
+
@reader.next!
|
31
|
+
@values = @reader.values
|
32
|
+
end
|
33
|
+
|
34
|
+
after do
|
35
|
+
@reader.close
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return the correctly typed result' do
|
39
|
+
@values.first.should be_kind_of(Class)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should return the correct result' do
|
43
|
+
@values.first.should == String
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'writing a Class' do
|
51
|
+
|
52
|
+
before do
|
53
|
+
@reader = @connection.create_command("SELECT class_name FROM widgets WHERE class_name = ?").execute_reader(String)
|
54
|
+
@reader.next!
|
55
|
+
@values = @reader.values
|
56
|
+
end
|
57
|
+
|
58
|
+
after do
|
59
|
+
@reader.close
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should return the correct entry' do
|
63
|
+
@values.first.should == "String"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/date_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with Date' do
|
7
|
+
it_should_behave_like 'supporting Date'
|
8
|
+
it_should_behave_like 'supporting Date autocasting'
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/datetime_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with DateTime' do
|
7
|
+
it_should_behave_like 'supporting DateTime'
|
8
|
+
it_should_behave_like 'supporting DateTime autocasting'
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/float_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with Float' do
|
7
|
+
it_should_behave_like 'supporting Float'
|
8
|
+
it_should_behave_like 'supporting Float autocasting'
|
9
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/nil_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with Nil' do
|
7
|
+
it_should_behave_like 'supporting Nil'
|
8
|
+
it_should_behave_like 'supporting writing an Nil'
|
9
|
+
it_should_behave_like 'supporting Nil autocasting'
|
10
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
4
|
+
require 'data_objects/spec/shared/typecast/other_spec'
|
5
|
+
|
6
|
+
describe 'DataObjects::Openedge with other (unknown) type' do
|
7
|
+
it_should_behave_like 'supporting other (unknown) type'
|
8
|
+
end
|
data/tasks/compile.rake
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
begin
|
2
|
+
gem 'rake-compiler', '~>0.7'
|
3
|
+
require 'rake/javaextensiontask'
|
4
|
+
|
5
|
+
def gemspec
|
6
|
+
@clean_gemspec ||= Gem::Specification::load(File.expand_path('../../do_openedge.gemspec', __FILE__))
|
7
|
+
end
|
8
|
+
|
9
|
+
Rake::JavaExtensionTask.new('do_openedge', gemspec) do |ext|
|
10
|
+
ext.ext_dir = 'ext-java/src/main/java'
|
11
|
+
ext.lib_dir = "lib/#{gemspec.name}"
|
12
|
+
ext.debug = ENV.has_key?('DO_JAVA_DEBUG') && ENV['DO_JAVA_DEBUG']
|
13
|
+
ext.classpath = '../do_jdbc/lib/do_jdbc_internal.jar'
|
14
|
+
ext.java_compiling do |gem|
|
15
|
+
gem.add_dependency 'jdbc-openedge'
|
16
|
+
gem.add_dependency 'do_jdbc', '0.10.9'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# do_openedge is only available for JRuby: the normal behaviour of rake-compiler
|
21
|
+
# is to only chain 'compile:PLATFORM' tasks to 'compile' where PLATFORM is the
|
22
|
+
# platform of the current interpreter (i.e. 'compile:java' to 'compile' only
|
23
|
+
# if running on JRuby). However, we always want to compile for Java, even if
|
24
|
+
# running from MRI.
|
25
|
+
task 'compile:do_openedge' => ['compile:do_openedge:java']
|
26
|
+
task 'compile' => ['compile:java']
|
27
|
+
|
28
|
+
rescue LoadError
|
29
|
+
warn "To compile, install rake-compiler (gem install rake-compiler)"
|
30
|
+
end
|
data/tasks/release.rake
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
desc 'Builds all gems (native, binaries for JRuby and Windows)'
|
2
|
+
task :build_all do
|
3
|
+
`rake clean`
|
4
|
+
`rake java gem`
|
5
|
+
end
|
6
|
+
|
7
|
+
desc 'Release all gems (native, binaries for JRuby and Windows)'
|
8
|
+
task :release_all => :build_all do
|
9
|
+
Dir["pkg/do_openedge-#{DataObjects::Openedge::VERSION}*.gem"].each do |gem_path|
|
10
|
+
command = "gem push #{gem_path}"
|
11
|
+
puts "Executing #{command.inspect}:"
|
12
|
+
sh command
|
13
|
+
end
|
14
|
+
end
|
data/tasks/spec.rake
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
|
3
|
+
RSpec::Core::RakeTask.new(:spec => [:clean, :compile]) do |spec|
|
4
|
+
spec.pattern = './spec/**/*_spec.rb'
|
5
|
+
end
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new(:rcov => [:clean, :compile]) do |rcov|
|
8
|
+
rcov.pattern = "./spec/**/*_spec.rb"
|
9
|
+
rcov.rcov = true
|
10
|
+
rcov.rcov_opts = File.read('spec/rcov.opts').split(/\s+/)
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: do_openedge
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 10
|
8
|
+
- 9
|
9
|
+
version: 0.10.9
|
10
|
+
platform: java
|
11
|
+
authors:
|
12
|
+
- Abe Voelker
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2012-06-05 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
prerelease: false
|
22
|
+
type: :runtime
|
23
|
+
name: data_objects
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 10
|
31
|
+
- 9
|
32
|
+
version: 0.10.9
|
33
|
+
requirement: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
prerelease: false
|
36
|
+
type: :runtime
|
37
|
+
name: do_jdbc
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
- 10
|
45
|
+
- 9
|
46
|
+
version: 0.10.9
|
47
|
+
requirement: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
prerelease: false
|
50
|
+
type: :development
|
51
|
+
name: rspec
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
segments:
|
57
|
+
- 2
|
58
|
+
- 5
|
59
|
+
version: "2.5"
|
60
|
+
requirement: *id003
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
prerelease: false
|
63
|
+
type: :development
|
64
|
+
name: rake-compiler
|
65
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 7
|
72
|
+
version: "0.7"
|
73
|
+
requirement: *id004
|
74
|
+
- !ruby/object:Gem::Dependency
|
75
|
+
prerelease: false
|
76
|
+
type: :runtime
|
77
|
+
name: jdbc-openedge
|
78
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 0
|
84
|
+
version: "0"
|
85
|
+
requirement: *id005
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
prerelease: false
|
88
|
+
type: :runtime
|
89
|
+
name: do_jdbc
|
90
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
- 10
|
97
|
+
- 9
|
98
|
+
version: 0.10.9
|
99
|
+
requirement: *id006
|
100
|
+
description: Implements the DataObjects API for OpenEdge
|
101
|
+
email: abe@abevoelker.com
|
102
|
+
executables: []
|
103
|
+
|
104
|
+
extensions: []
|
105
|
+
|
106
|
+
extra_rdoc_files:
|
107
|
+
- ChangeLog.markdown
|
108
|
+
- LICENSE
|
109
|
+
- README.markdown
|
110
|
+
files:
|
111
|
+
- ChangeLog.markdown
|
112
|
+
- LICENSE
|
113
|
+
- README.markdown
|
114
|
+
- Rakefile
|
115
|
+
- lib/do_openedge.rb
|
116
|
+
- lib/do_openedge/version.rb
|
117
|
+
- spec/command_spec.rb
|
118
|
+
- spec/connection_spec.rb
|
119
|
+
- spec/encoding_spec.rb
|
120
|
+
- spec/reader_spec.rb
|
121
|
+
- spec/result_spec.rb
|
122
|
+
- spec/spec_helper.rb
|
123
|
+
- spec/typecast/array_spec.rb
|
124
|
+
- spec/typecast/bigdecimal_spec.rb
|
125
|
+
- spec/typecast/boolean_spec.rb
|
126
|
+
- spec/typecast/byte_array_spec.rb
|
127
|
+
- spec/typecast/class_spec.rb
|
128
|
+
- spec/typecast/date_spec.rb
|
129
|
+
- spec/typecast/datetime_spec.rb
|
130
|
+
- spec/typecast/float_spec.rb
|
131
|
+
- spec/typecast/integer_spec.rb
|
132
|
+
- spec/typecast/nil_spec.rb
|
133
|
+
- spec/typecast/other_spec.rb
|
134
|
+
- spec/typecast/range_spec.rb
|
135
|
+
- spec/typecast/string_spec.rb
|
136
|
+
- spec/typecast/time_spec.rb
|
137
|
+
- tasks/compile.rake
|
138
|
+
- tasks/release.rake
|
139
|
+
- tasks/spec.rake
|
140
|
+
- lib/do_openedge/do_openedge.jar
|
141
|
+
has_rdoc: true
|
142
|
+
homepage:
|
143
|
+
licenses: []
|
144
|
+
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
|
148
|
+
require_paths:
|
149
|
+
- lib
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
segments:
|
155
|
+
- 0
|
156
|
+
version: "0"
|
157
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
segments:
|
162
|
+
- 0
|
163
|
+
version: "0"
|
164
|
+
requirements: []
|
165
|
+
|
166
|
+
rubyforge_project: dorb
|
167
|
+
rubygems_version: 1.3.6
|
168
|
+
signing_key:
|
169
|
+
specification_version: 3
|
170
|
+
summary: DataObjects OpenEdge Driver
|
171
|
+
test_files:
|
172
|
+
- spec/command_spec.rb
|
173
|
+
- spec/connection_spec.rb
|
174
|
+
- spec/encoding_spec.rb
|
175
|
+
- spec/reader_spec.rb
|
176
|
+
- spec/result_spec.rb
|
177
|
+
- spec/spec_helper.rb
|
178
|
+
- spec/typecast/array_spec.rb
|
179
|
+
- spec/typecast/bigdecimal_spec.rb
|
180
|
+
- spec/typecast/boolean_spec.rb
|
181
|
+
- spec/typecast/byte_array_spec.rb
|
182
|
+
- spec/typecast/class_spec.rb
|
183
|
+
- spec/typecast/date_spec.rb
|
184
|
+
- spec/typecast/datetime_spec.rb
|
185
|
+
- spec/typecast/float_spec.rb
|
186
|
+
- spec/typecast/integer_spec.rb
|
187
|
+
- spec/typecast/nil_spec.rb
|
188
|
+
- spec/typecast/other_spec.rb
|
189
|
+
- spec/typecast/range_spec.rb
|
190
|
+
- spec/typecast/string_spec.rb
|
191
|
+
- spec/typecast/time_spec.rb
|