rdo-postgres 0.0.10 → 0.0.11
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/README.md +89 -46
- data/ext/rdo_postgres/params.c +11 -4
- data/lib/rdo/postgres/version.rb +1 -1
- metadata +3 -3
data/README.md
CHANGED
@@ -5,11 +5,14 @@ This is the PostgreSQL driver for [RDO—Ruby Data Objects]
|
|
5
5
|
|
6
6
|
[](http://travis-ci.org/d11wtq/rdo-postgres)
|
7
7
|
|
8
|
-
Refer to the RDO project
|
9
|
-
information.
|
8
|
+
Refer to the [RDO project README](https://github.com/d11wtq/rdo) for full
|
9
|
+
usage information.
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
## Supported PostgreSQL version
|
12
|
+
|
13
|
+
This driver supports PostgreSQL versions >= 7.4.
|
14
|
+
|
15
|
+
Older versions are no longer supported by PostgreSQL in any case.
|
13
16
|
|
14
17
|
## Installation
|
15
18
|
|
@@ -27,56 +30,87 @@ And install with Bundler:
|
|
27
30
|
|
28
31
|
## Usage
|
29
32
|
|
30
|
-
The registered URI schemes are postgres:// and
|
33
|
+
The registered URI schemes are postgres://, postgresql:// and psql://.
|
31
34
|
|
32
35
|
``` ruby
|
33
|
-
require "rdo"
|
34
36
|
require "rdo-postgres"
|
35
37
|
|
36
38
|
conn = RDO.connect("postgres://user:pass@localhost/dbname?encoding=utf-8")
|
37
39
|
```
|
38
40
|
|
39
|
-
Alternatively, give the driver name as "postgres" or "postgresql" in an
|
40
|
-
options Hash.
|
41
|
-
|
42
|
-
``` ruby
|
43
|
-
conn = RDO.connect(
|
44
|
-
driver: "postgresql",
|
45
|
-
host: "localhost",
|
46
|
-
user: "user",
|
47
|
-
passsword: "pass",
|
48
|
-
database: "dbname",
|
49
|
-
encoding: "utf-8"
|
50
|
-
)
|
51
|
-
```
|
52
|
-
|
53
41
|
### Type Support
|
54
42
|
|
55
43
|
If not listed below, the String form of the value will be returned. The
|
56
|
-
currently mapped types are:
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
44
|
+
currently mapped types are tabled below:
|
45
|
+
|
46
|
+
<table>
|
47
|
+
<thead>
|
48
|
+
<tr>
|
49
|
+
<th>PostgreSQL Type</th>
|
50
|
+
<th>Ruby Type</th>
|
51
|
+
<th>Notes</th>
|
52
|
+
</tr>
|
53
|
+
</thead>
|
54
|
+
<tbody>
|
55
|
+
<tr>
|
56
|
+
<th>null</th>
|
57
|
+
<td>NilClass</td>
|
58
|
+
<td></td>
|
59
|
+
</tr>
|
60
|
+
<tr>
|
61
|
+
<th>boolean</th>
|
62
|
+
<td>TrueClass, FalseClass</td>
|
63
|
+
<td>The strings 't' and 'f' will work as inputs too</td>
|
64
|
+
</tr>
|
65
|
+
<tr>
|
66
|
+
<th>text, char, varchar</th>
|
67
|
+
<td>String</td>
|
68
|
+
<td>The encoding specified on the connection is used</td>
|
69
|
+
</tr>
|
70
|
+
<tr>
|
71
|
+
<th>bytea</th>
|
72
|
+
<td>String</td>
|
73
|
+
<td>The output encoding is set to ASCII-8BIT/BINARY</td>
|
74
|
+
</tr>
|
75
|
+
<tr>
|
76
|
+
<th>integer, int4, int2, int8</th>
|
77
|
+
<td>Fixnum</td>
|
78
|
+
<td>Ruby may use a Bignum, if needed</td>
|
79
|
+
</tr>
|
80
|
+
<tr>
|
81
|
+
<th>float, real, float4, float8</th>
|
82
|
+
<td>Float</td>
|
83
|
+
<td>NaN, Infinity and -Infinity are supported</td>
|
84
|
+
</tr>
|
85
|
+
<tr>
|
86
|
+
<th>numeric, decimal</th>
|
87
|
+
<td>BigDecimal</td>
|
88
|
+
<td>NaN is supported</td>
|
89
|
+
</tr>
|
90
|
+
<tr>
|
91
|
+
<th>date</th>
|
92
|
+
<td>Date</td>
|
93
|
+
<td></td>
|
94
|
+
</tr>
|
95
|
+
<tr>
|
96
|
+
<th>timestamp</th>
|
97
|
+
<td>DateTime</td>
|
98
|
+
<td>Input may also be a Time; output times are in the system time zone</td>
|
99
|
+
</tr>
|
100
|
+
<tr>
|
101
|
+
<th>timestamp with time zone</th>
|
102
|
+
<td>DateTime</td>
|
103
|
+
<td>Input may also be a Time</td>
|
104
|
+
</tr>
|
105
|
+
<tr>
|
106
|
+
<th>array</th>
|
107
|
+
<td>Array</td>
|
108
|
+
<td>n-dimensional arrays of the types listed above are supported</td>
|
109
|
+
</tr>
|
110
|
+
</tbody>
|
111
|
+
</table>
|
112
|
+
|
113
|
+
### PostgreSQL style bind parameters
|
80
114
|
|
81
115
|
PostgreSQL uses $1, $2 etc for bind parameters. RDO uses '?'. You can use
|
82
116
|
either, but you **cannot** mix both styles in the same query, or you will
|
@@ -95,6 +129,16 @@ This is **not ok**:
|
|
95
129
|
conn.execute("SELECT * FROM users WHERE banned = $1 AND created_at > ?", true, 1.week.ago)
|
96
130
|
```
|
97
131
|
|
132
|
+
### HStore Operators
|
133
|
+
|
134
|
+
Some of the hstore operators in PostgreSQL use the '?' character. If you need
|
135
|
+
to use them, for now, you need to escape the '?' so RDO doesn't confuse them
|
136
|
+
for bind markers. I'd like to remove this restriction.
|
137
|
+
|
138
|
+
``` ruby
|
139
|
+
conn.execute(%q{SELECT 'foo=>42,bar=>101'::hstore \? ?}, "foo")
|
140
|
+
```
|
141
|
+
|
98
142
|
## Contributing
|
99
143
|
|
100
144
|
If you find any bugs, please send a pull request if you think you can
|
@@ -105,8 +149,7 @@ custom types, such as ENUMs (this is done by reading from pg_type, in an
|
|
105
149
|
efficient manner).
|
106
150
|
|
107
151
|
When sending pull requests, please use topic branches—don't send a pull
|
108
|
-
request from the master branch of your fork
|
109
|
-
unintentionally.
|
152
|
+
request from the master branch of your fork.
|
110
153
|
|
111
154
|
Contributors will be credited in this README.
|
112
155
|
|
data/ext/rdo_postgres/params.c
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#include <math.h>
|
12
12
|
|
13
13
|
/** Get the strlen of the marker (e.g. $2) based on its index */
|
14
|
-
#define RDO_PG_MARKER_LEN(n) (n
|
14
|
+
#define RDO_PG_MARKER_LEN(n) (n > 0 ? (int) floor(log10(n)) + 2 : 2)
|
15
15
|
|
16
16
|
/**
|
17
17
|
* Replace e.g. "SELECT ? WHERE ?" with "SELECT $1 WHERE $2".
|
@@ -22,7 +22,7 @@
|
|
22
22
|
*/
|
23
23
|
char * rdo_postgres_params_inject_markers(char * stmt) {
|
24
24
|
int len = strlen(stmt);
|
25
|
-
char * buf = malloc(sizeof(char) * len ? (len * (floor(
|
25
|
+
char * buf = malloc(sizeof(char) * len ? (len * (floor(log10(len)) + 2)) : 0);
|
26
26
|
char * s = stmt;
|
27
27
|
char * b = buf;
|
28
28
|
int n = 0;
|
@@ -78,6 +78,13 @@ char * rdo_postgres_params_inject_markers(char * stmt) {
|
|
78
78
|
}
|
79
79
|
break;
|
80
80
|
|
81
|
+
case '\\':
|
82
|
+
if (!instr && !inident && !inmlcmt && !inslcmt && *(s + 1) == '?')
|
83
|
+
++s;
|
84
|
+
|
85
|
+
*b = *s;
|
86
|
+
break;
|
87
|
+
|
81
88
|
case '"':
|
82
89
|
if (!instr && !inmlcmt && !inslcmt) {
|
83
90
|
inident = !inident;
|
@@ -90,9 +97,9 @@ char * rdo_postgres_params_inject_markers(char * stmt) {
|
|
90
97
|
case '?':
|
91
98
|
if (!instr && !inident && !inmlcmt && !inslcmt) {
|
92
99
|
sprintf(b, "$%i", ++n);
|
93
|
-
b += RDO_PG_MARKER_LEN(n
|
100
|
+
b += RDO_PG_MARKER_LEN(n) - 1;
|
94
101
|
} else {
|
95
|
-
*b= *s;
|
102
|
+
*b = *s;
|
96
103
|
}
|
97
104
|
break;
|
98
105
|
|
data/lib/rdo/postgres/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdo-postgres
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdo
|
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
138
|
version: '0'
|
139
139
|
requirements: []
|
140
140
|
rubyforge_project:
|
141
|
-
rubygems_version: 1.8.
|
141
|
+
rubygems_version: 1.8.24
|
142
142
|
signing_key:
|
143
143
|
specification_version: 3
|
144
144
|
summary: PostgreSQL Driver for RDO
|