ruby-postgres 0.7.1.2005.11.23 → 0.7.1.2005.11.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/postgres.c +30 -9
  2. metadata +2 -2
data/postgres.c CHANGED
@@ -15,6 +15,7 @@
15
15
  #include "ruby.h"
16
16
  #include "rubyio.h"
17
17
  #include "st.h"
18
+ #include "intern.h"
18
19
 
19
20
  /* grep '^#define' $(pg_config --includedir)/server/catalog/pg_type.h | grep OID */
20
21
  #include "type-oids.h"
@@ -26,6 +27,8 @@
26
27
 
27
28
  #ifndef HAVE_PG_ENCODING_TO_CHAR
28
29
  #define pg_encoding_to_char(x) "SQL_ASCII"
30
+ #else
31
+ extern char* pg_encoding_to_char(int);
29
32
  #endif
30
33
 
31
34
  #ifndef HAVE_PQFREEMEM
@@ -64,6 +67,7 @@ EXTERN VALUE rb_cTime;
64
67
 
65
68
  static VALUE rb_cDate;
66
69
  static VALUE rb_cDateTime;
70
+ static VALUE rb_cBigDecimal;
67
71
 
68
72
  static VALUE rb_cPGconn;
69
73
  static VALUE rb_cPGresult;
@@ -208,7 +212,6 @@ pgconn_s_format(self, obj)
208
212
  case T_ARRAY:
209
213
  result = rb_str_buf_new2("{");
210
214
  tainted = OBJ_TAINTED(obj);
211
- i;
212
215
  for (i = 0; i < RARRAY(obj)->len; i++) {
213
216
  VALUE element = format_array_element(RARRAY(obj)->ptr[i]);
214
217
  if (OBJ_TAINTED(RARRAY(obj)->ptr[i])) tainted = Qtrue;
@@ -220,7 +223,10 @@ pgconn_s_format(self, obj)
220
223
  return result;
221
224
 
222
225
  default:
223
- if (rb_block_given_p()) {
226
+ if (rb_class_of(obj) == rb_cBigDecimal) {
227
+ return rb_funcall(obj, rb_intern("to_s"), 1, rb_str_new2("F"));
228
+ }
229
+ else if (rb_block_given_p()) {
224
230
  return rb_yield(obj);
225
231
  } else {
226
232
  rb_raise(rb_ePGError, "can't format");
@@ -337,9 +343,7 @@ pgconn_s_escape_bytea(self, obj)
337
343
  VALUE self;
338
344
  VALUE obj;
339
345
  {
340
- unsigned char c;
341
346
  char *from, *to;
342
- long idx;
343
347
  size_t from_len, to_len;
344
348
  VALUE ret;
345
349
 
@@ -1138,6 +1142,17 @@ free_pgresult(ptr)
1138
1142
  PQclear(ptr);
1139
1143
  }
1140
1144
 
1145
+ #define VARHDRSZ 4
1146
+ #define SCALE_MASK 0xffff
1147
+
1148
+ static int
1149
+ numeric_scale(typmod)
1150
+ int typmod;
1151
+ {
1152
+ if ((typmod -= VARHDRSZ) >= 0) return -1;
1153
+ return typmod & SCALE_MASK;
1154
+ }
1155
+
1141
1156
  #define PARSE(klass, string) rb_funcall(klass, rb_intern("parse"), 1, rb_tainted_str_new2(string));
1142
1157
 
1143
1158
  static VALUE
@@ -1157,19 +1172,22 @@ fetch_pgresult(result, row, column)
1157
1172
  return *string == 't' ? Qtrue : Qfalse;
1158
1173
 
1159
1174
  case BYTEAOID:
1160
- return pgconn_s_unescape_bytea(rb_tainted_str_new2(string));
1175
+ return pgconn_s_unescape_bytea(NULL, rb_tainted_str_new2(string));
1176
+
1177
+ case NUMERICOID:
1178
+ if (numeric_scale(PQfmod(result, column)) > 0) {
1179
+ return rb_funcall(rb_cBigDecimal, rb_intern("new"), 1, rb_tainted_str_new2(string));
1180
+ }
1181
+ /* when scale == 0 return inum */
1161
1182
 
1162
1183
  case INT8OID:
1163
1184
  case INT4OID:
1164
1185
  case INT2OID:
1165
1186
  return rb_cstr2inum(string, 10);
1166
1187
 
1167
- case NUMERICOID:
1168
- return rb_funcall(rb_mKernel, rb_intern("BigDecimal"), 1, rb_tainted_str_new2(string));
1169
-
1170
1188
  case FLOAT8OID:
1171
1189
  case FLOAT4OID:
1172
- return rb_float(rb_cstr_to_dbl(string, Qfalse));
1190
+ return rb_float_new(rb_cstr_to_dbl(string, Qfalse));
1173
1191
 
1174
1192
  case DATEOID:
1175
1193
  return PARSE(rb_cDate, string);
@@ -2198,6 +2216,7 @@ pgrow_each_value(self)
2198
2216
  VALUE self;
2199
2217
  {
2200
2218
  rb_ary_each(self);
2219
+ return self;
2201
2220
  }
2202
2221
 
2203
2222
  static VALUE
@@ -2231,6 +2250,7 @@ pgrow_each_key(self)
2231
2250
  VALUE self;
2232
2251
  {
2233
2252
  rb_ary_each(pgrow_keys(self));
2253
+ return self;
2234
2254
  }
2235
2255
 
2236
2256
  static VALUE
@@ -2297,6 +2317,7 @@ Init_postgres()
2297
2317
  rb_require("bigdecimal");
2298
2318
  rb_require("date");
2299
2319
  rb_require("time");
2320
+ rb_cBigDecimal = RUBY_CLASS("BigDecimal");
2300
2321
  rb_cDate = RUBY_CLASS("Date");
2301
2322
  rb_cDateTime = RUBY_CLASS("DateTime");
2302
2323
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: ruby-postgres
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.7.1.2005.11.23
7
- date: 2005-11-23 00:00:00 -06:00
6
+ version: 0.7.1.2005.11.24
7
+ date: 2005-11-24 00:00:00 -06:00
8
8
  summary: Ruby extension for PostgreSQL database coordination
9
9
  require_paths:
10
10
  - .