diametric 0.1.1-java
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.
- checksums.yaml +7 -0
- data/Gemfile +28 -0
- data/Jarfile +20 -0
- data/LICENSE.txt +22 -0
- data/README.md +264 -0
- data/Rakefile +49 -0
- data/bin/datomic-rest +33 -0
- data/bin/download-datomic +13 -0
- data/datomic_version.yml +4 -0
- data/diametric-java.gemspec +39 -0
- data/ext/diametric/DiametricCollection.java +147 -0
- data/ext/diametric/DiametricConnection.java +113 -0
- data/ext/diametric/DiametricDatabase.java +107 -0
- data/ext/diametric/DiametricEntity.java +90 -0
- data/ext/diametric/DiametricListenableFuture.java +47 -0
- data/ext/diametric/DiametricObject.java +66 -0
- data/ext/diametric/DiametricPeer.java +414 -0
- data/ext/diametric/DiametricService.java +102 -0
- data/ext/diametric/DiametricUUID.java +61 -0
- data/ext/diametric/DiametricUtils.java +183 -0
- data/lib/boolean_type.rb +3 -0
- data/lib/diametric.rb +42 -0
- data/lib/diametric/config.rb +54 -0
- data/lib/diametric/config/environment.rb +42 -0
- data/lib/diametric/entity.rb +659 -0
- data/lib/diametric/errors.rb +13 -0
- data/lib/diametric/generators/active_model.rb +42 -0
- data/lib/diametric/persistence.rb +48 -0
- data/lib/diametric/persistence/common.rb +82 -0
- data/lib/diametric/persistence/peer.rb +154 -0
- data/lib/diametric/persistence/rest.rb +107 -0
- data/lib/diametric/query.rb +259 -0
- data/lib/diametric/railtie.rb +52 -0
- data/lib/diametric/rest_service.rb +74 -0
- data/lib/diametric/service_base.rb +77 -0
- data/lib/diametric/transactor.rb +86 -0
- data/lib/diametric/version.rb +3 -0
- data/lib/diametric_service.jar +0 -0
- data/lib/tasks/create_schema.rb +27 -0
- data/lib/tasks/diametric_config.rb +45 -0
- data/lib/value_enums.rb +8 -0
- data/spec/conf_helper.rb +55 -0
- data/spec/config/free-transactor-template.properties +73 -0
- data/spec/config/logback.xml +59 -0
- data/spec/data/seattle-data0.dtm +452 -0
- data/spec/data/seattle-data1.dtm +326 -0
- data/spec/developer_create_sample.rb +39 -0
- data/spec/developer_query_spec.rb +120 -0
- data/spec/diametric/config_spec.rb +60 -0
- data/spec/diametric/entity_spec.rb +476 -0
- data/spec/diametric/peer_api_spec.rb +147 -0
- data/spec/diametric/persistence/peer_many2many_spec.rb +76 -0
- data/spec/diametric/persistence/peer_spec.rb +27 -0
- data/spec/diametric/persistence/rest_spec.rb +30 -0
- data/spec/diametric/persistence_spec.rb +59 -0
- data/spec/diametric/query_spec.rb +118 -0
- data/spec/diametric/rest_service_spec.rb +56 -0
- data/spec/diametric/transactor_spec.rb +68 -0
- data/spec/integration_spec.rb +107 -0
- data/spec/parent_child_sample.rb +42 -0
- data/spec/peer_integration_spec.rb +121 -0
- data/spec/peer_seattle_spec.rb +200 -0
- data/spec/rc2013_seattle_big.rb +82 -0
- data/spec/rc2013_seattle_small.rb +60 -0
- data/spec/rc2013_simple_sample.rb +72 -0
- data/spec/seattle_integration_spec.rb +106 -0
- data/spec/simple_validation_sample.rb +31 -0
- data/spec/spec_helper.rb +63 -0
- data/spec/support/entities.rb +157 -0
- data/spec/support/gen_entity_class.rb +9 -0
- data/spec/support/persistence_examples.rb +104 -0
- data/spec/test_version_file.yml +4 -0
- metadata +290 -0
@@ -0,0 +1,102 @@
|
|
1
|
+
package diametric;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
|
5
|
+
import org.jruby.Ruby;
|
6
|
+
import org.jruby.RubyClass;
|
7
|
+
import org.jruby.RubyModule;
|
8
|
+
import org.jruby.runtime.ObjectAllocator;
|
9
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
10
|
+
import org.jruby.runtime.load.BasicLibraryService;
|
11
|
+
|
12
|
+
public class DiametricService implements BasicLibraryService {
|
13
|
+
|
14
|
+
@Override
|
15
|
+
public boolean basicLoad(Ruby runtime) throws IOException {
|
16
|
+
RubyModule diametric = runtime.defineModule("Diametric");
|
17
|
+
RubyModule persistence = diametric.defineModuleUnder("Persistence");
|
18
|
+
|
19
|
+
RubyModule diametric_peer = persistence.defineModuleUnder("Peer");
|
20
|
+
diametric_peer.defineAnnotatedMethods(DiametricPeer.class);
|
21
|
+
|
22
|
+
RubyClass connection = persistence.defineClassUnder("Connection", runtime.getObject(), CONNECTION_ALLOCATOR);
|
23
|
+
connection.defineAnnotatedMethods(DiametricConnection.class);
|
24
|
+
|
25
|
+
RubyClass uuid = persistence.defineClassUnder("UUID", runtime.getObject(), UUID_ALLOCATOR);
|
26
|
+
uuid.defineAnnotatedMethods(DiametricUUID.class);
|
27
|
+
|
28
|
+
RubyClass diametric_object = persistence.defineClassUnder("Object", runtime.getObject(), DIAMETRIC_OBJECT_ALLOCATOR);
|
29
|
+
diametric_object.defineAnnotatedMethods(DiametricObject.class);
|
30
|
+
|
31
|
+
RubyClass diametric_query_result = persistence.defineClassUnder("Collection", runtime.getObject(), COLLECTION_ALLOCATOR);
|
32
|
+
diametric_query_result.defineAnnotatedMethods(DiametricCollection.class);
|
33
|
+
|
34
|
+
RubyClass diametric_listenable = persistence.defineClassUnder("ListenableFuture", runtime.getObject(), LISTENABLE_ALLOCATOR);
|
35
|
+
diametric_listenable.defineAnnotatedMethods(DiametricListenableFuture.class);
|
36
|
+
|
37
|
+
RubyClass diametric_database = persistence.defineClassUnder("Database", runtime.getObject(), DATABASE_ALLOCATOR);
|
38
|
+
diametric_database.defineAnnotatedMethods(DiametricDatabase.class);
|
39
|
+
|
40
|
+
RubyClass diametric_entity = persistence.defineClassUnder("Entity", runtime.getObject(), ENTITY_ALLOCATOR);
|
41
|
+
diametric_entity.defineAnnotatedMethods(DiametricEntity.class);
|
42
|
+
|
43
|
+
RubyModule diametric_utils = persistence.defineModuleUnder("Utils");
|
44
|
+
diametric_utils.defineAnnotatedMethods(DiametricUtils.class);
|
45
|
+
|
46
|
+
setupClojureRT();
|
47
|
+
|
48
|
+
return false;
|
49
|
+
}
|
50
|
+
|
51
|
+
public static final ObjectAllocator CONNECTION_ALLOCATOR = new ObjectAllocator() {
|
52
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
53
|
+
return new DiametricConnection(runtime, klazz);
|
54
|
+
}
|
55
|
+
};
|
56
|
+
|
57
|
+
public static final ObjectAllocator UUID_ALLOCATOR = new ObjectAllocator() {
|
58
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
59
|
+
return new DiametricUUID(runtime, klazz);
|
60
|
+
}
|
61
|
+
};
|
62
|
+
|
63
|
+
public static final ObjectAllocator DIAMETRIC_OBJECT_ALLOCATOR = new ObjectAllocator() {
|
64
|
+
DiametricObject diametric_object = null;
|
65
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
66
|
+
if (diametric_object == null) diametric_object = new DiametricObject(runtime, klazz);
|
67
|
+
try {
|
68
|
+
return (DiametricObject) diametric_object.clone();
|
69
|
+
} catch (CloneNotSupportedException e) {
|
70
|
+
return new DiametricObject(runtime, klazz);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
};
|
74
|
+
|
75
|
+
public static final ObjectAllocator COLLECTION_ALLOCATOR = new ObjectAllocator() {
|
76
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
77
|
+
return new DiametricCollection(runtime, klazz);
|
78
|
+
}
|
79
|
+
};
|
80
|
+
|
81
|
+
public static final ObjectAllocator LISTENABLE_ALLOCATOR = new ObjectAllocator() {
|
82
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
83
|
+
return new DiametricListenableFuture(runtime, klazz);
|
84
|
+
}
|
85
|
+
};
|
86
|
+
|
87
|
+
public static final ObjectAllocator DATABASE_ALLOCATOR = new ObjectAllocator() {
|
88
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
89
|
+
return new DiametricDatabase(runtime, klazz);
|
90
|
+
}
|
91
|
+
};
|
92
|
+
|
93
|
+
public static final ObjectAllocator ENTITY_ALLOCATOR = new ObjectAllocator() {
|
94
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
95
|
+
return new DiametricEntity(runtime, klazz);
|
96
|
+
}
|
97
|
+
};
|
98
|
+
|
99
|
+
private void setupClojureRT() {
|
100
|
+
clojure.lang.RT.var("clojure.core", "require").invoke(clojure.lang.Symbol.intern("datomic.api"));
|
101
|
+
}
|
102
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
package diametric;
|
2
|
+
|
3
|
+
import java.util.UUID;
|
4
|
+
|
5
|
+
import org.jruby.Ruby;
|
6
|
+
import org.jruby.RubyClass;
|
7
|
+
import org.jruby.RubyObject;
|
8
|
+
import org.jruby.RubyString;
|
9
|
+
import org.jruby.anno.JRubyClass;
|
10
|
+
import org.jruby.anno.JRubyMethod;
|
11
|
+
import org.jruby.javasupport.JavaUtil;
|
12
|
+
import org.jruby.runtime.ThreadContext;
|
13
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
14
|
+
|
15
|
+
@JRubyClass(name = "Diametric::Persistence::UUID")
|
16
|
+
public class DiametricUUID extends RubyObject {
|
17
|
+
private static final long serialVersionUID = 2083281771243513904L;
|
18
|
+
private java.util.UUID java_uuid = null;
|
19
|
+
|
20
|
+
public DiametricUUID(Ruby runtime, RubyClass klazz) {
|
21
|
+
super(runtime, klazz);
|
22
|
+
}
|
23
|
+
|
24
|
+
void init(java.util.UUID java_uuid) {
|
25
|
+
this.java_uuid = java_uuid;
|
26
|
+
}
|
27
|
+
|
28
|
+
java.util.UUID getUUID() {
|
29
|
+
return java_uuid;
|
30
|
+
}
|
31
|
+
|
32
|
+
@JRubyMethod(name = "new", meta = true)
|
33
|
+
public static IRubyObject rbNew(ThreadContext context, IRubyObject klazz) {
|
34
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::UUID");
|
35
|
+
DiametricUUID diametric_uuid = (DiametricUUID)clazz.allocate();
|
36
|
+
try {
|
37
|
+
java.util.UUID java_uuid = (UUID) clojure.lang.RT.var("datomic.api", "squuid").invoke();
|
38
|
+
diametric_uuid.init(java_uuid);
|
39
|
+
return diametric_uuid;
|
40
|
+
} catch (Throwable t) {
|
41
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
@JRubyMethod
|
46
|
+
public IRubyObject to_java(ThreadContext context) {
|
47
|
+
return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), java_uuid);
|
48
|
+
}
|
49
|
+
|
50
|
+
@JRubyMethod
|
51
|
+
public IRubyObject to_s(ThreadContext context) {
|
52
|
+
if (java_uuid == null) return context.getRuntime().getNil();
|
53
|
+
return RubyString.newString(context.getRuntime(), java_uuid.toString());
|
54
|
+
}
|
55
|
+
|
56
|
+
@JRubyMethod
|
57
|
+
public IRubyObject generate(ThreadContext context, IRubyObject arg) {
|
58
|
+
if (java_uuid == null) return context.getRuntime().getNil();
|
59
|
+
return RubyString.newString(context.getRuntime(), java.util.UUID.randomUUID().toString());
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1,183 @@
|
|
1
|
+
package diametric;
|
2
|
+
|
3
|
+
import java.io.FileNotFoundException;
|
4
|
+
import java.io.FileReader;
|
5
|
+
import java.io.IOException;
|
6
|
+
import java.io.Reader;
|
7
|
+
import java.util.ArrayList;
|
8
|
+
import java.util.Collections;
|
9
|
+
import java.util.Date;
|
10
|
+
import java.util.HashMap;
|
11
|
+
import java.util.List;
|
12
|
+
import java.util.Map;
|
13
|
+
import java.util.UUID;
|
14
|
+
|
15
|
+
import org.jruby.Ruby;
|
16
|
+
import org.jruby.RubyArray;
|
17
|
+
import org.jruby.RubyBignum;
|
18
|
+
import org.jruby.RubyBoolean;
|
19
|
+
import org.jruby.RubyClass;
|
20
|
+
import org.jruby.RubyFixnum;
|
21
|
+
import org.jruby.RubyFloat;
|
22
|
+
import org.jruby.RubyHash;
|
23
|
+
import org.jruby.RubyNil;
|
24
|
+
import org.jruby.RubyString;
|
25
|
+
import org.jruby.RubyTime;
|
26
|
+
import org.jruby.anno.JRubyMethod;
|
27
|
+
import org.jruby.anno.JRubyModule;
|
28
|
+
import org.jruby.javasupport.JavaUtil;
|
29
|
+
import org.jruby.javasupport.util.RuntimeHelpers;
|
30
|
+
import org.jruby.runtime.ThreadContext;
|
31
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
32
|
+
|
33
|
+
import datomic.Util;
|
34
|
+
|
35
|
+
@JRubyModule(name="Diametric::Persistence::Utils")
|
36
|
+
public class DiametricUtils {
|
37
|
+
|
38
|
+
@JRubyMethod(meta=true)
|
39
|
+
public static IRubyObject read_all(ThreadContext context, IRubyObject klazz, IRubyObject arg) {
|
40
|
+
String filename = null;
|
41
|
+
if (arg instanceof RubyString) {
|
42
|
+
filename = DiametricUtils.rubyStringToJava(arg);
|
43
|
+
} else {
|
44
|
+
throw context.getRuntime().newArgumentError("Argument should be filename");
|
45
|
+
}
|
46
|
+
Reader reader = null;
|
47
|
+
try {
|
48
|
+
reader = new FileReader(filename);
|
49
|
+
List list = (List) Util.readAll(reader);
|
50
|
+
RubyArray array = RubyArray.newArray(context.getRuntime(), list.size());
|
51
|
+
array.addAll(list);
|
52
|
+
return array;
|
53
|
+
} catch (Exception e) {
|
54
|
+
throw context.getRuntime().newRuntimeError(e.getMessage());
|
55
|
+
} finally {
|
56
|
+
try {
|
57
|
+
if (reader != null) reader.close();
|
58
|
+
} catch (IOException e) {
|
59
|
+
// no-op
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
static String rubyStringToJava(IRubyObject arg) {
|
65
|
+
if (arg instanceof RubyString) {
|
66
|
+
// TODO probably, we need to specify encoding.
|
67
|
+
return (String) ((RubyString)arg).toJava(String.class);
|
68
|
+
} else {
|
69
|
+
return null;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
static Object convertRubyToJava(ThreadContext context, IRubyObject value) {
|
74
|
+
if (value instanceof RubyString) {
|
75
|
+
String str = (String)((RubyString)value).toJava(String.class);
|
76
|
+
try {
|
77
|
+
return (Object)UUID.fromString(str);
|
78
|
+
} catch (IllegalArgumentException e) {
|
79
|
+
return (Object)str;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
if (value instanceof RubyBoolean) return (Object)((RubyBoolean)value).toJava(Boolean.class);
|
83
|
+
if (value instanceof RubyFixnum) return (Object)((RubyFixnum)value).toJava(Long.class);
|
84
|
+
if (value instanceof DiametricUUID) return ((DiametricUUID)value).getUUID();
|
85
|
+
if (value instanceof RubyBignum) {
|
86
|
+
RubyString svalue = (RubyString)((RubyBignum)value).to_s();
|
87
|
+
java.math.BigInteger bivalue = new java.math.BigInteger((String)svalue.toJava(String.class));
|
88
|
+
return (Object)bivalue;
|
89
|
+
}
|
90
|
+
if (value instanceof RubyFloat) return (Object)((RubyFloat)value).toJava(Double.class);
|
91
|
+
if (value instanceof RubyTime) {
|
92
|
+
RubyTime tmvalue = (RubyTime)value;
|
93
|
+
return (Object)tmvalue.getJavaDate();
|
94
|
+
}
|
95
|
+
if (value.respondsTo("to_time")) {
|
96
|
+
// DateTime or Date
|
97
|
+
RubyTime tmvalue = (RubyTime)RuntimeHelpers.invoke(context, value, "to_time");
|
98
|
+
return (Object)tmvalue.getJavaDate();
|
99
|
+
}
|
100
|
+
//System.out.println("NOT YET CONVERTED");
|
101
|
+
//System.out.println("RESPONDSTO? TO_A:" + value.respondsTo("to_a"));
|
102
|
+
if (value.respondsTo("to_a")) { // might be Set for cardinality many type
|
103
|
+
RubyArray ruby_array = (RubyArray)RuntimeHelpers.invoke(context, value, "to_a");
|
104
|
+
List<Object> list = new ArrayList<Object>();
|
105
|
+
while (true) {
|
106
|
+
IRubyObject element = ruby_array.shift(context);
|
107
|
+
if (element.isNil()) break;
|
108
|
+
list.add(DiametricUtils.convertRubyToJava(context, element));
|
109
|
+
}
|
110
|
+
return Collections.unmodifiableList(list);
|
111
|
+
}
|
112
|
+
if (value instanceof DiametricObject) {
|
113
|
+
return ((DiametricObject)value).toJava();
|
114
|
+
}
|
115
|
+
return (Object)value.toJava(Object.class);
|
116
|
+
}
|
117
|
+
|
118
|
+
static IRubyObject convertJavaToRuby(ThreadContext context, Object value) {
|
119
|
+
Ruby runtime = context.getRuntime();
|
120
|
+
if (value instanceof String) return RubyString.newString(runtime, (String)value);
|
121
|
+
if (value instanceof Boolean) return RubyBoolean.newBoolean(runtime, (Boolean)value);
|
122
|
+
if (value instanceof Long) return RubyFixnum.newFixnum(runtime, (Long)value);
|
123
|
+
if (value instanceof clojure.lang.Keyword) {
|
124
|
+
return RubyString.newString(runtime, ((clojure.lang.Keyword)value).toString());
|
125
|
+
}
|
126
|
+
if (value instanceof java.math.BigInteger) return RubyBignum.newBignum(runtime, ((java.math.BigInteger)value).longValue());
|
127
|
+
if (value instanceof Double) return RubyFloat.newFloat(runtime, (Double)value);
|
128
|
+
if (value instanceof Date) return RubyTime.newTime(runtime, ((Date)value).getTime());
|
129
|
+
if (value instanceof java.util.UUID) {
|
130
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::UUID");
|
131
|
+
DiametricUUID diametric_uuid = (DiametricUUID)clazz.allocate();
|
132
|
+
diametric_uuid.init((java.util.UUID)value);
|
133
|
+
return diametric_uuid;
|
134
|
+
}
|
135
|
+
return JavaUtil.convertJavaToUsableRubyObject(runtime, value);
|
136
|
+
}
|
137
|
+
|
138
|
+
static List<Object> convertRubyTxDataToJava(ThreadContext context, IRubyObject arg) {
|
139
|
+
List<Object> tx_data = null;
|
140
|
+
if (arg instanceof RubyArray) {
|
141
|
+
tx_data = fromRubyArray(context, arg);
|
142
|
+
} else {
|
143
|
+
Object obj = arg.toJava(Object.class);
|
144
|
+
if (obj instanceof clojure.lang.PersistentVector) {
|
145
|
+
tx_data = (clojure.lang.PersistentVector)obj;
|
146
|
+
}
|
147
|
+
}
|
148
|
+
return tx_data;
|
149
|
+
}
|
150
|
+
|
151
|
+
private static List<Object> fromRubyArray(ThreadContext context, IRubyObject arg) {
|
152
|
+
RubyArray ruby_tx_data = (RubyArray)arg;
|
153
|
+
List<Object> java_tx_data = new ArrayList<Object>();
|
154
|
+
for (int i=0; i<ruby_tx_data.getLength(); i++) {
|
155
|
+
IRubyObject element = (IRubyObject) ruby_tx_data.get(i);
|
156
|
+
if (element instanceof RubyHash) {
|
157
|
+
RubyHash ruby_hash = (RubyHash) element;
|
158
|
+
Map<Object, Object> keyvals = new HashMap<Object, Object>();
|
159
|
+
while (true) {
|
160
|
+
IRubyObject pair = ruby_hash.shift(context);
|
161
|
+
if (pair instanceof RubyNil) break;
|
162
|
+
Object key = DiametricUtils.convertRubyToJava(context, ((RubyArray) pair).shift(context));
|
163
|
+
Object value = DiametricUtils.convertRubyToJava(context, ((RubyArray) pair).shift(context));
|
164
|
+
keyvals.put(key, value);
|
165
|
+
}
|
166
|
+
java_tx_data.add(Collections.unmodifiableMap(keyvals));
|
167
|
+
} else if (element instanceof RubyArray) {
|
168
|
+
RubyArray ruby_array = (RubyArray) element;
|
169
|
+
List<Object> keyvals = new ArrayList<Object>();
|
170
|
+
while (true) {
|
171
|
+
IRubyObject ruby_element = ruby_array.shift(context);
|
172
|
+
if (ruby_element instanceof RubyNil) break;
|
173
|
+
Object key_or_value = DiametricUtils.convertRubyToJava(context, ruby_element);
|
174
|
+
keyvals.add(key_or_value);
|
175
|
+
}
|
176
|
+
java_tx_data.add(Collections.unmodifiableList(keyvals));
|
177
|
+
} else {
|
178
|
+
continue;
|
179
|
+
}
|
180
|
+
}
|
181
|
+
return java_tx_data;
|
182
|
+
}
|
183
|
+
}
|
data/lib/boolean_type.rb
ADDED
data/lib/diametric.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require "diametric/version"
|
2
|
+
require "diametric/entity"
|
3
|
+
require "diametric/query"
|
4
|
+
require "diametric/persistence"
|
5
|
+
require "diametric/errors"
|
6
|
+
|
7
|
+
require 'diametric/config'
|
8
|
+
|
9
|
+
def is_jruby?
|
10
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
11
|
+
true
|
12
|
+
else
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
if is_jruby?
|
18
|
+
require 'lock_jar'
|
19
|
+
jar_file = File.join(File.dirname(__FILE__), "..", "Jarfile")
|
20
|
+
lock_file = File.join(File.dirname(__FILE__), "..", "Jarfile.lock")
|
21
|
+
current_dir = Dir.pwd
|
22
|
+
Dir.chdir(File.dirname(lock_file))
|
23
|
+
LockJar.lock(jar_file)
|
24
|
+
LockJar.install(lock_file)
|
25
|
+
LockJar.load(lock_file)
|
26
|
+
Dir.chdir(current_dir)
|
27
|
+
|
28
|
+
require 'diametric_service.jar'
|
29
|
+
require 'diametric/diametric'
|
30
|
+
require 'diametric/persistence/peer'
|
31
|
+
end
|
32
|
+
|
33
|
+
if defined?(Rails)
|
34
|
+
require 'diametric/railtie'
|
35
|
+
end
|
36
|
+
|
37
|
+
# Diametric is a library for building schemas, queries, and
|
38
|
+
# transactions for Datomic from Ruby objects. It is also used to map
|
39
|
+
# Ruby objects as entities into a Datomic database.
|
40
|
+
module Diametric
|
41
|
+
extend Diametric::Config
|
42
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'diametric/config/environment'
|
2
|
+
require 'diametric/persistence'
|
3
|
+
|
4
|
+
module Diametric
|
5
|
+
# Program-level configuration services including configuration loading and base connections.
|
6
|
+
module Config
|
7
|
+
extend self
|
8
|
+
|
9
|
+
# The current configuration Diametric will use in {#connect!}
|
10
|
+
#
|
11
|
+
# @return [Hash]
|
12
|
+
def configuration
|
13
|
+
@configuration ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Determine if Diametric has been configured
|
17
|
+
#
|
18
|
+
# @return [Boolean]
|
19
|
+
def configured?
|
20
|
+
configuration.present?
|
21
|
+
end
|
22
|
+
|
23
|
+
# Load settings from a compliant diametric.yml file and make a connection. This can be used for
|
24
|
+
# easy setup with frameworks other than Rails.
|
25
|
+
#
|
26
|
+
# See {Persistence} for valid options.
|
27
|
+
#
|
28
|
+
# @example Configure Diametric.
|
29
|
+
# Diametric.load_and_connect!("/path/to/diametric.yml")
|
30
|
+
#
|
31
|
+
# @param [ String ] path The path to the file.
|
32
|
+
# @param [ String, Symbol ] environment The environment to load.
|
33
|
+
def load_and_connect!(path, environment = nil)
|
34
|
+
settings = Environment.load_yaml(path, environment)
|
35
|
+
@configuration = settings.with_indifferent_access
|
36
|
+
connect!(configuration)
|
37
|
+
peer_setup if Diametric::Persistence.peer?
|
38
|
+
configuration
|
39
|
+
end
|
40
|
+
|
41
|
+
# Establish a base connection from the supplied configuration hash.
|
42
|
+
#
|
43
|
+
# @param [ Hash ] configuration The configuration of the database to connect to. See {Persistence.establish_base_connection} for valid options.
|
44
|
+
def connect!(configuration)
|
45
|
+
::Diametric::Persistence.establish_base_connection(configuration)
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def peer_setup
|
50
|
+
load File.join(File.dirname(__FILE__), '..', 'tasks', 'create_schema.rb')
|
51
|
+
Rake::Task["diametric:create_schema_for_peer"].invoke
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|