oci8_simple 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ command-line scripts to aid automation. This is *not* meant to replace an ORM s
5
5
  The only prerequisite to running this code is that you have installed the ruby-oci8 gem on your machine.
6
6
 
7
7
  == Installation
8
- [sudo] gem install oci8-simple
8
+ gem install oci8_simple
9
9
 
10
10
  == Configuration
11
11
  To configure environments and schema settings, edit the
@@ -24,11 +24,9 @@ All logging is done to ~/.oci8_simple/oci8_simple.log
24
24
 
25
25
  == Examples
26
26
  * Initialize a client against the development schema
27
- client = Oci8Simple.new
27
+ client = Oci8Simple::Client.new
28
28
  * Run a simple select query against development schema
29
29
  client.run('select id, name from foos') => [[2, "lol"], [3, "hey"], ...]
30
- * Run a simple select query against stage schema
31
- Oci8Simple.new("stage").run('select id, name from foos') => [[2, "lol"], [3, "hey"], ...]
32
30
  * Update something
33
31
  client.run <<-SQL
34
32
  UPDATE foos SET bar='baz' WHERE id=1233
@@ -49,6 +47,8 @@ All logging is done to ~/.oci8_simple/oci8_simple.log
49
47
  INSERT INTO T1 VALUES(b,a);
50
48
  END;
51
49
  SQL
50
+ * Run a query against stage schema
51
+ Oci8Simple::Client.new("stage").run('select id, name from foos') => [[2, "lol"], [3, "hey"], ...]
52
52
 
53
53
  == Contributing to oci8_simple
54
54
 
data/Rakefile CHANGED
@@ -29,7 +29,7 @@ Jeweler::RubygemsDotOrgTasks.new
29
29
  require 'rake/testtask'
30
30
  Rake::TestTask.new(:test) do |test|
31
31
  test.libs << 'lib' << 'test'
32
- test.pattern = 'test/**/test_*.rb'
32
+ test.pattern = 'test/**/*_test.rb'
33
33
  test.verbose = true
34
34
  end
35
35
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
@@ -0,0 +1,27 @@
1
+ module Oci8Simple
2
+ # == Description
3
+ # A very thin wrapper around Oci8Simple::Client that formats the output
4
+ # as CSV (suitable for printing on the console)
5
+ # == Usage
6
+ # cli = Oci8Simple::Cli.new
7
+ # cli.run "select id, name from foos" # "3, Bacon\n5, Cheese Puffs\n..."
8
+ class Cli
9
+ attr_accessor :env, :client
10
+
11
+ def initialize(env=nil)
12
+ self.env = env
13
+ end
14
+
15
+ def run(sql)
16
+ format(client.run(sql))
17
+ end
18
+
19
+ def format(arr)
20
+ arr.map{|row| row.join(", ")}.join("\n")
21
+ end
22
+
23
+ def client
24
+ @client ||= Client.new(env)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # Run single statements against an arbitrary Oracle schema. This client is intended to be used by simple
5
+ # command-line scripts to aid automation. This is *not* meant to replace an ORM such as ActiveRecord + OracleEnhancedAdapter.
6
+ # The only prerequisite to running this code is that you have installed the ruby-oci8 gem on your machine.
7
+ #
8
+ # == Logging
9
+ # All logging is done to ~/.oci8_simple/oci8_simple.log
10
+ #
11
+ # == Examples
12
+ # * Initialize a client against the development schema
13
+ # client = Oci8Simple::Client.new
14
+ # * Run a simple select query against development schema
15
+ # client.run('select id, name from foos') => [[2, "lol"], [3, "hey"], ...]
16
+ # * Run a simple select query against stage schema
17
+ # Oci8Simple:Client.new("stage").run('select id, name from foos') => [[2, "lol"], [3, "hey"], ...]
18
+ # * Update something
19
+ # client.run <<-SQL
20
+ # UPDATE foos SET bar='baz' WHERE id=1233
21
+ # SQL
22
+ # * Run some DDL
23
+ # client.run <<-SQL
24
+ # CREATE TABLE foos (
25
+ # ID NUMBER(38) NOT NULL
26
+ # )
27
+ # SQL
28
+ # * Run some PL/SQL
29
+ # client.run <<-SQL
30
+ # DECLARE
31
+ # a NUMBER;
32
+ # b NUMBER;
33
+ # BEGIN
34
+ # SELECT e,f INTO a,b FROM T1 WHERE e>1;
35
+ # INSERT INTO T1 VALUES(b,a);
36
+ # END;
37
+ # SQL
38
+ module Oci8Simple
39
+ class Client
40
+ USER_DIR = File.join(ENV["HOME"], ".oci8_simple")
41
+ CONFIG_FILE = File.join(USER_DIR, "database.yml")
42
+ LOG_FILE = File.join(USER_DIR, "oci8_simple.log")
43
+
44
+ attr_accessor :log_file, :env
45
+
46
+ # * env is the environment heading in your database.yml file
47
+ def initialize(env=nil)
48
+ self.env = env || "development"
49
+ conn.autocommit = true
50
+ end
51
+
52
+ def log_file
53
+ @log_file ||= File.open(LOG_FILE, 'a')
54
+ end
55
+
56
+ def run(sql)
57
+ log(sql)
58
+ result = []
59
+ conn.exec(sql) do |r|
60
+ row = []
61
+ r.map do |col|
62
+ if col.class == BigDecimal
63
+ row << col.to_i
64
+ elsif col.class == OCI8::CLOB
65
+ row << col.read
66
+ else
67
+ row << col.to_s
68
+ end
69
+ end
70
+ result << row
71
+ end
72
+ result
73
+ end
74
+
75
+ def config
76
+ @config ||= YAML.load_file(CONFIG_FILE)[env]
77
+ end
78
+
79
+ private
80
+
81
+ def conn
82
+ @conn ||= OCI8.new(config["username"], config["password"], config["database"])
83
+ end
84
+
85
+ def log(str)
86
+ log_file.puts "#{Time.now} - #{@env} - #{str}"
87
+ end
88
+ end
89
+ end
data/lib/oci8_simple.rb CHANGED
@@ -1,143 +1,10 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'rubygems'
4
- gem 'ruby-oci8'
5
- require 'oci8'
6
2
  require 'pp'
7
3
  require 'bigdecimal'
8
4
  require 'yaml'
9
5
 
10
- # Run single statements against an arbitrary Oracle schema. This client is intended to be used by simple
11
- # command-line scripts to aid automation. This is *not* meant to replace an ORM such as ActiveRecord + OracleEnhancedAdapter.
12
- # The only prerequisite to running this code is that you have installed the ruby-oci8 gem on your machine.
13
- #
14
- # == Installation
15
- # [sudo] gem install oci8-simple
16
- #
17
- # == Configuration
18
- # To configure environments and schema settings, edit the
19
- # database.yml file in ~/.oci8_simple/
20
- # development:
21
- # database: oracle.hostname:1521/sid
22
- # username: foo_dev
23
- # password: OMG333
24
- # test:
25
- # database: oracle.hostname:1521/sid
26
- # username: foo_test
27
- # password: OMG333
28
- #
29
- # == Logging
30
- # All logging is done to ~/.oci8_simple/oci8_simple.log
31
- #
32
- # == Examples
33
- # * Initialize a client against the development schema
34
- # client = Oci8Simple.new
35
- # * Run a simple select query against development schema
36
- # client.run('select id, name from foos') => [[2, "lol"], [3, "hey"], ...]
37
- # * Run a simple select query against stage schema
38
- # Oci8Simple.new("stage").run('select id, name from foos') => [[2, "lol"], [3, "hey"], ...]
39
- # * Update something
40
- # client.run <<-SQL
41
- # UPDATE foos SET bar='baz' WHERE id=1233
42
- # SQL
43
- # * Run some DDL
44
- # client.run <<-SQL
45
- # CREATE TABLE foos (
46
- # ID NUMBER(38) NOT NULL
47
- # )
48
- # SQL
49
- # * Run some PL/SQL
50
- # client.run <<-SQL
51
- # DECLARE
52
- # a NUMBER;
53
- # b NUMBER;
54
- # BEGIN
55
- # SELECT e,f INTO a,b FROM T1 WHERE e>1;
56
- # INSERT INTO T1 VALUES(b,a);
57
- # END;
58
- # SQL
59
- class Oci8Simple
60
- USER_DIR = File.join(ENV["HOME"], ".oci8_simple")
61
- CONFIG_FILE = File.join(USER_DIR, "database.yml")
62
- LOG_FILE = File.join(USER_DIR, "oci8_simple.log")
63
-
64
- attr_accessor :log_file, :puts_mode, :env
65
-
66
- # * env is the environment heading in your database.yml file
67
- # * uname is the username you want to use (defaults to config["username"])
68
- # * puts_mode is whether you want to format the result for printing to a terminal (defaults to false)
69
- def initialize(env="development", uname=nil, puts_mode=false)
70
- @env = env
71
- @uname = uname
72
- @puts_mode = puts_mode
73
- conn.autocommit = true
74
- end
75
-
76
- def log_file
77
- @log_file ||= File.open(LOG_FILE, 'a')
78
- end
79
-
80
- def run(sql)
81
- log(sql)
82
- result = []
83
- conn.exec(sql) do |r|
84
- row = []
85
- r.map do |col|
86
- if col.class == BigDecimal
87
- row << col.to_i
88
- elsif col.class == OCI8::CLOB
89
- row << col.read
90
- else
91
- row << col.to_s
92
- end
93
- end
94
- result << row
95
- end
96
-
97
- if @puts_mode
98
- result.map{|row| row.join(", ")}.join("\n")
99
- else
100
- if(result.length == 1 && result[0].length == 1)
101
- result[0][0]
102
- else
103
- result
104
- end
105
- end
106
- end
107
-
108
- def config
109
- @config ||= YAML.load_file(CONFIG_FILE)[@env]
110
- end
111
-
112
- private
113
- def conn
114
- @o ||= OCI8.new(@uname || config["username"], config["password"], config["database"])
115
- end
116
-
117
- def log(str)
118
- log_file.puts "#{Time.now} - #{@env} - #{str}"
119
- end
120
-
121
- def self.help
122
- <<-HELP
123
- Run arbitrary SQL against an Oracle schema. The default schema is the one defined
124
- in the development section of your ~/.oci8_simple/database.yml file.
125
-
126
- You do not need to include a semicolon to end a statement. The statement should be enclosed in single
127
- or double quotes.
128
-
129
- Usage: #{$0} SQL [ENV]
130
- Example: #{$0} 'select id from users' stage
131
- HELP
132
- end
133
- end
6
+ gem 'ruby-oci8'
7
+ require 'oci8'
134
8
 
135
- if __FILE__ == $0
136
- if(["-h", "--help"].include?(ARGV[0]) || ARGV.empty?)
137
- Oci8Simple.help
138
- else
139
- sql = ARGV[0] || ""
140
- env = ARGV[1] || "development"
141
- Oci8Simple.new(env).run(sql)
142
- end
143
- end
9
+ require 'oci8_simple/client'
10
+ require 'oci8_simple/cli'
data/oci8_simple.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{oci8_simple}
8
- s.version = "0.1.1"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Billy Reisinger"]
@@ -26,9 +26,12 @@ Gem::Specification.new do |s|
26
26
  "Rakefile",
27
27
  "VERSION",
28
28
  "lib/oci8_simple.rb",
29
+ "lib/oci8_simple/cli.rb",
30
+ "lib/oci8_simple/client.rb",
29
31
  "oci8_simple.gemspec",
30
- "test/helper.rb",
31
- "test/test_oci8_simple.rb"
32
+ "test/cli_test.rb",
33
+ "test/client_test.rb",
34
+ "test/helper.rb"
32
35
  ]
33
36
  s.homepage = %q{http://github.com/unclebilly/oci8_simple}
34
37
  s.licenses = ["MIT"]
@@ -36,8 +39,9 @@ Gem::Specification.new do |s|
36
39
  s.rubygems_version = %q{1.5.2}
37
40
  s.summary = %q{Run single statements against an arbitrary Oracle schema.}
38
41
  s.test_files = [
39
- "test/helper.rb",
40
- "test/test_oci8_simple.rb"
42
+ "test/cli_test.rb",
43
+ "test/client_test.rb",
44
+ "test/helper.rb"
41
45
  ]
42
46
 
43
47
  if s.respond_to? :specification_version then
data/test/cli_test.rb ADDED
@@ -0,0 +1,36 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+ class CliTest < Test::Unit::TestCase
3
+ context "Given a table and some data" do
4
+ setup do
5
+ @client = Oci8Simple::Client.new("test")
6
+ @client.run "DROP TABLE OCI8_SIMPLE_TEST CASCADE CONSTRAINTS" rescue nil
7
+ @client.run <<-SQL
8
+ CREATE TABLE "OCI8_SIMPLE_TEST"
9
+ (
10
+ "ID" NUMBER(38,0) NOT NULL ENABLE,
11
+ "NAME" VARCHAR2(400 CHAR) NOT NULL ENABLE,
12
+ "TEXTS" CLOB
13
+ )
14
+ SQL
15
+ @client.run "INSERT INTO OCI8_SIMPLE_TEST (ID, NAME, TEXTS) VALUES (1, 'Johnny', 'OMG')"
16
+ @client.run "INSERT INTO OCI8_SIMPLE_TEST (ID, NAME, TEXTS) VALUES (2, 'Jenny', 'OMG')"
17
+ @cli = Oci8Simple::Cli.new("test")
18
+ end
19
+ context "with an env" do
20
+ setup do
21
+ @cli = Oci8Simple::Cli.new("test")
22
+ end
23
+ should "format results for the command line" do
24
+ assert_equal("1, Johnny, OMG\n2, Jenny, OMG", @cli.run("select * from oci8_simple_test"))
25
+ end
26
+ end
27
+ context "without an env" do
28
+ setup do
29
+ @cli = Oci8Simple::Cli.new
30
+ end
31
+ should "default to development" do
32
+ assert_equal("development", @cli.client.env)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,15 +1,15 @@
1
- require 'helper'
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
2
 
3
- class TestOci8Simple < Test::Unit::TestCase
3
+ class ClientTest < Test::Unit::TestCase
4
4
  context "A client" do
5
5
  should "default to development environment" do
6
- @client = Oci8Simple.new
6
+ @client = Oci8Simple::Client.new
7
7
  assert_equal "development", @client.env
8
8
  end
9
9
  end
10
10
  context "Given a table" do
11
11
  setup do
12
- @client = Oci8Simple.new("test", nil, false)
12
+ @client = Oci8Simple::Client.new("test")
13
13
  @client.run "DROP TABLE OCI8_SIMPLE_TEST CASCADE CONSTRAINTS" rescue nil
14
14
  @client.run <<-SQL
15
15
  CREATE TABLE "OCI8_SIMPLE_TEST"
@@ -26,33 +26,22 @@ class TestOci8Simple < Test::Unit::TestCase
26
26
  INSERT INTO OCI8_SIMPLE_TEST (ID, NAME, TEXTS) VALUES (2, 'Jenny', 'OMG')
27
27
  SQL
28
28
  end
29
- context "when puts mode is false the client" do
30
- setup do
31
- end
29
+ context "the client" do
32
30
  should "be able to run a simple query with a single result" do
33
- assert_equal 2, @client.run("select count(*) from OCI8_SIMPLE_TEST")
31
+ assert_equal [[2]], @client.run("select count(*) from OCI8_SIMPLE_TEST")
34
32
  end
35
33
  should "be able to run a simple query with multiple results and multiple columns" do
36
34
  assert_equal [["1", "Johnny", "OMG"], ["2", "Jenny", "OMG"]], @client.run("select * from OCI8_SIMPLE_TEST")
37
35
  end
38
36
 
39
37
  should "have logged something" do
40
- File.unlink(Oci8Simple::LOG_FILE)
41
- assert(!File.exists?(Oci8Simple::LOG_FILE))
42
- @client = Oci8Simple.new("test", nil, false)
38
+ File.unlink(Oci8Simple::Client::LOG_FILE)
39
+ assert(!File.exists?(Oci8Simple::Client::LOG_FILE))
40
+ @client = Oci8Simple::Client.new("test")
43
41
  @client.run "select NULL from dual"
44
42
  @client.log_file.close
45
- assert(File.exists?(Oci8Simple::LOG_FILE))
46
- assert(!(0 == File.size(Oci8Simple::LOG_FILE)))
47
- end
48
- end
49
- context "when puts mode is true the client" do
50
- setup do
51
- @client.puts_mode = true
52
- end
53
- should "format result" do
54
- result = @client.run("select * from OCI8_SIMPLE_TEST")
55
- assert_equal "1, Johnny, OMG\n2, Jenny, OMG", result
43
+ assert(File.exists?(Oci8Simple::Client::LOG_FILE))
44
+ assert(!(0 == File.size(Oci8Simple::Client::LOG_FILE)))
56
45
  end
57
46
  end
58
47
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oci8_simple
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Billy Reisinger
@@ -116,9 +116,12 @@ files:
116
116
  - Rakefile
117
117
  - VERSION
118
118
  - lib/oci8_simple.rb
119
+ - lib/oci8_simple/cli.rb
120
+ - lib/oci8_simple/client.rb
119
121
  - oci8_simple.gemspec
122
+ - test/cli_test.rb
123
+ - test/client_test.rb
120
124
  - test/helper.rb
121
- - test/test_oci8_simple.rb
122
125
  has_rdoc: true
123
126
  homepage: http://github.com/unclebilly/oci8_simple
124
127
  licenses:
@@ -154,5 +157,6 @@ signing_key:
154
157
  specification_version: 3
155
158
  summary: Run single statements against an arbitrary Oracle schema.
156
159
  test_files:
160
+ - test/cli_test.rb
161
+ - test/client_test.rb
157
162
  - test/helper.rb
158
- - test/test_oci8_simple.rb