globegit-postgresql-plruby 0.5.4
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.
- data/Changes +121 -0
- data/README.markdown +155 -0
- data/Rakefile +48 -0
- data/docs/plruby.rb +1931 -0
- data/ex_trans.sql +33 -0
- data/extconf.rb +267 -0
- data/plruby.html +1454 -0
- data/plruby.rd +1571 -0
- data/postgresql-plruby.gemspec +56 -0
- data/src/conversions.h +5 -0
- data/src/conversions/basic/conversions.h +25 -0
- data/src/conversions/basic/extconf.rb +8 -0
- data/src/conversions/basic/plruby_basic.c +357 -0
- data/src/conversions/bitstring/bitstring.sql +75 -0
- data/src/conversions/bitstring/conversions.h +15 -0
- data/src/conversions/bitstring/extconf.rb +8 -0
- data/src/conversions/bitstring/plruby_bitstring.c +579 -0
- data/src/conversions/convcommon.h +129 -0
- data/src/conversions/datetime/conversions.h +13 -0
- data/src/conversions/datetime/extconf.rb +8 -0
- data/src/conversions/datetime/plruby_datetime.c +269 -0
- data/src/conversions/geometry/conversions.h +37 -0
- data/src/conversions/geometry/extconf.rb +8 -0
- data/src/conversions/geometry/geometry.sql +196 -0
- data/src/conversions/geometry/plruby_geometry.c +2494 -0
- data/src/conversions/network/conversions.h +21 -0
- data/src/conversions/network/extconf.rb +8 -0
- data/src/conversions/network/network.sql +63 -0
- data/src/conversions/network/plruby_network.c +537 -0
- data/src/package.h +20 -0
- data/src/plpl.c +1708 -0
- data/src/plplan.c +893 -0
- data/src/plruby.c +1676 -0
- data/src/plruby.h +324 -0
- data/src/pltrans.c +388 -0
- data/test/conv_bitstring/b.rb +45 -0
- data/test/conv_bitstring/runtest +26 -0
- data/test/conv_bitstring/test.expected.73 +148 -0
- data/test/conv_bitstring/test.expected.74 +148 -0
- data/test/conv_bitstring/test.expected.80 +148 -0
- data/test/conv_bitstring/test.expected.81 +148 -0
- data/test/conv_bitstring/test.expected.82 +148 -0
- data/test/conv_bitstring/test.expected.83 +148 -0
- data/test/conv_bitstring/test.expected.84 +148 -0
- data/test/conv_bitstring/test.out +148 -0
- data/test/conv_bitstring/test_mklang.sql +8 -0
- data/test/conv_bitstring/test_queries.sql +63 -0
- data/test/conv_bitstring/test_queries.sql.in +63 -0
- data/test/conv_geometry/b.rb +45 -0
- data/test/conv_geometry/runtest +26 -0
- data/test/conv_geometry/test.expected.73 +265 -0
- data/test/conv_geometry/test.expected.74 +265 -0
- data/test/conv_geometry/test.expected.80 +265 -0
- data/test/conv_geometry/test.expected.81 +265 -0
- data/test/conv_geometry/test.expected.82 +265 -0
- data/test/conv_geometry/test.expected.83 +265 -0
- data/test/conv_geometry/test.expected.84 +265 -0
- data/test/conv_geometry/test.out +265 -0
- data/test/conv_geometry/test_mklang.sql +8 -0
- data/test/conv_geometry/test_queries.sql +194 -0
- data/test/conv_geometry/test_queries.sql.in +194 -0
- data/test/conv_network/b.rb +45 -0
- data/test/conv_network/runtest +26 -0
- data/test/conv_network/test.expected.73 +213 -0
- data/test/conv_network/test.expected.74 +237 -0
- data/test/conv_network/test.expected.80 +237 -0
- data/test/conv_network/test.expected.81 +237 -0
- data/test/conv_network/test.expected.82 +237 -0
- data/test/conv_network/test.expected.83 +237 -0
- data/test/conv_network/test.expected.84 +237 -0
- data/test/conv_network/test.out +237 -0
- data/test/conv_network/test_mklang.sql +8 -0
- data/test/conv_network/test_queries.sql +60 -0
- data/test/conv_network/test_queries.sql.in +60 -0
- data/test/plp/b.rb +34 -0
- data/test/plp/runtest +29 -0
- data/test/plp/test.expected.73 +472 -0
- data/test/plp/test.expected.74 +472 -0
- data/test/plp/test.expected.75 +472 -0
- data/test/plp/test.expected.80 +472 -0
- data/test/plp/test.expected.81 +472 -0
- data/test/plp/test.expected.82 +472 -0
- data/test/plp/test.expected.83 +472 -0
- data/test/plp/test.expected.84 +472 -0
- data/test/plp/test.out +472 -0
- data/test/plp/test_mklang.sql +8 -0
- data/test/plp/test_queries.sql +273 -0
- data/test/plp/test_setup.sql +931 -0
- data/test/plp/test_setup.sql.in +931 -0
- data/test/plt/b.rb +34 -0
- data/test/plt/runtest +29 -0
- data/test/plt/test.expected.73 +178 -0
- data/test/plt/test.expected.74 +178 -0
- data/test/plt/test.expected.75 +178 -0
- data/test/plt/test.expected.80 +178 -0
- data/test/plt/test.expected.81 +178 -0
- data/test/plt/test.expected.82 +178 -0
- data/test/plt/test.expected.83 +164 -0
- data/test/plt/test.expected.84 +168 -0
- data/test/plt/test.out +168 -0
- data/test/plt/test_mklang.sql +8 -0
- data/test/plt/test_queries.sql +72 -0
- data/test/plt/test_setup.sql +252 -0
- data/test/plt/test_setup.sql.in +252 -0
- data/test/range/b.rb +45 -0
- data/test/range/runtest +26 -0
- data/test/range/test.expected.73 +396 -0
- data/test/range/test.expected.73.in +396 -0
- data/test/range/test.expected.74 +396 -0
- data/test/range/test.expected.74.in +396 -0
- data/test/range/test.expected.75 +396 -0
- data/test/range/test.expected.75.in +396 -0
- data/test/range/test.expected.80 +396 -0
- data/test/range/test.expected.81 +397 -0
- data/test/range/test.expected.82 +397 -0
- data/test/range/test.expected.83 +397 -0
- data/test/range/test.expected.84 +399 -0
- data/test/range/test.out +399 -0
- data/test/range/test_mklang.sql +8 -0
- data/test/range/test_queries.sql +249 -0
- data/test/range/test_queries.sql.in +249 -0
- metadata +207 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#include "package.h"
|
|
2
|
+
|
|
3
|
+
#include <postgres.h>
|
|
4
|
+
#include <catalog/pg_type.h>
|
|
5
|
+
#include <utils/builtins.h>
|
|
6
|
+
#include <lib/stringinfo.h>
|
|
7
|
+
#include "package.h"
|
|
8
|
+
#include <ruby.h>
|
|
9
|
+
#include "package.h"
|
|
10
|
+
|
|
11
|
+
#define CPY_FREE(p0_, p1_, size_) do { \
|
|
12
|
+
void *p2_ = (void *)p1_; \
|
|
13
|
+
memcpy((p0_), (p2_), (size_)); \
|
|
14
|
+
pfree(p2_); \
|
|
15
|
+
} while (0)
|
|
16
|
+
|
|
17
|
+
#if PG_PL_VERSION >= 74
|
|
18
|
+
|
|
19
|
+
#define PL_MDUMP(name_,func_) \
|
|
20
|
+
static VALUE \
|
|
21
|
+
name_(int argc, VALUE *argv, VALUE obj) \
|
|
22
|
+
{ \
|
|
23
|
+
void *mac; \
|
|
24
|
+
char *res; \
|
|
25
|
+
VALUE result; \
|
|
26
|
+
\
|
|
27
|
+
Data_Get_Struct(obj, void, mac); \
|
|
28
|
+
res = (char *)PLRUBY_DFC1(func_, mac); \
|
|
29
|
+
result = rb_tainted_str_new(VARDATA(res), VARSIZE(res)); \
|
|
30
|
+
pfree(res); \
|
|
31
|
+
return result; \
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#define PL_MLOAD(name_,func_,type_) \
|
|
35
|
+
static VALUE \
|
|
36
|
+
name_(VALUE obj, VALUE a) \
|
|
37
|
+
{ \
|
|
38
|
+
StringInfoData si; \
|
|
39
|
+
type_ *mac0, *mac1; \
|
|
40
|
+
\
|
|
41
|
+
if (TYPE(a) != T_STRING || !RSTRING_LEN(a)) { \
|
|
42
|
+
rb_raise(rb_eArgError, "expected a String object"); \
|
|
43
|
+
} \
|
|
44
|
+
initStringInfo(&si); \
|
|
45
|
+
appendBinaryStringInfo(&si, RSTRING_PTR(a), RSTRING_LEN(a)); \
|
|
46
|
+
mac1 = (type_ *)PLRUBY_DFC1(func_, &si); \
|
|
47
|
+
pfree(si.data); \
|
|
48
|
+
Data_Get_Struct(obj, type_, mac0); \
|
|
49
|
+
CPY_FREE(mac0, mac1, sizeof(type_)); \
|
|
50
|
+
return obj; \
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#define PL_MLOADVAR(name_,func_,type_,size_) \
|
|
54
|
+
static VALUE \
|
|
55
|
+
name_(VALUE obj, VALUE a) \
|
|
56
|
+
{ \
|
|
57
|
+
StringInfoData si; \
|
|
58
|
+
type_ *mac0, *mac1; \
|
|
59
|
+
int szl; \
|
|
60
|
+
\
|
|
61
|
+
if (TYPE(a) != T_STRING || !RSTRING_LEN(a)) { \
|
|
62
|
+
rb_raise(rb_eArgError, "expected a String object"); \
|
|
63
|
+
} \
|
|
64
|
+
initStringInfo(&si); \
|
|
65
|
+
appendBinaryStringInfo(&si, RSTRING_PTR(a), RSTRING_LEN(a)); \
|
|
66
|
+
mac1 = (type_ *)PLRUBY_DFC1(func_, &si); \
|
|
67
|
+
pfree(si.data); \
|
|
68
|
+
Data_Get_Struct(obj, type_, mac0); \
|
|
69
|
+
free(mac0); \
|
|
70
|
+
szl = size_(mac1); \
|
|
71
|
+
mac0 = (type_ *)ALLOC_N(char, szl); \
|
|
72
|
+
CPY_FREE(mac0, mac1, szl); \
|
|
73
|
+
RDATA(obj)->data = mac0; \
|
|
74
|
+
return obj; \
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#ifndef RUBY_CAN_USE_MARSHAL_LOAD
|
|
78
|
+
extern VALUE plruby_s_load _((VALUE, VALUE));
|
|
79
|
+
#endif
|
|
80
|
+
|
|
81
|
+
#else
|
|
82
|
+
|
|
83
|
+
#define PL_MDUMP(name_,func_)
|
|
84
|
+
#define PL_MLOAD(name_,func_,type_)
|
|
85
|
+
#define PL_MLOADVAR(name_,func_,type_,size_)
|
|
86
|
+
|
|
87
|
+
#endif
|
|
88
|
+
|
|
89
|
+
extern VALUE plruby_to_s _((VALUE));
|
|
90
|
+
extern VALUE plruby_s_new _((int, VALUE *, VALUE));
|
|
91
|
+
extern VALUE plruby_define_void_class _((char *, char *));
|
|
92
|
+
#ifndef HAVE_RB_INITIALIZE_COPY
|
|
93
|
+
extern VALUE plruby_clone _((VALUE));
|
|
94
|
+
#endif
|
|
95
|
+
extern Oid plruby_datum_oid _((VALUE, int *));
|
|
96
|
+
extern VALUE plruby_datum_set _((VALUE, Datum));
|
|
97
|
+
extern VALUE plruby_datum_get _((VALUE, Oid *));
|
|
98
|
+
|
|
99
|
+
#ifndef StringValuePtr
|
|
100
|
+
#define StringValuePtr(x) STR2CSTR(x)
|
|
101
|
+
#endif
|
|
102
|
+
|
|
103
|
+
#ifndef RSTRING_PTR
|
|
104
|
+
# define RSTRING_PTR(x_) RSTRING(x_)->ptr
|
|
105
|
+
# define RSTRING_LEN(x_) RSTRING(x_)->len
|
|
106
|
+
#endif
|
|
107
|
+
|
|
108
|
+
#ifndef RARRAY_PTR
|
|
109
|
+
# define RARRAY_PTR(x_) RARRAY(x_)->ptr
|
|
110
|
+
# define RARRAY_LEN(x_) RARRAY(x_)->len
|
|
111
|
+
#endif
|
|
112
|
+
|
|
113
|
+
#ifndef RHASH_TBL
|
|
114
|
+
#define RHASH_TBL(x_) (RHASH(x_)->tbl)
|
|
115
|
+
#endif
|
|
116
|
+
|
|
117
|
+
#ifndef RFLOAT_VALUE
|
|
118
|
+
#define RFLOAT_VALUE(x_) (RFLOAT(x_)->value)
|
|
119
|
+
#endif
|
|
120
|
+
|
|
121
|
+
extern Datum plruby_dfc0 _((PGFunction));
|
|
122
|
+
extern Datum plruby_dfc1 _((PGFunction, Datum));
|
|
123
|
+
extern Datum plruby_dfc2 _((PGFunction, Datum, Datum));
|
|
124
|
+
extern Datum plruby_dfc3 _((PGFunction, Datum, Datum, Datum));
|
|
125
|
+
|
|
126
|
+
#define PLRUBY_DFC0(a_) plruby_dfc0(a_)
|
|
127
|
+
#define PLRUBY_DFC1(a_,b_) plruby_dfc1(a_,PointerGetDatum(b_))
|
|
128
|
+
#define PLRUBY_DFC2(a_,b_,c_) plruby_dfc2(a_,PointerGetDatum(b_),PointerGetDatum(c_))
|
|
129
|
+
#define PLRUBY_DFC3(a_,b_,c_,d_) plruby_dfc3(a_,PointerGetDatum(b_),PointerGetDatum(c_),PointerGetDatum(d_))
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
VALUE tmp;
|
|
3
|
+
|
|
4
|
+
#if RUBY_CAN_USE_AUTOLOAD
|
|
5
|
+
rb_funcall(rb_mKernel, rb_intern("autoload"), 2, rb_str_new2("Tinterval"),
|
|
6
|
+
rb_str_new2("plruby/plruby_datetime"));
|
|
7
|
+
tmp = INT2NUM(rb_intern("Tinterval"));
|
|
8
|
+
rb_hash_aset(plruby_conversions, INT2NUM(TINTERVALOID), tmp);
|
|
9
|
+
#else
|
|
10
|
+
tmp = plruby_define_void_class("Tinterval", "plruby/plruby_datetime");
|
|
11
|
+
rb_hash_aset(plruby_classes, INT2NUM(TINTERVALOID), tmp);
|
|
12
|
+
#endif
|
|
13
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
#include "convcommon.h"
|
|
2
|
+
|
|
3
|
+
#include <utils/date.h>
|
|
4
|
+
#include <utils/nabstime.h>
|
|
5
|
+
|
|
6
|
+
static VALUE pl_cTinter, pl_mMarshal;
|
|
7
|
+
|
|
8
|
+
static char *
|
|
9
|
+
pl_dequote(char *src)
|
|
10
|
+
{
|
|
11
|
+
char *origin;
|
|
12
|
+
|
|
13
|
+
while (*src && *src != '"') ++src;
|
|
14
|
+
if (*src != '"') {
|
|
15
|
+
rb_raise(rb_eArgError, "Invalid Tinterval");
|
|
16
|
+
}
|
|
17
|
+
++src;
|
|
18
|
+
origin = src;
|
|
19
|
+
while (*src && *src != '"') ++src;
|
|
20
|
+
if (*src != '"') {
|
|
21
|
+
rb_raise(rb_eArgError, "Invalid Tinterval");
|
|
22
|
+
}
|
|
23
|
+
*src = 0;
|
|
24
|
+
return origin;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
struct pl_tint {
|
|
28
|
+
VALUE low, high;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
static void
|
|
32
|
+
pl_tint_mark(struct pl_tint *tint)
|
|
33
|
+
{
|
|
34
|
+
rb_gc_mark(tint->low);
|
|
35
|
+
rb_gc_mark(tint->high);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static VALUE
|
|
39
|
+
pl_tint_s_alloc(VALUE obj)
|
|
40
|
+
{
|
|
41
|
+
struct pl_tint *tint;
|
|
42
|
+
return Data_Make_Struct(obj, struct pl_tint, pl_tint_mark, free, tint);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static VALUE
|
|
46
|
+
pl_tint_s_from_string(VALUE obj, VALUE str)
|
|
47
|
+
{
|
|
48
|
+
char *first, *second, *tmp;
|
|
49
|
+
VALUE d0, d1;
|
|
50
|
+
struct pl_tint *tint;
|
|
51
|
+
VALUE res;
|
|
52
|
+
|
|
53
|
+
tmp = StringValuePtr(str);
|
|
54
|
+
first = pl_dequote(tmp);
|
|
55
|
+
second = pl_dequote(first + strlen(first) + 1);
|
|
56
|
+
d0 = rb_dbl2big(DatumGetTimestamp(PLRUBY_DFC1(date_timestamp,
|
|
57
|
+
PLRUBY_DFC1(date_in, first))));
|
|
58
|
+
d1 = rb_dbl2big(DatumGetTimestamp(PLRUBY_DFC1(date_timestamp,
|
|
59
|
+
PLRUBY_DFC1(date_in, second))));
|
|
60
|
+
res = Data_Make_Struct(obj, struct pl_tint, pl_tint_mark, free, tint);
|
|
61
|
+
tint->low = rb_funcall(rb_cTime, rb_intern("at"), 1, d0);
|
|
62
|
+
tint->high = rb_funcall(rb_cTime, rb_intern("at"), 1, d1);
|
|
63
|
+
if (OBJ_TAINTED(str)) OBJ_TAINT(res);
|
|
64
|
+
return res;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static VALUE
|
|
68
|
+
pl_tint_s_datum(VALUE obj, VALUE a)
|
|
69
|
+
{
|
|
70
|
+
TimeIntervalData *interval;
|
|
71
|
+
Oid typoid;
|
|
72
|
+
VALUE tmp, res;
|
|
73
|
+
|
|
74
|
+
interval = (TimeIntervalData *)plruby_datum_get(a, &typoid);
|
|
75
|
+
if (typoid != TINTERVALOID) {
|
|
76
|
+
rb_raise(rb_eArgError, "invalid argument");
|
|
77
|
+
}
|
|
78
|
+
res = rb_ary_new2(2);
|
|
79
|
+
tmp = rb_dbl2big(DatumGetTimestamp(PLRUBY_DFC1(abstime_timestamp,
|
|
80
|
+
interval->data[0])));
|
|
81
|
+
tmp = rb_funcall(rb_cTime, rb_intern("at"), 1, tmp);
|
|
82
|
+
OBJ_TAINT(tmp);
|
|
83
|
+
rb_ary_push(res, tmp);
|
|
84
|
+
tmp = rb_dbl2big(DatumGetTimestamp(PLRUBY_DFC1(abstime_timestamp,
|
|
85
|
+
interval->data[1])));
|
|
86
|
+
tmp = rb_funcall(rb_cTime, rb_intern("at"), 1, tmp);
|
|
87
|
+
OBJ_TAINT(tmp);
|
|
88
|
+
rb_ary_push(res, tmp);
|
|
89
|
+
OBJ_TAINT(res);
|
|
90
|
+
return res;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#if PG_PL_VERSION >= 74
|
|
94
|
+
|
|
95
|
+
static VALUE
|
|
96
|
+
pl_tint_mdump(int argc, VALUE *argv, VALUE obj)
|
|
97
|
+
{
|
|
98
|
+
struct pl_tint *tint;
|
|
99
|
+
VALUE ary;
|
|
100
|
+
|
|
101
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
102
|
+
ary = rb_ary_new2(2);
|
|
103
|
+
rb_ary_push(ary, tint->low);
|
|
104
|
+
rb_ary_push(ary, tint->high);
|
|
105
|
+
return rb_funcall(pl_mMarshal, rb_intern("dump"), 1, ary);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static VALUE
|
|
109
|
+
pl_tint_mload(VALUE obj, VALUE a)
|
|
110
|
+
{
|
|
111
|
+
struct pl_tint *tint;
|
|
112
|
+
|
|
113
|
+
if (TYPE(a) != T_STRING || !RSTRING_LEN(a)) {
|
|
114
|
+
rb_raise(rb_eArgError, "expected a String object");
|
|
115
|
+
}
|
|
116
|
+
a = rb_funcall(pl_mMarshal, rb_intern("load"), 1, a);
|
|
117
|
+
if (TYPE(a) != T_ARRAY || RARRAY_LEN(a) != 2) {
|
|
118
|
+
rb_raise(rb_eArgError, "expected an Array with 2 elements");
|
|
119
|
+
}
|
|
120
|
+
if (!rb_obj_is_kind_of(RARRAY_PTR(a)[0], rb_cTime) ||
|
|
121
|
+
!rb_obj_is_kind_of(RARRAY_PTR(a)[1], rb_cTime)) {
|
|
122
|
+
rb_raise(rb_eArgError, "need 2 Times objects");
|
|
123
|
+
}
|
|
124
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
125
|
+
tint->low = RARRAY_PTR(a)[0];
|
|
126
|
+
tint->high = RARRAY_PTR(a)[1];
|
|
127
|
+
return obj;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
#endif
|
|
131
|
+
|
|
132
|
+
static VALUE
|
|
133
|
+
pl_tint_init(VALUE obj, VALUE a, VALUE b)
|
|
134
|
+
{
|
|
135
|
+
struct pl_tint *tint;
|
|
136
|
+
|
|
137
|
+
if (!rb_obj_is_kind_of(a, rb_cTime) || !rb_obj_is_kind_of(b, rb_cTime)) {
|
|
138
|
+
rb_raise(rb_eArgError, "need 2 Times objects");
|
|
139
|
+
}
|
|
140
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
141
|
+
tint->low = a;
|
|
142
|
+
tint->high = b;
|
|
143
|
+
if (OBJ_TAINTED(a) || OBJ_TAINTED(b)) OBJ_TAINT(obj);
|
|
144
|
+
return obj;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
static VALUE
|
|
148
|
+
pl_tint_low(VALUE obj)
|
|
149
|
+
{
|
|
150
|
+
struct pl_tint *tint;
|
|
151
|
+
VALUE res;
|
|
152
|
+
|
|
153
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
154
|
+
res = rb_obj_dup(tint->low);
|
|
155
|
+
if (OBJ_TAINTED(obj)) OBJ_TAINT(res);
|
|
156
|
+
return res;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
static VALUE
|
|
160
|
+
pl_tint_lowset(VALUE obj, VALUE a)
|
|
161
|
+
{
|
|
162
|
+
struct pl_tint *tint;
|
|
163
|
+
|
|
164
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
165
|
+
if (!rb_obj_is_kind_of(a, rb_cTime)) {
|
|
166
|
+
rb_raise(rb_eArgError, "need a Time object");
|
|
167
|
+
}
|
|
168
|
+
tint->low = a;
|
|
169
|
+
if (OBJ_TAINTED(a)) OBJ_TAINT(obj);
|
|
170
|
+
return a;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
static VALUE
|
|
174
|
+
pl_tint_high(VALUE obj)
|
|
175
|
+
{
|
|
176
|
+
struct pl_tint *tint;
|
|
177
|
+
VALUE res;
|
|
178
|
+
|
|
179
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
180
|
+
res = rb_obj_dup(tint->high);
|
|
181
|
+
if (OBJ_TAINTED(obj)) OBJ_TAINT(res);
|
|
182
|
+
return res;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
static VALUE
|
|
186
|
+
pl_tint_highset(VALUE obj, VALUE a)
|
|
187
|
+
{
|
|
188
|
+
struct pl_tint *tint;
|
|
189
|
+
|
|
190
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
191
|
+
if (!rb_obj_is_kind_of(a, rb_cTime)) {
|
|
192
|
+
rb_raise(rb_eArgError, "need a Time object");
|
|
193
|
+
}
|
|
194
|
+
tint->high = a;
|
|
195
|
+
if (OBJ_TAINTED(a)) OBJ_TAINT(obj);
|
|
196
|
+
return a;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
#define tinterval_str "[\"%s\" \"%s\"]"
|
|
200
|
+
|
|
201
|
+
static VALUE
|
|
202
|
+
pl_tint_to_s(VALUE obj)
|
|
203
|
+
{
|
|
204
|
+
char *tmp, *t0, *t1;
|
|
205
|
+
VALUE v0, v1;
|
|
206
|
+
struct pl_tint *tint;
|
|
207
|
+
|
|
208
|
+
Data_Get_Struct(obj, struct pl_tint, tint);
|
|
209
|
+
v0 = plruby_to_s(tint->low);
|
|
210
|
+
t0 = StringValuePtr(v0);
|
|
211
|
+
v1 = plruby_to_s(tint->high);
|
|
212
|
+
t1 = StringValuePtr(v1);
|
|
213
|
+
tmp = ALLOCA_N(char, strlen(tinterval_str) + strlen(t0) + strlen(t1) + 1);
|
|
214
|
+
sprintf(tmp, tinterval_str, t0, t1);
|
|
215
|
+
if (OBJ_TAINTED(obj)) {
|
|
216
|
+
return rb_tainted_str_new2(tmp);
|
|
217
|
+
}
|
|
218
|
+
return rb_str_new2(tmp);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
static VALUE
|
|
222
|
+
pl_tint_init_copy(VALUE copy, VALUE orig)
|
|
223
|
+
{
|
|
224
|
+
struct pl_tint *t0, *t1;
|
|
225
|
+
|
|
226
|
+
if (copy == orig) return copy;
|
|
227
|
+
if (TYPE(orig) != T_DATA ||
|
|
228
|
+
RDATA(orig)->dmark != (RUBY_DATA_FUNC)pl_tint_mark) {
|
|
229
|
+
rb_raise(rb_eTypeError, "wrong argument type to clone");
|
|
230
|
+
}
|
|
231
|
+
Data_Get_Struct(orig, struct pl_tint, t0);
|
|
232
|
+
Data_Get_Struct(copy, struct pl_tint, t1);
|
|
233
|
+
t1->low = rb_obj_dup(t0->low);
|
|
234
|
+
t1->high = rb_obj_dup(t0->high);
|
|
235
|
+
return copy;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
void Init_plruby_datetime()
|
|
239
|
+
{
|
|
240
|
+
pl_mMarshal = rb_const_get(rb_cObject, rb_intern("Marshal"));
|
|
241
|
+
pl_cTinter = rb_define_class("Tinterval", rb_cObject);
|
|
242
|
+
rb_undef_method(CLASS_OF(pl_cTinter), "method_missing");
|
|
243
|
+
#if HAVE_RB_DEFINE_ALLOC_FUNC
|
|
244
|
+
rb_define_alloc_func(pl_cTinter, pl_tint_s_alloc);
|
|
245
|
+
#else
|
|
246
|
+
rb_define_singleton_method(pl_cTinter, "allocate", pl_tint_s_alloc, 0);
|
|
247
|
+
#endif
|
|
248
|
+
rb_define_singleton_method(pl_cTinter, "new", plruby_s_new, -1);
|
|
249
|
+
rb_define_singleton_method(pl_cTinter, "from_string", pl_tint_s_from_string, 1);
|
|
250
|
+
rb_define_singleton_method(pl_cTinter, "from_datum", pl_tint_s_datum, 1);
|
|
251
|
+
rb_define_method(pl_cTinter, "initialize", pl_tint_init, 2);
|
|
252
|
+
#ifndef HAVE_RB_INITIALIZE_COPY
|
|
253
|
+
rb_define_method(pl_cTinter, "clone", plruby_clone, 0);
|
|
254
|
+
#endif
|
|
255
|
+
rb_define_method(pl_cTinter, "initialize_copy", pl_tint_init_copy, 1);
|
|
256
|
+
#if PG_PL_VERSION >= 74
|
|
257
|
+
rb_define_method(pl_cTinter, "marshal_load", pl_tint_mload, 1);
|
|
258
|
+
rb_define_method(pl_cTinter, "marshal_dump", pl_tint_mdump, -1);
|
|
259
|
+
#ifndef RUBY_CAN_USE_MARSHAL_LOAD
|
|
260
|
+
rb_define_singleton_method(pl_cTinter, "_load", plruby_s_load, 1);
|
|
261
|
+
rb_define_alias(pl_cTinter, "_dump", "marshal_dump");
|
|
262
|
+
#endif
|
|
263
|
+
#endif
|
|
264
|
+
rb_define_method(pl_cTinter, "low", pl_tint_low, 0);
|
|
265
|
+
rb_define_method(pl_cTinter, "low=", pl_tint_lowset, 1);
|
|
266
|
+
rb_define_method(pl_cTinter, "high", pl_tint_high, 0);
|
|
267
|
+
rb_define_method(pl_cTinter, "high=", pl_tint_highset, 1);
|
|
268
|
+
rb_define_method(pl_cTinter, "to_s", pl_tint_to_s, 0);
|
|
269
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
#if RUBY_CAN_USE_AUTOLOAD
|
|
3
|
+
rb_funcall(rb_mKernel, rb_intern("autoload"), 2, rb_str_new2("Point"),
|
|
4
|
+
rb_str_new2("plruby/plruby_geometry"));
|
|
5
|
+
rb_funcall(rb_mKernel, rb_intern("autoload"), 2, rb_str_new2("Segment"),
|
|
6
|
+
rb_str_new2("plruby/plruby_geometry"));
|
|
7
|
+
rb_funcall(rb_mKernel, rb_intern("autoload"), 2, rb_str_new2("Box"),
|
|
8
|
+
rb_str_new2("plruby/plruby_geometry"));
|
|
9
|
+
rb_funcall(rb_mKernel, rb_intern("autoload"), 2, rb_str_new2("Path"),
|
|
10
|
+
rb_str_new2("plruby/plruby_geometry"));
|
|
11
|
+
rb_funcall(rb_mKernel, rb_intern("autoload"), 2, rb_str_new2("Polygon"),
|
|
12
|
+
rb_str_new2("plruby/plruby_geometry"));
|
|
13
|
+
rb_funcall(rb_mKernel, rb_intern("autoload"), 2, rb_str_new2("Circle"),
|
|
14
|
+
rb_str_new2("plruby/plruby_geometry"));
|
|
15
|
+
rb_hash_aset(plruby_conversions, INT2NUM(POINTOID), INT2NUM(rb_intern("Point")));
|
|
16
|
+
rb_hash_aset(plruby_conversions, INT2NUM(LSEGOID), INT2NUM(rb_intern("Segment")));
|
|
17
|
+
rb_hash_aset(plruby_conversions, INT2NUM(BOXOID), INT2NUM(rb_intern("Box")));
|
|
18
|
+
rb_hash_aset(plruby_conversions, INT2NUM(PATHOID), INT2NUM(rb_intern("Path")));
|
|
19
|
+
rb_hash_aset(plruby_conversions, INT2NUM(POLYGONOID), INT2NUM(rb_intern("Polygon")));
|
|
20
|
+
rb_hash_aset(plruby_conversions, INT2NUM(CIRCLEOID), INT2NUM(rb_intern("Circle")));
|
|
21
|
+
#else
|
|
22
|
+
VALUE tmp;
|
|
23
|
+
|
|
24
|
+
tmp = plruby_define_void_class("Point", "plruby/plruby_geometry");
|
|
25
|
+
rb_hash_aset(plruby_classes, INT2NUM(POINTOID), tmp);
|
|
26
|
+
tmp = plruby_define_void_class("Segment", "plruby/plruby_geometry");
|
|
27
|
+
rb_hash_aset(plruby_classes, INT2NUM(LSEGOID), tmp);
|
|
28
|
+
tmp = plruby_define_void_class("Box", "plruby/plruby_geometry");
|
|
29
|
+
rb_hash_aset(plruby_classes, INT2NUM(BOXOID), tmp);
|
|
30
|
+
tmp = plruby_define_void_class("Path", "plruby/plruby_geometry");
|
|
31
|
+
rb_hash_aset(plruby_classes, INT2NUM(PATHOID), tmp);
|
|
32
|
+
tmp = plruby_define_void_class("Polygon", "plruby/plruby_geometry");
|
|
33
|
+
rb_hash_aset(plruby_classes, INT2NUM(POLYGONOID), tmp);
|
|
34
|
+
tmp = plruby_define_void_class("Circle", "plruby/plruby_geometry");
|
|
35
|
+
rb_hash_aset(plruby_classes, INT2NUM(CIRCLEOID), tmp);
|
|
36
|
+
#endif
|
|
37
|
+
}
|