globegit-postgresql-plruby 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|