ruby-plsql 0.1.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.
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Package" do
4
+ before(:all) do
5
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
6
+ plsql.connection.exec <<-EOS
7
+ CREATE OR REPLACE PACKAGE test_package IS
8
+ FUNCTION test_uppercase ( p_string VARCHAR2 )
9
+ RETURN VARCHAR2;
10
+ END;
11
+ EOS
12
+ plsql.connection.exec <<-EOS
13
+ CREATE OR REPLACE PACKAGE BODY test_package IS
14
+ FUNCTION test_uppercase ( p_string VARCHAR2 )
15
+ RETURN VARCHAR2
16
+ IS
17
+ BEGIN
18
+ RETURN UPPER(p_string);
19
+ END test_uppercase;
20
+ END;
21
+ EOS
22
+
23
+ end
24
+
25
+ after(:all) do
26
+ plsql.logoff
27
+ end
28
+
29
+ before(:each) do
30
+ end
31
+
32
+ it "should find existing package" do
33
+ PLSQL::Package.find(plsql, :test_package).should_not be_nil
34
+ end
35
+
36
+ it "should not find nonexisting package" do
37
+ PLSQL::Package.find(plsql, :qwerty123456).should be_nil
38
+ end
39
+
40
+ it "should find existing package in schema" do
41
+ plsql.test_package.class.should == PLSQL::Package
42
+ end
43
+
44
+ it "should execute package function and return correct value" do
45
+ plsql.test_package.test_uppercase('xxx').should == 'XXX'
46
+ end
47
+
48
+ end
@@ -0,0 +1,168 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Procedure with string parameters" do
4
+
5
+ before(:all) do
6
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
7
+ plsql.connection.exec <<-EOS
8
+ CREATE OR REPLACE FUNCTION test_uppercase
9
+ ( p_string VARCHAR2 )
10
+ RETURN VARCHAR2
11
+ IS
12
+ BEGIN
13
+ RETURN UPPER(p_string);
14
+ END test_uppercase;
15
+ EOS
16
+ end
17
+
18
+ after(:all) do
19
+ plsql.logoff
20
+ end
21
+
22
+ it "should find existing procedure" do
23
+ PLSQL::Procedure.find(plsql, :test_uppercase).should_not be_nil
24
+ end
25
+
26
+ it "should not find nonexisting procedure" do
27
+ PLSQL::Procedure.find(plsql, :qwerty123456).should be_nil
28
+ end
29
+
30
+ it "should execute function and return correct value" do
31
+ plsql.test_uppercase('xxx').should == 'XXX'
32
+ end
33
+
34
+ it "should execute function with named parameters and return correct value" do
35
+ plsql.test_uppercase(:p_string => 'xxx').should == 'XXX'
36
+ end
37
+
38
+ it "should raise error if wrong number of arguments is passed" do
39
+ lambda { plsql.test_uppercase('xxx','yyy') }.should raise_error(ArgumentError)
40
+ end
41
+
42
+ it "should raise error if wrong named argument is passed" do
43
+ lambda { plsql.test_uppercase(:p_string2 => 'xxx') }.should raise_error(ArgumentError)
44
+ end
45
+
46
+ it "should execute function with schema name specified" do
47
+ plsql.hr.test_uppercase('xxx').should == 'XXX'
48
+ end
49
+
50
+ end
51
+
52
+ describe "Procedure with numeric parameters" do
53
+
54
+ before(:all) do
55
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
56
+ plsql.connection.exec <<-EOS
57
+ CREATE OR REPLACE FUNCTION test_sum
58
+ ( p_num1 NUMBER, p_num2 NUMBER )
59
+ RETURN NUMBER
60
+ IS
61
+ BEGIN
62
+ RETURN p_num1 + p_num2;
63
+ END test_sum;
64
+ EOS
65
+ end
66
+
67
+ after(:all) do
68
+ plsql.logoff
69
+ end
70
+
71
+ it "should process integer parameters" do
72
+ plsql.test_sum(123,456).should == 579
73
+ end
74
+
75
+ it "should process big integer parameters" do
76
+ plsql.test_sum(123123123123,456456456456).should == 579579579579
77
+ end
78
+
79
+ it "should process float parameters" do
80
+ plsql.test_sum(123.123,456.456).should == 579.579
81
+ end
82
+
83
+ end
84
+
85
+ describe "Procedure with date parameters" do
86
+
87
+ before(:all) do
88
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
89
+ plsql.connection.exec <<-EOS
90
+ CREATE OR REPLACE FUNCTION test_date
91
+ ( p_date DATE )
92
+ RETURN DATE
93
+ IS
94
+ BEGIN
95
+ RETURN p_date + 1;
96
+ END test_date;
97
+ EOS
98
+ end
99
+
100
+ after(:all) do
101
+ plsql.logoff
102
+ end
103
+
104
+ it "should process date parameters" do
105
+ now = DateTime.new(2008,8,12,14,28,0)
106
+ plsql.test_date(now).should == now + 1
107
+ end
108
+
109
+ it "should process old date parameters" do
110
+ now = DateTime.new(1900,1,1,12,0,0)
111
+ plsql.test_date(now).should == now + 1
112
+ end
113
+
114
+ end
115
+
116
+ describe "Procedure with timestamp parameters" do
117
+
118
+ before(:all) do
119
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
120
+ plsql.connection.exec <<-EOS
121
+ CREATE OR REPLACE FUNCTION test_timestamp
122
+ ( p_time TIMESTAMP )
123
+ RETURN TIMESTAMP
124
+ IS
125
+ BEGIN
126
+ RETURN p_time + 1;
127
+ END test_timestamp;
128
+ EOS
129
+ end
130
+
131
+ after(:all) do
132
+ plsql.logoff
133
+ end
134
+
135
+ it "should process timestamp parameters" do
136
+ now = Time.local(2008,8,12,14,28,0)
137
+ plsql.test_timestamp(now).should == now + 60*60*24
138
+ end
139
+
140
+ end
141
+
142
+ describe "Procedure with output parameters" do
143
+ before(:all) do
144
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
145
+ plsql.connection.exec <<-EOS
146
+ CREATE OR REPLACE PROCEDURE test_copy
147
+ ( p_from VARCHAR2, p_to OUT VARCHAR2, p_to_double OUT VARCHAR2 )
148
+ IS
149
+ BEGIN
150
+ p_to := p_from;
151
+ p_to_double := p_from || p_from;
152
+ END test_copy;
153
+ EOS
154
+ end
155
+
156
+ after(:all) do
157
+ plsql.logoff
158
+ end
159
+
160
+ it "should return array with output parameters" do
161
+ plsql.test_copy("abc", nil, nil).should == { :p_to => "abc", :p_to_double => "abcabc" }
162
+ end
163
+
164
+ it "should return array with output parameters when called with named parameters" do
165
+ plsql.test_copy(:p_from => "abc", :p_to => nil, :p_to_double => nil).should == { :p_to => "abc", :p_to_double => "abcabc" }
166
+ end
167
+
168
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Schema" do
4
+
5
+ it "should create Schema object" do
6
+ plsql.class.should == PLSQL::Schema
7
+ end
8
+
9
+ end
10
+
11
+ describe "Connection" do
12
+
13
+ before(:each) do
14
+ @conn = OCI8.new("hr","hr","xe")
15
+ end
16
+
17
+ after(:each) do
18
+ @conn.logoff
19
+ end
20
+
21
+ it "should connect to test database" do
22
+ plsql.connection = @conn
23
+ plsql.connection.should == @conn
24
+ end
25
+
26
+ it "should connect to test database using connection alias" do
27
+ plsql(:hr).connection = @conn
28
+ plsql(:hr).connection.should == @conn
29
+ end
30
+
31
+ it "should return schema name" do
32
+ plsql.connection = @conn
33
+ plsql.schema_name.should == 'HR'
34
+ end
35
+
36
+ it "should return nil schema name if not connected" do
37
+ plsql(:xxx).schema_name.should == nil
38
+ end
39
+
40
+ end
41
+
42
+ describe "Named Schema" do
43
+ before(:all) do
44
+ @conn = OCI8.new("hr","hr","xe")
45
+ plsql.connection = @conn
46
+ end
47
+
48
+ after(:all) do
49
+ @conn.logoff
50
+ end
51
+
52
+ it "should find existing schema" do
53
+ plsql.hr.class.should == PLSQL::Schema
54
+ end
55
+
56
+ it "should have the same connection as default schema" do
57
+ plsql.hr.connection.should == @conn
58
+ end
59
+
60
+ it "should return schema name" do
61
+ plsql.hr.schema_name.should == 'HR'
62
+ end
63
+
64
+ it "should not find named schema if specified twice" do
65
+ lambda { plsql.hr.hr }.should raise_error(ArgumentError)
66
+ end
67
+
68
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,9 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/ruby_plsql")
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/*"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/*/*_spec.rb']
21
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,110 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ Ruby API for PL/SQL
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>Ruby API for PL/SQL</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/ruby-plsql"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/ruby-plsql" class="numbers">0.1.0</a>
37
+ </div>
38
+ <h1>&#x2192; &#8216;ruby-plsql&#8217;</h1>
39
+
40
+
41
+ <h2>What</h2>
42
+
43
+
44
+ <p>ruby-plsql gem provides simple Ruby <span class="caps">API</span> for calling Oracle PL/SQL procedures. This gem requires ruby-oci8 for connection to Oracle database.</p>
45
+
46
+
47
+ <h2>Installing</h2>
48
+
49
+
50
+ <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">ruby</span><span class="punct">-</span><span class="ident">plsql</span></pre></p>
51
+
52
+
53
+ <h2>The basics</h2>
54
+
55
+
56
+ <p>Read <a href="http://blog.rayapps.com/2008/03/15/ruby-plsql-gem-simple-ruby-api-for-plsql-procedures/">this blog post first.</a></p>
57
+
58
+
59
+ <p>Usage examples:</p>
60
+
61
+
62
+ <p><pre class='syntax'>
63
+ <span class="ident">require</span> <span class="punct">&quot;</span><span class="string">ruby_plsql</span><span class="punct">&quot;</span>
64
+
65
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">connection</span> <span class="punct">=</span> <span class="constant">OCI8</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(&quot;</span><span class="string">hr</span><span class="punct">&quot;,&quot;</span><span class="string">hr</span><span class="punct">&quot;,&quot;</span><span class="string">xe</span><span class="punct">&quot;)</span>
66
+
67
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">('</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; &quot;XXX&quot;</span>
68
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">(</span><span class="symbol">:p_string</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; &quot;XXX&quot;</span>
69
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_copy</span><span class="punct">(&quot;</span><span class="string">abc</span><span class="punct">&quot;,</span> <span class="constant">nil</span><span class="punct">,</span> <span class="constant">nil</span><span class="punct">)</span> <span class="comment"># =&gt; { :p_to =&gt; &quot;abc&quot;, :p_to_double =&gt; &quot;abcabc&quot; }</span>
70
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_copy</span><span class="punct">(</span><span class="symbol">:p_from</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">abc</span><span class="punct">&quot;,</span> <span class="symbol">:p_to</span> <span class="punct">=&gt;</span> <span class="constant">nil</span><span class="punct">,</span> <span class="symbol">:p_to_double</span> <span class="punct">=&gt;</span> <span class="constant">nil</span><span class="punct">)</span>
71
+ <span class="comment"># =&gt; { :p_to =&gt; &quot;abc&quot;, :p_to_double =&gt; &quot;abcabc&quot; }</span>
72
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">hr</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">('</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; &quot;XXX&quot;</span>
73
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_package</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">('</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; 'XXX'</span>
74
+
75
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">logoff</span>
76
+ </pre></p>
77
+
78
+
79
+ <p>See more examples in RSpec tests in spec directory of gem.</p>
80
+
81
+
82
+ <h2>Feedback</h2>
83
+
84
+
85
+ <p>Submit your feedback as comments <a href="http://blog.rayapps.com/2008/03/15/ruby-plsql-gem-simple-ruby-api-for-plsql-procedures/">here.</a></p>
86
+
87
+
88
+ <h2>How to submit patches</h2>
89
+
90
+
91
+ <p>Submit bugs and patches to <a href="http://rubyforge.org/tracker/?group_id=5816">RubyForge</a></p>
92
+
93
+
94
+ <p>The trunk repository is <code>http://ruby-plsql.rubyforge.org/svn/</code> for anonymous access.</p>
95
+
96
+
97
+ <h2>License</h2>
98
+
99
+
100
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
101
+ <p class="coda">
102
+ <a href="http://blog.rayapps.com">Raimonds Simanovskis</a>, 16th March 2008<br>
103
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
104
+ </p>
105
+ </div>
106
+
107
+ <!-- insert site tracking codes here, like Google Urchin -->
108
+
109
+ </body>
110
+ </html>