diametric 0.0.4 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +21 -18
  3. data/Jarfile +15 -1
  4. data/README.md +22 -14
  5. data/Rakefile +17 -1
  6. data/bin/datomic-rest +33 -0
  7. data/bin/download-datomic +13 -0
  8. data/datomic_version.yml +4 -0
  9. data/diametric.gemspec +9 -6
  10. data/ext/diametric/DiametricCollection.java +147 -0
  11. data/ext/diametric/DiametricConnection.java +113 -0
  12. data/ext/diametric/DiametricDatabase.java +107 -0
  13. data/ext/diametric/DiametricEntity.java +90 -0
  14. data/ext/diametric/DiametricListenableFuture.java +47 -0
  15. data/ext/diametric/DiametricObject.java +66 -0
  16. data/ext/diametric/DiametricPeer.java +414 -0
  17. data/ext/diametric/DiametricService.java +102 -0
  18. data/ext/diametric/DiametricUUID.java +61 -0
  19. data/ext/diametric/DiametricUtils.java +183 -0
  20. data/lib/boolean_type.rb +3 -0
  21. data/lib/diametric.rb +24 -0
  22. data/lib/diametric/entity.rb +219 -14
  23. data/lib/diametric/generators/active_model.rb +2 -2
  24. data/lib/diametric/persistence.rb +0 -1
  25. data/lib/diametric/persistence/common.rb +28 -9
  26. data/lib/diametric/persistence/peer.rb +122 -87
  27. data/lib/diametric/persistence/rest.rb +4 -3
  28. data/lib/diametric/query.rb +94 -23
  29. data/lib/diametric/rest_service.rb +74 -0
  30. data/lib/diametric/service_base.rb +77 -0
  31. data/lib/diametric/transactor.rb +86 -0
  32. data/lib/diametric/version.rb +1 -1
  33. data/lib/diametric_service.jar +0 -0
  34. data/lib/value_enums.rb +8 -0
  35. data/spec/conf_helper.rb +55 -0
  36. data/spec/config/free-transactor-template.properties +73 -0
  37. data/spec/config/logback.xml +59 -0
  38. data/spec/data/seattle-data0.dtm +452 -0
  39. data/spec/data/seattle-data1.dtm +326 -0
  40. data/spec/developer_create_sample.rb +39 -0
  41. data/spec/developer_query_spec.rb +120 -0
  42. data/spec/diametric/config_spec.rb +1 -1
  43. data/spec/diametric/entity_spec.rb +263 -0
  44. data/spec/diametric/peer_api_spec.rb +147 -0
  45. data/spec/diametric/persistence/peer_many2many_spec.rb +76 -0
  46. data/spec/diametric/persistence/peer_spec.rb +13 -22
  47. data/spec/diametric/persistence/rest_spec.rb +12 -19
  48. data/spec/diametric/query_spec.rb +4 -5
  49. data/spec/diametric/rest_service_spec.rb +56 -0
  50. data/spec/diametric/transactor_spec.rb +68 -0
  51. data/spec/integration_spec.rb +5 -3
  52. data/spec/parent_child_sample.rb +42 -0
  53. data/spec/peer_integration_spec.rb +106 -22
  54. data/spec/peer_seattle_spec.rb +200 -0
  55. data/spec/rc2013_seattle_big.rb +82 -0
  56. data/spec/rc2013_seattle_small.rb +60 -0
  57. data/spec/rc2013_simple_sample.rb +72 -0
  58. data/spec/seattle_integration_spec.rb +106 -0
  59. data/spec/simple_validation_sample.rb +31 -0
  60. data/spec/spec_helper.rb +31 -45
  61. data/spec/support/entities.rb +157 -0
  62. data/spec/support/gen_entity_class.rb +2 -0
  63. data/spec/support/persistence_examples.rb +9 -5
  64. data/spec/test_version_file.yml +4 -0
  65. metadata +131 -75
  66. data/Jarfile.lock +0 -134
  67. data/lib/jrclj.rb +0 -63
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ N2Y1ODQ4NGMzNjA0ZjY3ODIzNDk2NjIwMGUxNDA4YjViYjM2ZmE5Mg==
5
+ data.tar.gz: !binary |-
6
+ NTA1YWRhN2YwM2M0Y2RhOGJlN2NmMGNlMTZmY2E4NWQwZjE2OTc2Nw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YjA4N2I5ZWNkMWZiZTE4NDlkODRmMTYwMjM2ZGNlYjEzNzVlZTY5ZWMzYWM0
10
+ MjcyZWZjMGYyNWNjMzZjMTNiYTRmODI0ZGJiMjlhMDIyMmEyMWM0M2RiYjhl
11
+ MjA1NzdiYTdjMDExYmZhYmZlNzlkMWI4YjQ1NWEwODIxYzQzZDc=
12
+ data.tar.gz: !binary |-
13
+ N2U0NzQ0NjM2YWRkMjU2NTM4ODM2Njc3NWY0NzVlOTVlMDMzYWVmNmI4MTI5
14
+ ZGUzNDFmZjQ3ZGFhNWZmMzIzMWJiNjNlMWI1MmUxNzJhZjgxOTAwODFkNTQ1
15
+ YzBiZTJlYTcxOTU2MmY5MTVkZWU1N2YzYWFmMTY1MDU3OWQwN2U=
data/Gemfile CHANGED
@@ -1,25 +1,28 @@
1
+ # -*- ruby -*-
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
- # Specify your gem's dependencies in diametric.gemspec
4
- gemspec
5
+ gem 'edn', '~> 1.0.2'
6
+ gem 'activesupport', '~> 3.2.14'
7
+ gem 'activemodel', '~> 3.2.14'
8
+ gem 'datomic-client', '~> 0.4.1'
9
+ gem 'rubyzip', '~> 0.9.9'
5
10
 
6
- # Development-only dependencies
7
- gem 'rake'
8
- gem 'rspec'
9
- gem 'pry'
11
+ gem 'lock_jar', '~> 0.7.5', :platform => :jruby
12
+ gem 'jruby-openssl', '~> 0.8.8', :platform => :jruby
13
+ gem 'uuid', '~> 2.3.7'
10
14
 
11
- gem 'guard'
12
- gem 'guard-rspec'
13
- gem 'rb-inotify', :require => false
14
- gem 'rb-fsevent', :require => false
15
- gem 'rb-fchange', :require => false
15
+ gem 'rspec', '~> 2.14.1'
16
+ gem 'pry', '~> 0.9.12.2'
16
17
 
17
- platform :mri do
18
- gem 'yard', :group => :development
19
- gem 'redcarpet', :group => :development
18
+ group :test, :development do
19
+ gem 'rake-compiler', '~> 0.9.1', :platform => :jruby
20
+ gem 'guard', '~> 1.8.2'
21
+ gem 'guard-rspec', '~> 3.0.2'
22
+ gem 'rb-inotify', :platform => :mri
23
+ gem 'rb-fsevent', :platform => :mri
24
+ gem 'rb-fchange', :platform => :mri
25
+ gem 'yard', :platform => :mri
26
+ gem 'redcarpet', :platform => :mri
20
27
  end
21
28
 
22
- platform :jruby do
23
- gem 'jruby-openssl'
24
- gem 'lock_jar'
25
- end
data/Jarfile CHANGED
@@ -1,6 +1,20 @@
1
1
  repository 'http://clojars.org/repo/'
2
2
  repository 'https://repository.jboss.org/nexus/content/groups/public/'
3
+ repository 'http://files.couchbase.com/maven2/'
4
+
5
+ datomic_names = File.read(File.join(File.dirname(__FILE__), "datomic_version.yml"))
6
+ require 'yaml'
7
+ datomic_versions = YAML.load(datomic_names)
8
+
9
+ if ENV['DIAMETRIC_ENV'] && (ENV['DIAMETRIC_ENV'] == "pro")
10
+ datomic_version = datomic_versions["pro"]
11
+ else
12
+ datomic_version = datomic_versions["free"]
13
+ end
14
+ version = /(\d|\.)+/.match(datomic_version)[0]
15
+ datomic_version.slice!(version)
16
+ artifactId = datomic_version.chop
3
17
 
4
18
  group :default, :runtime do
5
- jar "com.datomic:datomic-free:0.8.3664"
19
+ jar "com.datomic:#{artifactId}:#{version}"
6
20
  end
data/README.md CHANGED
@@ -20,6 +20,7 @@ Other than highlights below, there are documents on Wiki.
20
20
 
21
21
  - [Getting Started](https://github.com/relevance/diametric/wiki/Getting-Started)
22
22
  - [Rails Integration](https://github.com/relevance/diametric/wiki/Rails-Integration-%28Experimental%29)
23
+ - [Seattle Example](https://github.com/relevance/diametric/wiki/Seattle-Example)
23
24
 
24
25
 
25
26
  ## Entity API
@@ -46,11 +47,12 @@ class Person
46
47
  attribute :email, String, :cardinality => :many
47
48
  attribute :birthday, DateTime
48
49
  attribute :iq, Integer
49
- attribute :website, URI
50
50
  end
51
51
 
52
+ # To see what schema data will be produced:
52
53
  Person.schema
53
- # Datomic transaction:
54
+
55
+ # The schema will be mapped to Datomic transaction data below:
54
56
  # [{:db/id #db/id[:db.part/db]
55
57
  # :db/ident :person/name
56
58
  # :db/valueType :db.type/string
@@ -71,33 +73,38 @@ Person.schema
71
73
  # :db/ident :person/iq
72
74
  # :db/valueType :db.type/long
73
75
  # :db/cardinality :db.cardinality/one
74
- # :db.install/_attribute :db.part/db}
75
- # {:db/id #db/id[:db.part/db]
76
- # :db/ident :person/website
77
- # :db/valueType :db.type/uri
78
- # :db/cardinality :db.cardinality/one
79
76
  # :db.install/_attribute :db.part/db}]
80
77
 
81
- Person.attributes
82
- # [:dbid, :name, :email, :birthday, :iq, :website]
78
+ # To check what attributes are in Person model:
79
+ Person.attributes.keys
80
+ # [:dbid, :name, :email, :birthday, :iq]
83
81
 
82
+ # To create an instance from a query result
84
83
  person = Person.new(Hash[*(Person.attributes.zip(results_from_query).flatten)])
85
84
  # or
86
85
  person = Person.from_query(results_from_query)
87
86
 
87
+ # To update/set values of a model:
88
88
  person.iq = 180
89
+
90
+ # Below will help to understand what transaction data will be produced:
89
91
  person.tx_data(:iq)
90
- # Datomic transaction:
92
+
93
+ # It will be mapped to the Datomic transaction data:
91
94
  # [{:db/id person.dbid
92
95
  # :person/iq 180}]
93
96
 
97
+ # To create new model instance:
94
98
  person = Person.new(:name => "Peanut")
95
99
  person.tx_data
96
- # Datomic transaction:
100
+ # Datomic transaction data will be:
97
101
  # [{:db/id #db/id[:db.part/user]
98
102
  # :person/name "Peanut"}]
99
103
  ```
100
104
 
105
+ In addition to `attribute`, Diametric supports `enum` type. This is often used on Datomic.
106
+ For details, see [Seattle Example](https://github.com/relevance/diametric/wiki/Seattle-Example)
107
+
101
108
  ## Query API
102
109
 
103
110
  The query API is used for generating Datomic queries, whether to send via an external client or via the persistence API. The two methods used to generate a query are `.where` and `.filter`, both of which are chainable.
@@ -141,8 +148,9 @@ query.data
141
148
 
142
149
  ## Persistence API
143
150
 
144
- The persistence API comes in two flavors: REST- and peer-based.
145
- For the most part, they have the same API.
151
+ The persistence API comes in two flavors: REST- and Peer-based.
152
+ Although REST-bases API supports CRUD operations like a legacy RDBMS,
153
+ it is a subset of Peer-based API.
146
154
 
147
155
  The suitable persistent module will be selected based on URI to connect datomic.
148
156
  You don't need to care which module should be included.
@@ -151,7 +159,7 @@ However, if you like to inlcude REST or Peer module explicitely, you can write i
151
159
 
152
160
  ### Peer
153
161
 
154
- With Peer connection, you can create objects that know how to store themselves to Datomic through a Datomic peer.
162
+ With Peer connection, you can create objects that know how to store themselves to Datomic through a Datomic Peer.
155
163
 
156
164
  Peer connection as well as "require `diametric/persistence/peer`" are only available on JRuby.
157
165
  When you install the `diametric` gem with JRuby, all `.jar` files needed to run Datomic will be downloaded.
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  begin
2
- require "bundler/gem_tasks"
2
+ require 'rake'
3
3
  require 'rspec/core/rake_task'
4
4
  rescue LoadError
5
5
  end
@@ -31,3 +31,19 @@ desc "Run all RSpec tests"
31
31
  require 'rspec'
32
32
  require 'rspec/core/rake_task'
33
33
  RSpec::Core::RakeTask.new(:spec)
34
+
35
+
36
+ # setting for rake compiler
37
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
38
+ require 'lock_jar'
39
+ LockJar.lock
40
+ locked_jars = LockJar.load
41
+
42
+ require 'rake/javaextensiontask'
43
+ Rake::JavaExtensionTask.new('diametric') do |ext|
44
+ jruby_home = ENV['MY_RUBY_HOME'] # this is available of rvm
45
+ jars = ["#{jruby_home}/lib/jruby.jar"] + FileList['lib/*.jar'] + locked_jars
46
+ ext.classpath = jars.map {|x| File.expand_path x}.join ':'
47
+ ext.name = 'diametric_service'
48
+ end
49
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ require 'optparse'
3
+
4
+ options = {}
5
+
6
+ opts = OptionParser.new do |opts|
7
+ opts.define_head "Usage: datomic-rest -p port -a db_alias -u uri"
8
+ opts.separator ""
9
+ opts.separator "Example:"
10
+ opts.separator " datomc-rest -p 9000 -a free -u datomic:mem://"
11
+
12
+ opts.on("-p", "--port [port]", Integer, "Port number") do |v|
13
+ options[:port] = v
14
+ end
15
+
16
+ opts.on("-a", "--alias [alias]", String, "Alias name") do |v|
17
+ options[:db_alias] = v
18
+ end
19
+
20
+ opts.on("-u", "--uri [uri]", String, "URI") do |v|
21
+ options[:uri] = v
22
+ end
23
+ end
24
+ opts.parse!
25
+
26
+ DATOMIC_NAME = File.read(File.join(File.dirname(__FILE__), "..", "datomic_version.cnf"))
27
+
28
+ require 'diametric/rest_service'
29
+
30
+ service = Diametric::RestService.new
31
+ PID = service.start(options)
32
+
33
+ puts "Datomic REST service is running (PID = #{PID})" unless PID.nil?
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ DATOMIC_NAME = File.read(File.join(File.dirname(__FILE__), "..", "datomic_version.cnf"))
4
+
5
+ require 'diametric/rest_service'
6
+
7
+ if Diametric::RestService.downloaded?
8
+ puts "Datomic #{DATOMIC_NAME} is already present in vendor/datomic"
9
+ else
10
+ puts "Now, downloading..."
11
+ Diametric::RestService.download
12
+ puts "Done. #{DATOMIC_NAME} has been downloaded in vendor/datomic"
13
+ end
@@ -0,0 +1,4 @@
1
+ free:
2
+ datomic-free-0.8.4122
3
+ pro:
4
+ datomic-pro-0.8.4122
@@ -1,3 +1,4 @@
1
+ # -*- ruby -*-
1
2
  # -*- encoding: utf-8 -*-
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
@@ -16,17 +17,19 @@ as entities into a Datomic database.
16
17
  EOF
17
18
  gem.homepage = "https://github.com/relevance/diametric"
18
19
 
19
- gem.files = %w(Gemfile Jarfile Jarfile.lock LICENSE.txt README.md Rakefile diametric.gemspec) + Dir.glob('lib/**/*')
20
+ gem.files = %w(Gemfile Jarfile LICENSE.txt README.md Rakefile datomic_version.yml diametric.gemspec) + Dir.glob('lib/**/*') + Dir.glob('ext/**/*') + Dir.glob('spec/**/*')
20
21
  gem.executables = []
21
22
  gem.test_files = Dir.glob("spec/**/*.rb")
22
23
  gem.require_paths = ["lib"]
24
+ gem.executables = ["datomic-rest", "download-datomic"]
23
25
 
24
- gem.add_dependency 'edn', '~> 1.0'
25
- gem.add_dependency 'activesupport', '>= 3.0.0'
26
- gem.add_dependency 'activemodel', '>= 3.0.0'
26
+ gem.add_dependency 'edn', '~> 1.0.2'
27
+ gem.add_dependency 'activesupport', '~> 3.2.14'
28
+ gem.add_dependency 'activemodel', '~> 3.2.14'
27
29
  gem.add_dependency 'datomic-client', '~> 0.4.1'
28
- gem.add_dependency 'rspec', '~> 2.12.0'
29
- gem.add_dependency 'lock_jar', '= 0.7.2' if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
30
+ gem.add_dependency 'rubyzip', '~> 0.9.9'
31
+ gem.add_dependency 'uuid', '~> 2.3.7'
32
+ gem.add_dependency 'rspec', '~> 2.14.1'
30
33
 
31
34
  gem.extensions = ['Rakefile']
32
35
  end
@@ -0,0 +1,147 @@
1
+ package diametric;
2
+
3
+ import java.util.Collection;
4
+ import java.util.Iterator;
5
+
6
+ import org.jruby.Ruby;
7
+ import org.jruby.RubyClass;
8
+ import org.jruby.RubyObject;
9
+ import org.jruby.anno.JRubyClass;
10
+ import org.jruby.anno.JRubyMethod;
11
+ import org.jruby.javasupport.JavaUtil;
12
+ import org.jruby.runtime.Block;
13
+ import org.jruby.runtime.ThreadContext;
14
+ import org.jruby.runtime.builtin.IRubyObject;
15
+
16
+ @JRubyClass(name = "Diametric::Persistence::Collection")
17
+ public class DiametricCollection extends RubyObject {
18
+ // should be a Ruby's Enumerable
19
+ private static final long serialVersionUID = 7656855654760249694L;
20
+ private Collection query_result = null;
21
+
22
+ public DiametricCollection(Ruby runtime, RubyClass klazz) {
23
+ super(runtime, klazz);
24
+ }
25
+
26
+ void init(Object result) {
27
+ if (result instanceof Collection) {
28
+ this.query_result = (Collection)result;
29
+ } else {
30
+ throw new RuntimeException("Wrong type of query result");
31
+ }
32
+ }
33
+
34
+ Object toJava() {
35
+ return query_result;
36
+ }
37
+
38
+ @JRubyMethod
39
+ public IRubyObject to_java(ThreadContext context) {
40
+ return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), query_result);
41
+ }
42
+
43
+ @JRubyMethod(name="==", required=1)
44
+ public IRubyObject op_equal(ThreadContext context, IRubyObject arg) {
45
+ Ruby runtime = context.getRuntime();
46
+ if (arg instanceof DiametricCollection) {
47
+ DiametricCollection other = (DiametricCollection)arg;
48
+ if (query_result.toString().equals(other.toJava().toString())) {
49
+ return runtime.getTrue();
50
+ } else {
51
+ return runtime.getFalse();
52
+ }
53
+ } else {
54
+ return runtime.getFalse();
55
+ }
56
+ }
57
+
58
+ @JRubyMethod
59
+ public IRubyObject to_s(ThreadContext context) {
60
+ return context.getRuntime().newString(query_result.toString());
61
+ }
62
+
63
+ @JRubyMethod(name = "all?")
64
+ public static IRubyObject all_p(ThreadContext context, IRubyObject self, final Block block) {
65
+ return context.getRuntime().getNil();
66
+ }
67
+
68
+ @JRubyMethod(name = "any?")
69
+ public static IRubyObject any_p(ThreadContext context, IRubyObject self, final Block block) {
70
+ return context.getRuntime().getNil();
71
+ }
72
+
73
+ @JRubyMethod
74
+ public static IRubyObject chunk(ThreadContext context, IRubyObject self, final Block block) {
75
+ return context.getRuntime().getNil();
76
+ }
77
+
78
+ @JRubyMethod
79
+ public static IRubyObject chunk(ThreadContext context, IRubyObject self, final IRubyObject initialState, final Block block) {
80
+ return context.getRuntime().getNil();
81
+ }
82
+
83
+ @JRubyMethod
84
+ public static IRubyObject collect(ThreadContext context, IRubyObject self, final Block block) {
85
+ return context.getRuntime().getNil();
86
+ }
87
+
88
+ @JRubyMethod
89
+ public static IRubyObject collect_concat(ThreadContext context, IRubyObject self, final Block block) {
90
+ return context.getRuntime().getNil();
91
+ }
92
+
93
+ @JRubyMethod
94
+ public static IRubyObject count(ThreadContext context, IRubyObject self, final Block block) {
95
+ return context.getRuntime().getNil();
96
+ }
97
+
98
+ @JRubyMethod
99
+ public static IRubyObject count(ThreadContext context, IRubyObject self, final IRubyObject methodArg, final Block block) {
100
+ return context.getRuntime().getNil();
101
+ }
102
+
103
+ @JRubyMethod
104
+ public static IRubyObject cycle(ThreadContext context, IRubyObject self, final Block block) {
105
+ return context.getRuntime().getNil();
106
+ }
107
+
108
+ @JRubyMethod
109
+ public static IRubyObject cycle(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) {
110
+ return context.getRuntime().getNil();
111
+ }
112
+
113
+ @JRubyMethod
114
+ public static IRubyObject detect(ThreadContext context, IRubyObject self, final Block block) {
115
+ return context.getRuntime().getNil();
116
+ }
117
+
118
+ @JRubyMethod
119
+ public static IRubyObject detect(ThreadContext context, IRubyObject self, IRubyObject ifnone, final Block block) {
120
+ return context.getRuntime().getNil();
121
+ }
122
+
123
+ @JRubyMethod
124
+ public static IRubyObject drop(ThreadContext context, IRubyObject self, IRubyObject n, final Block block) {
125
+ return context.getRuntime().getNil();
126
+ }
127
+
128
+ @JRubyMethod
129
+ public static IRubyObject drop_while(ThreadContext context, IRubyObject self, final Block block) {
130
+ return context.getRuntime().getNil();
131
+ }
132
+
133
+ @JRubyMethod
134
+ public static IRubyObject each_cons(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) {
135
+ return context.getRuntime().getNil();
136
+ }
137
+
138
+ @JRubyMethod(rest = true)
139
+ public static IRubyObject each_entry(ThreadContext context, final IRubyObject self, final IRubyObject[] args, final Block block) {
140
+ return context.getRuntime().getNil();
141
+ }
142
+
143
+ @JRubyMethod
144
+ public static IRubyObject each_slice(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) {
145
+ return context.getRuntime().getNil();
146
+ }
147
+ }
@@ -0,0 +1,113 @@
1
+ package diametric;
2
+
3
+ import java.util.Date;
4
+ import java.util.List;
5
+
6
+ import org.jruby.Ruby;
7
+ import org.jruby.RubyClass;
8
+ import org.jruby.RubyObject;
9
+ import org.jruby.RubyTime;
10
+ import org.jruby.anno.JRubyClass;
11
+ import org.jruby.anno.JRubyMethod;
12
+ import org.jruby.javasupport.JavaUtil;
13
+ import org.jruby.javasupport.util.RuntimeHelpers;
14
+ import org.jruby.runtime.ThreadContext;
15
+ import org.jruby.runtime.builtin.IRubyObject;
16
+
17
+ @JRubyClass(name = "Diametric::Persistence::Connection")
18
+ public class DiametricConnection extends RubyObject {
19
+ private static final long serialVersionUID = 3806301567154638371L;
20
+ //conn should a datomic.Connection type
21
+ private Object conn = null;
22
+
23
+ public DiametricConnection(Ruby runtime, RubyClass klazz) {
24
+ super(runtime, klazz);
25
+ }
26
+
27
+ void init(Object conn) {
28
+ this.conn = conn;
29
+ }
30
+
31
+ Object toJava() {
32
+ return conn;
33
+ }
34
+
35
+ @JRubyMethod
36
+ public IRubyObject to_java(ThreadContext context) {
37
+ return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), conn);
38
+ }
39
+
40
+ @JRubyMethod
41
+ public IRubyObject db(ThreadContext context) {
42
+ try {
43
+ Object database = clojure.lang.RT.var("datomic.api", "db").invoke(conn);
44
+ RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
45
+ DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
46
+ diametric_database.init(database);
47
+ return diametric_database;
48
+ } catch (Throwable t) {
49
+ throw context.getRuntime().newRuntimeError(t.getMessage());
50
+ }
51
+ }
52
+
53
+ @JRubyMethod
54
+ public IRubyObject transact(ThreadContext context, IRubyObject arg) {
55
+ List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg);
56
+ if (tx_data == null) {
57
+ throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
58
+ }
59
+
60
+ try {
61
+ Object future = clojure.lang.RT.var("datomic.api", "transact").invoke(conn, tx_data);
62
+ RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::ListenableFuture");
63
+ DiametricListenableFuture diametric_listenable = (DiametricListenableFuture)clazz.allocate();
64
+ diametric_listenable.init(future);
65
+ return diametric_listenable;
66
+ } catch (Throwable t) {
67
+ throw context.getRuntime().newRuntimeError(t.getMessage());
68
+ }
69
+ }
70
+
71
+ @JRubyMethod
72
+ public IRubyObject transact_async(ThreadContext context, IRubyObject arg) {
73
+ List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg);
74
+ if (tx_data == null) {
75
+ throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
76
+ }
77
+
78
+ try {
79
+ Object future = clojure.lang.RT.var("datomic.api", "transact-async").invoke(conn, tx_data);
80
+ RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::ListenableFuture");
81
+ DiametricListenableFuture diametric_listenable = (DiametricListenableFuture)clazz.allocate();
82
+ diametric_listenable.init(future);
83
+ return diametric_listenable;
84
+ } catch (Throwable t) {
85
+ throw context.getRuntime().newRuntimeError(t.getMessage());
86
+ }
87
+ }
88
+
89
+ @JRubyMethod
90
+ public IRubyObject gc_storage(ThreadContext context, IRubyObject arg) {
91
+ if (!(arg.respondsTo("to_time"))) {
92
+ throw context.getRuntime().newArgumentError("Wrong argument type");
93
+ }
94
+ RubyTime rubyTime = (RubyTime) RuntimeHelpers.invoke(context, arg, "to_time");
95
+ Date olderThan = rubyTime.getJavaDate();
96
+ try {
97
+ clojure.lang.RT.var("datomic.api", "gc-strage").invoke(conn, olderThan);
98
+ } catch (Throwable t) {
99
+ throw context.getRuntime().newRuntimeError("Datomic error: " + t.getMessage());
100
+ }
101
+ return context.getRuntime().getNil();
102
+ }
103
+
104
+ @JRubyMethod
105
+ public IRubyObject release(ThreadContext context) {
106
+ try {
107
+ clojure.lang.RT.var("datomic.api", "release").invoke(conn);
108
+ } catch (Throwable t) {
109
+ throw context.getRuntime().newRuntimeError(t.getMessage());
110
+ }
111
+ return context.getRuntime().getNil();
112
+ }
113
+ }