swift 0.14.0 → 1.0.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.
Files changed (51) hide show
  1. data/API.rdoc +14 -14
  2. data/README.md +110 -61
  3. data/Rakefile +2 -5
  4. data/VERSION +1 -1
  5. data/lib/swift/adapter/mysql.rb +30 -0
  6. data/lib/swift/adapter/postgres.rb +27 -0
  7. data/lib/swift/adapter/sql.rb +23 -29
  8. data/lib/swift/adapter/sqlite3.rb +59 -0
  9. data/lib/swift/adapter.rb +129 -70
  10. data/lib/swift/attribute.rb +19 -8
  11. data/lib/swift/eventmachine.rb +49 -0
  12. data/lib/swift/identity_map.rb +7 -7
  13. data/lib/swift/migrations.rb +12 -12
  14. data/lib/swift/{scheme.rb → record.rb} +16 -17
  15. data/lib/swift/result.rb +24 -0
  16. data/lib/swift/statement.rb +25 -0
  17. data/lib/swift/synchrony.rb +38 -0
  18. data/lib/swift/validations.rb +2 -2
  19. data/lib/swift.rb +8 -6
  20. data/swift.gemspec +19 -31
  21. data/test/helper.rb +11 -6
  22. data/test/test_adapter.rb +11 -25
  23. data/test/test_async.rb +9 -12
  24. data/test/test_encoding.rb +2 -2
  25. data/test/test_error.rb +8 -8
  26. data/test/test_io.rb +2 -2
  27. data/test/{test_scheme.rb → test_record.rb} +6 -6
  28. data/test/test_swift.rb +9 -51
  29. data/test/test_timestamps.rb +1 -1
  30. data/test/test_transactions.rb +2 -2
  31. data/test/test_types.rb +3 -3
  32. data/test/test_validations.rb +2 -2
  33. metadata +20 -27
  34. data/ext/adapter.cc +0 -479
  35. data/ext/adapter.h +0 -13
  36. data/ext/adapter_io.cc +0 -62
  37. data/ext/adapter_io.h +0 -24
  38. data/ext/attribute.cc +0 -22
  39. data/ext/attribute.h +0 -8
  40. data/ext/datetime.cc +0 -96
  41. data/ext/datetime.h +0 -12
  42. data/ext/extconf.rb +0 -61
  43. data/ext/query.cc +0 -104
  44. data/ext/query.h +0 -20
  45. data/ext/result.cc +0 -229
  46. data/ext/result.h +0 -27
  47. data/ext/statement.cc +0 -116
  48. data/ext/statement.h +0 -22
  49. data/ext/swift.cc +0 -114
  50. data/ext/swift.h +0 -60
  51. data/lib/swift/db.rb +0 -89
data/ext/swift.cc DELETED
@@ -1,114 +0,0 @@
1
- #include "swift.h"
2
-
3
- static VALUE mSwift;
4
-
5
- VALUE eSwiftError;
6
- VALUE eSwiftArgumentError;
7
- VALUE eSwiftRuntimeError;
8
- VALUE eSwiftConnectionError;
9
-
10
- /*
11
- Initialize Swift with a non standard dbic++ path.
12
-
13
- @note
14
- By default Swift looks in '/usr/lib/dbic++/'. Not normally required unless you install dbic++ somewhere funny.
15
-
16
- @overload init(path)
17
- @param [path] path Non standard dbic++ path.
18
- */
19
- VALUE swift_init(VALUE self, VALUE path) {
20
- try { dbi::dbiInitialize(CSTRING(path)); } CATCH_DBI_EXCEPTIONS();
21
- return Qtrue;
22
- }
23
-
24
- /*
25
- Trace statement execution.
26
-
27
- @example Toggle tracing.
28
- Swift.trace true
29
- Swift.db.execute 'select * from users'
30
- Swift.trace false
31
- @example Block form.
32
- Swift.trace true do
33
- Swift.db.execute 'select * from users'
34
- end
35
-
36
- @overload trace(show = true, output = $stderr)
37
- @param [true, false] show Optional trace toggle boolean.
38
- @param [IO] output Optional output. Defaults to stderr.
39
- */
40
- VALUE swift_trace(int argc, VALUE *argv, VALUE self) {
41
- VALUE flag, io;
42
- rb_io_t *fptr;
43
- int status, fd = 2; // defaults to stderr
44
-
45
- rb_scan_args(argc, argv, "02", &flag, &io);
46
-
47
- if (NIL_P(flag))
48
- flag = Qtrue;
49
-
50
- if (TYPE(flag) != T_TRUE && TYPE(flag) != T_FALSE)
51
- rb_raise(eSwiftArgumentError, "Swift#trace expects a boolean flag, got %s", CSTRING(flag));
52
-
53
- if (!NIL_P(io)) {
54
- GetOpenFile(rb_convert_type(io, T_FILE, "IO", "to_io"), fptr);
55
- fd = fptr->fd;
56
- }
57
-
58
- // block form trace
59
- if (rb_block_given_p()) {
60
- // orig values
61
- bool orig_trace = dbi::_trace;
62
- int orig_trace_fd = dbi::_trace_fd;
63
-
64
- dbi::trace(flag == Qtrue ? true : false, fd);
65
- VALUE block_result = rb_protect(rb_yield, Qnil, &status);
66
- dbi::trace(orig_trace, orig_trace_fd);
67
-
68
- if (status)
69
- rb_jump_tag(status);
70
- else
71
- return block_result;
72
- }
73
- else {
74
- dbi::trace(flag == Qtrue ? true : false, fd);
75
- return flag;
76
- }
77
- }
78
-
79
- VALUE atexit_gc(...) {
80
- rb_gc();
81
- return Qnil;
82
- }
83
-
84
- void atexit_caller(VALUE data) {
85
- rb_proc_call(data, rb_ary_new());
86
- }
87
-
88
- extern "C" {
89
- void Init_swift(void) {
90
- mSwift = rb_define_module("Swift");
91
-
92
- eSwiftError = rb_define_class("SwiftError", CONST_GET(rb_mKernel, "StandardError"));
93
- eSwiftArgumentError = rb_define_class("SwiftArgumentError", eSwiftError);
94
- eSwiftRuntimeError = rb_define_class("SwiftRuntimeError", eSwiftError);
95
- eSwiftConnectionError = rb_define_class("SwiftConnectionError", eSwiftError);
96
-
97
- init_swift_adapter();
98
- init_swift_attribute();
99
- init_swift_result();
100
- init_swift_statement();
101
- init_swift_query();
102
- init_swift_datetime();
103
-
104
- rb_define_module_function(mSwift, "init", RUBY_METHOD_FUNC(swift_init), 1);
105
- rb_define_module_function(mSwift, "trace", RUBY_METHOD_FUNC(swift_trace), -1);
106
-
107
- // NOTE
108
- // Swift adapter and statement objects need to be deallocated or garbage collected in the reverse
109
- // allocation order. rb_gc() does that but gc at exit time seems to do it in allocation order which
110
- // stuffs up dbic++ destructors.
111
- rb_set_end_proc(atexit_caller, rb_proc_new(atexit_gc, mSwift));
112
- }
113
- }
114
-
data/ext/swift.h DELETED
@@ -1,60 +0,0 @@
1
- #ifndef SWIFT_H
2
- #define SWIFT_H
3
-
4
- #include <dbic++.h>
5
- #include <ruby/ruby.h>
6
- #include <ruby/io.h>
7
- #include <stdint.h>
8
- #include <unistd.h>
9
- #include <sys/types.h>
10
- #include <pwd.h>
11
-
12
- #define CONST_GET(scope, constant) rb_funcall(scope, rb_intern("const_get"), 1, rb_str_new2(constant))
13
- #define TO_S(v) rb_funcall(v, rb_intern("to_s"), 0)
14
- #define CSTRING(v) RSTRING_PTR(TO_S(v))
15
- #define RUBY_STATIC_FUNC(func) ((int (*)(ANYARGS))func)
16
-
17
- extern VALUE eSwiftError;
18
- extern VALUE eSwiftArgumentError;
19
- extern VALUE eSwiftRuntimeError;
20
- extern VALUE eSwiftConnectionError;
21
-
22
- #define CATCH_DBI_EXCEPTIONS() \
23
- catch (dbi::ConnectionError &error) { \
24
- rb_raise(eSwiftConnectionError, "%s", error.what()); \
25
- } \
26
- catch (dbi::Error &error) { \
27
- rb_raise(eSwiftRuntimeError, "%s", error.what()); \
28
- } \
29
- catch (std::bad_alloc &error) { \
30
- rb_raise(rb_eNoMemError, "%s", error.what()); \
31
- } \
32
- catch (std::exception &error) { \
33
- rb_raise(rb_eRuntimeError, "%s", error.what()); \
34
- }
35
-
36
-
37
- // works without a controlling tty, getlogin() will fail when process is daemonized.
38
- inline VALUE current_user() {
39
- struct passwd *ptr = getpwuid(getuid());
40
- return ptr ? rb_str_new2(ptr->pw_name) : rb_str_new2("root");
41
- }
42
-
43
- #include "adapter.h"
44
- #include "adapter_io.h"
45
- #include "query.h"
46
- #include "result.h"
47
- #include "statement.h"
48
- #include "attribute.h"
49
- #include "datetime.h"
50
-
51
- #undef SIZET2NUM
52
- #ifdef HAVE_LONG_LONG
53
- #define SIZET2NUM(x) ULL2NUM(x)
54
- #define DAYMICROSECS 86400000000LL
55
- #else
56
- #define SIZET2NUM(x) ULONG2NUM(x)
57
- #define DAYMICROSECS 86400000000L
58
- #endif
59
-
60
- #endif
data/lib/swift/db.rb DELETED
@@ -1,89 +0,0 @@
1
- require 'swift/adapter/sql'
2
-
3
- module Swift
4
- module DB
5
- class Mysql < Adapter::Sql
6
- def initialize options = {}
7
- super options.update(driver: 'mysql')
8
- end
9
-
10
- def returning?
11
- false
12
- end
13
-
14
- # TODO Swift::Type::Bignum ?
15
- # serial is an alias for bigint in mysql, we want integer type to be migrated as integer
16
- # type in the database (not bigint or smallint or shortint or whatever).
17
- def field_type attribute
18
- case attribute
19
- when Type::Integer then attribute.serial ? 'integer auto_increment' : 'integer'
20
- else super
21
- end
22
- end
23
-
24
- def tables
25
- execute("show tables").map(&:values).flatten
26
- end
27
- end # Mysql
28
-
29
- class Sqlite3 < Adapter::Sql
30
- def initialize options = {}
31
- super options.update(driver: 'sqlite3')
32
- end
33
-
34
- def returning?
35
- false
36
- end
37
-
38
- def migrate! scheme
39
- keys = scheme.header.keys
40
- serial = scheme.header.find(&:serial)
41
- fields = scheme.header.map{|p| field_definition(p)}.join(', ')
42
- fields += ", primary key (#{keys.join(', ')})" unless serial or keys.empty?
43
-
44
- execute("drop table if exists #{scheme.store}")
45
- execute("create table #{scheme.store} (#{fields})")
46
- end
47
-
48
- def field_type attribute
49
- case attribute
50
- when Type::String then 'text'
51
- when Type::Integer then attribute.serial ? 'integer primary key' : 'integer'
52
- when Type::Float then 'float'
53
- when Type::BigDecimal then 'numeric'
54
- when Type::Time then 'timestamp' # deprecated
55
- when Type::DateTime then 'timestamp'
56
- when Type::Date then 'date'
57
- when Type::Boolean then 'boolean'
58
- when Type::IO then 'blob'
59
- else 'text'
60
- end
61
- end
62
-
63
- def tables
64
- execute('select name from sqlite_master where type = ?', 'table').map(&:values).flatten
65
- end
66
- end # Sqlite3
67
-
68
- class Postgres < Adapter::Sql
69
- def initialize options = {}
70
- super options.update(driver: 'postgresql')
71
- end
72
-
73
- def returning?
74
- true
75
- end
76
-
77
- def field_type attribute
78
- case attribute
79
- when Type::IO then 'bytea'
80
- else super
81
- end
82
- end
83
-
84
- def tables
85
- execute('select tablename from pg_tables where schemaname = current_schema').map(&:values).flatten
86
- end
87
- end # Postgres
88
- end # DB
89
- end # Swift