-
Notifications
You must be signed in to change notification settings - Fork 92
/
decode.ts
186 lines (181 loc) · 4.76 KB
/
decode.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
import { Oid } from "./oid.ts";
import { Column, Format } from "./connection.ts";
import {
decodeBigint,
decodeBigintArray,
decodeBoolean,
decodeBooleanArray,
decodeBox,
decodeBoxArray,
decodeBytea,
decodeByteaArray,
decodeCircle,
decodeCircleArray,
decodeDate,
decodeDateArray,
decodeDatetime,
decodeDatetimeArray,
decodeInt,
decodeIntArray,
decodeJson,
decodeJsonArray,
decodeLine,
decodeLineArray,
decodeLineSegment,
decodeLineSegmentArray,
decodePath,
decodePathArray,
decodePoint,
decodePointArray,
decodePolygon,
decodePolygonArray,
decodeStringArray,
decodeTid,
decodeTidArray,
} from "./query/decoders.ts";
const decoder = new TextDecoder();
function decodeBinary() {
throw new Error("Not implemented!");
}
// deno-lint-ignore no-explicit-any
function decodeText(value: Uint8Array, typeOid: number): any {
const strValue = decoder.decode(value);
switch (typeOid) {
case Oid.bpchar:
case Oid.char:
case Oid.cidr:
case Oid.float4:
case Oid.float8:
case Oid.inet:
case Oid.macaddr:
case Oid.name:
case Oid.numeric:
case Oid.oid:
case Oid.regclass:
case Oid.regconfig:
case Oid.regdictionary:
case Oid.regnamespace:
case Oid.regoper:
case Oid.regoperator:
case Oid.regproc:
case Oid.regprocedure:
case Oid.regrole:
case Oid.regtype:
case Oid.text:
case Oid.time:
case Oid.timetz:
case Oid.uuid:
case Oid.varchar:
case Oid.void:
return strValue;
case Oid.bpchar_array:
case Oid.char_array:
case Oid.cidr_array:
case Oid.float4_array:
case Oid.float8_array:
case Oid.inet_array:
case Oid.macaddr_array:
case Oid.name_array:
case Oid.numeric_array:
case Oid.oid_array:
case Oid.regclass_array:
case Oid.regconfig_array:
case Oid.regdictionary_array:
case Oid.regnamespace_array:
case Oid.regoper_array:
case Oid.regoperator_array:
case Oid.regproc_array:
case Oid.regprocedure_array:
case Oid.regrole_array:
case Oid.regtype_array:
case Oid.text_array:
case Oid.time_array:
case Oid.timetz_array:
case Oid.uuid_varchar:
case Oid.varchar_array:
return decodeStringArray(strValue);
case Oid.int2:
case Oid.int4:
case Oid.xid:
return decodeInt(strValue);
case Oid.int2_array:
case Oid.int4_array:
case Oid.xid_array:
return decodeIntArray(strValue);
case Oid.bool:
return decodeBoolean(strValue);
case Oid.bool_array:
return decodeBooleanArray(strValue);
case Oid.box:
return decodeBox(strValue);
case Oid.box_array:
return decodeBoxArray(strValue);
case Oid.circle:
return decodeCircle(strValue);
case Oid.circle_array:
return decodeCircleArray(strValue);
case Oid.bytea:
return decodeBytea(strValue);
case Oid.byte_array:
return decodeByteaArray(strValue);
case Oid.date:
return decodeDate(strValue);
case Oid.date_array:
return decodeDateArray(strValue);
case Oid.int8:
return decodeBigint(strValue);
case Oid.int8_array:
return decodeBigintArray(strValue);
case Oid.json:
case Oid.jsonb:
return decodeJson(strValue);
case Oid.json_array:
case Oid.jsonb_array:
return decodeJsonArray(strValue);
case Oid.line:
return decodeLine(strValue);
case Oid.line_array:
return decodeLineArray(strValue);
case Oid.lseg:
return decodeLineSegment(strValue);
case Oid.lseg_array:
return decodeLineSegmentArray(strValue);
case Oid.path:
return decodePath(strValue);
case Oid.path_array:
return decodePathArray(strValue);
case Oid.point:
return decodePoint(strValue);
case Oid.point_array:
return decodePointArray(strValue);
case Oid.polygon:
return decodePolygon(strValue);
case Oid.polygon_array:
return decodePolygonArray(strValue);
case Oid.tid:
return decodeTid(strValue);
case Oid.tid_array:
return decodeTidArray(strValue);
case Oid.timestamp:
case Oid.timestamptz:
return decodeDatetime(strValue);
case Oid.timestamp_array:
case Oid.timestamptz_array:
return decodeDatetimeArray(strValue);
default:
// A separate category for not handled values
// They might or might not be represented correctly as strings,
// returning them to the user as raw strings allows them to parse
// them as they see fit
return strValue;
}
}
export function decode(value: Uint8Array, column: Column) {
if (column.format === Format.BINARY) {
return decodeBinary();
} else if (column.format === Format.TEXT) {
return decodeText(value, column.typeOid);
} else {
throw new Error(`Unknown column format: ${column.format}`);
}
}