Skip to main content

spin_world/
conversions.rs

1use super::*;
2
3mod rdbms_types {
4    use super::*;
5    use spin::mysql::mysql as mysql3;
6    use spin::postgres3_0_0::postgres as pg3;
7    use spin::postgres4_2_0::postgres as pg4;
8    use v2::mysql as mysql2;
9
10    impl From<v2::rdbms_types::Column> for v1::rdbms_types::Column {
11        fn from(value: v2::rdbms_types::Column) -> Self {
12            v1::rdbms_types::Column {
13                name: value.name,
14                data_type: value.data_type.into(),
15            }
16        }
17    }
18
19    impl From<pg4::Column> for v1::rdbms_types::Column {
20        fn from(value: pg4::Column) -> Self {
21            v1::rdbms_types::Column {
22                name: value.name,
23                data_type: value.data_type.into(),
24            }
25        }
26    }
27
28    impl From<pg4::Column> for v2::rdbms_types::Column {
29        fn from(value: pg4::Column) -> Self {
30            v2::rdbms_types::Column {
31                name: value.name,
32                data_type: value.data_type.into(),
33            }
34        }
35    }
36
37    impl From<pg4::Column> for pg3::Column {
38        fn from(value: pg4::Column) -> Self {
39            pg3::Column {
40                name: value.name,
41                data_type: value.data_type.into(),
42            }
43        }
44    }
45
46    impl From<v2::rdbms_types::DbValue> for v1::rdbms_types::DbValue {
47        fn from(value: v2::rdbms_types::DbValue) -> v1::rdbms_types::DbValue {
48            match value {
49                v2::rdbms_types::DbValue::Boolean(b) => v1::rdbms_types::DbValue::Boolean(b),
50                v2::rdbms_types::DbValue::Int8(i) => v1::rdbms_types::DbValue::Int8(i),
51                v2::rdbms_types::DbValue::Int16(i) => v1::rdbms_types::DbValue::Int16(i),
52                v2::rdbms_types::DbValue::Int32(i) => v1::rdbms_types::DbValue::Int32(i),
53                v2::rdbms_types::DbValue::Int64(i) => v1::rdbms_types::DbValue::Int64(i),
54                v2::rdbms_types::DbValue::Uint8(j) => v1::rdbms_types::DbValue::Uint8(j),
55                v2::rdbms_types::DbValue::Uint16(u) => v1::rdbms_types::DbValue::Uint16(u),
56                v2::rdbms_types::DbValue::Uint32(u) => v1::rdbms_types::DbValue::Uint32(u),
57                v2::rdbms_types::DbValue::Uint64(u) => v1::rdbms_types::DbValue::Uint64(u),
58                v2::rdbms_types::DbValue::Floating32(r) => v1::rdbms_types::DbValue::Floating32(r),
59                v2::rdbms_types::DbValue::Floating64(r) => v1::rdbms_types::DbValue::Floating64(r),
60                v2::rdbms_types::DbValue::Str(s) => v1::rdbms_types::DbValue::Str(s),
61                v2::rdbms_types::DbValue::Binary(b) => v1::rdbms_types::DbValue::Binary(b),
62                v2::rdbms_types::DbValue::DbNull => v1::rdbms_types::DbValue::DbNull,
63                v2::rdbms_types::DbValue::Unsupported => v1::rdbms_types::DbValue::Unsupported,
64            }
65        }
66    }
67
68    impl From<pg4::DbValue> for v1::rdbms_types::DbValue {
69        fn from(value: pg4::DbValue) -> v1::rdbms_types::DbValue {
70            match value {
71                pg4::DbValue::Boolean(b) => v1::rdbms_types::DbValue::Boolean(b),
72                pg4::DbValue::Int8(i) => v1::rdbms_types::DbValue::Int8(i),
73                pg4::DbValue::Int16(i) => v1::rdbms_types::DbValue::Int16(i),
74                pg4::DbValue::Int32(i) => v1::rdbms_types::DbValue::Int32(i),
75                pg4::DbValue::Int64(i) => v1::rdbms_types::DbValue::Int64(i),
76                pg4::DbValue::Floating32(r) => v1::rdbms_types::DbValue::Floating32(r),
77                pg4::DbValue::Floating64(r) => v1::rdbms_types::DbValue::Floating64(r),
78                pg4::DbValue::Str(s) => v1::rdbms_types::DbValue::Str(s),
79                pg4::DbValue::Binary(b) => v1::rdbms_types::DbValue::Binary(b),
80                pg4::DbValue::DbNull => v1::rdbms_types::DbValue::DbNull,
81                pg4::DbValue::Unsupported(_) => v1::rdbms_types::DbValue::Unsupported,
82                _ => v1::rdbms_types::DbValue::Unsupported,
83            }
84        }
85    }
86
87    impl From<pg4::DbValue> for v2::rdbms_types::DbValue {
88        fn from(value: pg4::DbValue) -> v2::rdbms_types::DbValue {
89            match value {
90                pg4::DbValue::Boolean(b) => v2::rdbms_types::DbValue::Boolean(b),
91                pg4::DbValue::Int8(i) => v2::rdbms_types::DbValue::Int8(i),
92                pg4::DbValue::Int16(i) => v2::rdbms_types::DbValue::Int16(i),
93                pg4::DbValue::Int32(i) => v2::rdbms_types::DbValue::Int32(i),
94                pg4::DbValue::Int64(i) => v2::rdbms_types::DbValue::Int64(i),
95                pg4::DbValue::Floating32(r) => v2::rdbms_types::DbValue::Floating32(r),
96                pg4::DbValue::Floating64(r) => v2::rdbms_types::DbValue::Floating64(r),
97                pg4::DbValue::Str(s) => v2::rdbms_types::DbValue::Str(s),
98                pg4::DbValue::Binary(b) => v2::rdbms_types::DbValue::Binary(b),
99                pg4::DbValue::DbNull => v2::rdbms_types::DbValue::DbNull,
100                pg4::DbValue::Unsupported(_) => v2::rdbms_types::DbValue::Unsupported,
101                _ => v2::rdbms_types::DbValue::Unsupported,
102            }
103        }
104    }
105
106    impl From<pg4::DbValue> for pg3::DbValue {
107        fn from(value: pg4::DbValue) -> pg3::DbValue {
108            match value {
109                pg4::DbValue::Boolean(b) => pg3::DbValue::Boolean(b),
110                pg4::DbValue::Int8(i) => pg3::DbValue::Int8(i),
111                pg4::DbValue::Int16(i) => pg3::DbValue::Int16(i),
112                pg4::DbValue::Int32(i) => pg3::DbValue::Int32(i),
113                pg4::DbValue::Int64(i) => pg3::DbValue::Int64(i),
114                pg4::DbValue::Floating32(r) => pg3::DbValue::Floating32(r),
115                pg4::DbValue::Floating64(r) => pg3::DbValue::Floating64(r),
116                pg4::DbValue::Str(s) => pg3::DbValue::Str(s),
117                pg4::DbValue::Binary(b) => pg3::DbValue::Binary(b),
118                pg4::DbValue::Date(d) => pg3::DbValue::Date(d),
119                pg4::DbValue::Datetime(dt) => pg3::DbValue::Datetime(dt),
120                pg4::DbValue::Time(t) => pg3::DbValue::Time(t),
121                pg4::DbValue::Timestamp(t) => pg3::DbValue::Timestamp(t),
122                pg4::DbValue::Uuid(_) => pg3::DbValue::Unsupported,
123                pg4::DbValue::Jsonb(_) => pg3::DbValue::Unsupported,
124                pg4::DbValue::Decimal(_) => pg3::DbValue::Unsupported,
125                pg4::DbValue::RangeInt32(_) => pg3::DbValue::Unsupported,
126                pg4::DbValue::RangeInt64(_) => pg3::DbValue::Unsupported,
127                pg4::DbValue::RangeDecimal(_) => pg3::DbValue::Unsupported,
128                pg4::DbValue::ArrayInt32(_) => pg3::DbValue::Unsupported,
129                pg4::DbValue::ArrayInt64(_) => pg3::DbValue::Unsupported,
130                pg4::DbValue::ArrayDecimal(_) => pg3::DbValue::Unsupported,
131                pg4::DbValue::ArrayStr(_) => pg3::DbValue::Unsupported,
132                pg4::DbValue::Interval(_) => pg3::DbValue::Unsupported,
133                pg4::DbValue::DbNull => pg3::DbValue::DbNull,
134                pg4::DbValue::Unsupported(_) => pg3::DbValue::Unsupported,
135            }
136        }
137    }
138
139    impl From<pg4::DbDataType> for v1::rdbms_types::DbDataType {
140        fn from(value: pg4::DbDataType) -> v1::rdbms_types::DbDataType {
141            match value {
142                pg4::DbDataType::Boolean => v1::rdbms_types::DbDataType::Boolean,
143                pg4::DbDataType::Int8 => v1::rdbms_types::DbDataType::Int8,
144                pg4::DbDataType::Int16 => v1::rdbms_types::DbDataType::Int16,
145                pg4::DbDataType::Int32 => v1::rdbms_types::DbDataType::Int32,
146                pg4::DbDataType::Int64 => v1::rdbms_types::DbDataType::Int64,
147                pg4::DbDataType::Floating32 => v1::rdbms_types::DbDataType::Floating32,
148                pg4::DbDataType::Floating64 => v1::rdbms_types::DbDataType::Floating64,
149                pg4::DbDataType::Str => v1::rdbms_types::DbDataType::Str,
150                pg4::DbDataType::Binary => v1::rdbms_types::DbDataType::Binary,
151                pg4::DbDataType::Other(_) => v1::rdbms_types::DbDataType::Other,
152                _ => v1::rdbms_types::DbDataType::Other,
153            }
154        }
155    }
156
157    impl From<pg4::DbDataType> for v2::rdbms_types::DbDataType {
158        fn from(value: pg4::DbDataType) -> v2::rdbms_types::DbDataType {
159            match value {
160                pg4::DbDataType::Boolean => v2::rdbms_types::DbDataType::Boolean,
161                pg4::DbDataType::Int8 => v2::rdbms_types::DbDataType::Int8,
162                pg4::DbDataType::Int16 => v2::rdbms_types::DbDataType::Int16,
163                pg4::DbDataType::Int32 => v2::rdbms_types::DbDataType::Int32,
164                pg4::DbDataType::Int64 => v2::rdbms_types::DbDataType::Int64,
165                pg4::DbDataType::Floating32 => v2::rdbms_types::DbDataType::Floating32,
166                pg4::DbDataType::Floating64 => v2::rdbms_types::DbDataType::Floating64,
167                pg4::DbDataType::Str => v2::rdbms_types::DbDataType::Str,
168                pg4::DbDataType::Binary => v2::rdbms_types::DbDataType::Binary,
169                pg4::DbDataType::Other(_) => v2::rdbms_types::DbDataType::Other,
170                _ => v2::rdbms_types::DbDataType::Other,
171            }
172        }
173    }
174
175    impl From<pg4::DbDataType> for pg3::DbDataType {
176        fn from(value: pg4::DbDataType) -> pg3::DbDataType {
177            match value {
178                pg4::DbDataType::Boolean => pg3::DbDataType::Boolean,
179                pg4::DbDataType::Int8 => pg3::DbDataType::Int8,
180                pg4::DbDataType::Int16 => pg3::DbDataType::Int16,
181                pg4::DbDataType::Int32 => pg3::DbDataType::Int32,
182                pg4::DbDataType::Int64 => pg3::DbDataType::Int64,
183                pg4::DbDataType::Floating32 => pg3::DbDataType::Floating32,
184                pg4::DbDataType::Floating64 => pg3::DbDataType::Floating64,
185                pg4::DbDataType::Str => pg3::DbDataType::Str,
186                pg4::DbDataType::Binary => pg3::DbDataType::Binary,
187                pg4::DbDataType::Date => pg3::DbDataType::Date,
188                pg4::DbDataType::Datetime => pg3::DbDataType::Datetime,
189                pg4::DbDataType::Time => pg3::DbDataType::Time,
190                pg4::DbDataType::Timestamp => pg3::DbDataType::Timestamp,
191                pg4::DbDataType::Uuid => pg3::DbDataType::Other,
192                pg4::DbDataType::Jsonb => pg3::DbDataType::Other,
193                pg4::DbDataType::Decimal => pg3::DbDataType::Other,
194                pg4::DbDataType::RangeInt32 => pg3::DbDataType::Other,
195                pg4::DbDataType::RangeInt64 => pg3::DbDataType::Other,
196                pg4::DbDataType::RangeDecimal => pg3::DbDataType::Other,
197                pg4::DbDataType::ArrayInt32 => pg3::DbDataType::Other,
198                pg4::DbDataType::ArrayInt64 => pg3::DbDataType::Other,
199                pg4::DbDataType::ArrayDecimal => pg3::DbDataType::Other,
200                pg4::DbDataType::ArrayStr => pg3::DbDataType::Other,
201                pg4::DbDataType::Interval => pg3::DbDataType::Other,
202                pg4::DbDataType::Other(_) => pg3::DbDataType::Other,
203            }
204        }
205    }
206
207    impl From<v2::rdbms_types::DbDataType> for v1::rdbms_types::DbDataType {
208        fn from(value: v2::rdbms_types::DbDataType) -> v1::rdbms_types::DbDataType {
209            match value {
210                v2::rdbms_types::DbDataType::Boolean => v1::rdbms_types::DbDataType::Boolean,
211                v2::rdbms_types::DbDataType::Int8 => v1::rdbms_types::DbDataType::Int8,
212                v2::rdbms_types::DbDataType::Int16 => v1::rdbms_types::DbDataType::Int16,
213                v2::rdbms_types::DbDataType::Int32 => v1::rdbms_types::DbDataType::Int32,
214                v2::rdbms_types::DbDataType::Int64 => v1::rdbms_types::DbDataType::Int64,
215                v2::rdbms_types::DbDataType::Uint8 => v1::rdbms_types::DbDataType::Uint8,
216                v2::rdbms_types::DbDataType::Uint16 => v1::rdbms_types::DbDataType::Uint16,
217                v2::rdbms_types::DbDataType::Uint32 => v1::rdbms_types::DbDataType::Uint32,
218                v2::rdbms_types::DbDataType::Uint64 => v1::rdbms_types::DbDataType::Uint64,
219                v2::rdbms_types::DbDataType::Floating32 => v1::rdbms_types::DbDataType::Floating32,
220                v2::rdbms_types::DbDataType::Floating64 => v1::rdbms_types::DbDataType::Floating64,
221                v2::rdbms_types::DbDataType::Str => v1::rdbms_types::DbDataType::Str,
222                v2::rdbms_types::DbDataType::Binary => v1::rdbms_types::DbDataType::Binary,
223                v2::rdbms_types::DbDataType::Other => v1::rdbms_types::DbDataType::Other,
224            }
225        }
226    }
227
228    impl From<v1::rdbms_types::ParameterValue> for v2::rdbms_types::ParameterValue {
229        fn from(value: v1::rdbms_types::ParameterValue) -> v2::rdbms_types::ParameterValue {
230            match value {
231                v1::rdbms_types::ParameterValue::Boolean(b) => {
232                    v2::rdbms_types::ParameterValue::Boolean(b)
233                }
234                v1::rdbms_types::ParameterValue::Int8(i) => {
235                    v2::rdbms_types::ParameterValue::Int8(i)
236                }
237                v1::rdbms_types::ParameterValue::Int16(i) => {
238                    v2::rdbms_types::ParameterValue::Int16(i)
239                }
240                v1::rdbms_types::ParameterValue::Int32(i) => {
241                    v2::rdbms_types::ParameterValue::Int32(i)
242                }
243                v1::rdbms_types::ParameterValue::Int64(i) => {
244                    v2::rdbms_types::ParameterValue::Int64(i)
245                }
246                v1::rdbms_types::ParameterValue::Uint8(u) => {
247                    v2::rdbms_types::ParameterValue::Uint8(u)
248                }
249                v1::rdbms_types::ParameterValue::Uint16(u) => {
250                    v2::rdbms_types::ParameterValue::Uint16(u)
251                }
252                v1::rdbms_types::ParameterValue::Uint32(u) => {
253                    v2::rdbms_types::ParameterValue::Uint32(u)
254                }
255                v1::rdbms_types::ParameterValue::Uint64(u) => {
256                    v2::rdbms_types::ParameterValue::Uint64(u)
257                }
258                v1::rdbms_types::ParameterValue::Floating32(r) => {
259                    v2::rdbms_types::ParameterValue::Floating32(r)
260                }
261                v1::rdbms_types::ParameterValue::Floating64(r) => {
262                    v2::rdbms_types::ParameterValue::Floating64(r)
263                }
264                v1::rdbms_types::ParameterValue::Str(s) => v2::rdbms_types::ParameterValue::Str(s),
265                v1::rdbms_types::ParameterValue::Binary(b) => {
266                    v2::rdbms_types::ParameterValue::Binary(b)
267                }
268                v1::rdbms_types::ParameterValue::DbNull => v2::rdbms_types::ParameterValue::DbNull,
269            }
270        }
271    }
272
273    impl TryFrom<v1::rdbms_types::ParameterValue> for pg4::ParameterValue {
274        type Error = v1::postgres::PgError;
275
276        fn try_from(
277            value: v1::rdbms_types::ParameterValue,
278        ) -> Result<pg4::ParameterValue, Self::Error> {
279            let converted = match value {
280                v1::rdbms_types::ParameterValue::Boolean(b) => pg4::ParameterValue::Boolean(b),
281                v1::rdbms_types::ParameterValue::Int8(i) => pg4::ParameterValue::Int8(i),
282                v1::rdbms_types::ParameterValue::Int16(i) => pg4::ParameterValue::Int16(i),
283                v1::rdbms_types::ParameterValue::Int32(i) => pg4::ParameterValue::Int32(i),
284                v1::rdbms_types::ParameterValue::Int64(i) => pg4::ParameterValue::Int64(i),
285                v1::rdbms_types::ParameterValue::Uint8(_)
286                | v1::rdbms_types::ParameterValue::Uint16(_)
287                | v1::rdbms_types::ParameterValue::Uint32(_)
288                | v1::rdbms_types::ParameterValue::Uint64(_) => {
289                    return Err(v1::postgres::PgError::ValueConversionFailed(
290                        "Postgres does not support unsigned integers".to_owned(),
291                    ));
292                }
293                v1::rdbms_types::ParameterValue::Floating32(r) => {
294                    pg4::ParameterValue::Floating32(r)
295                }
296                v1::rdbms_types::ParameterValue::Floating64(r) => {
297                    pg4::ParameterValue::Floating64(r)
298                }
299                v1::rdbms_types::ParameterValue::Str(s) => pg4::ParameterValue::Str(s),
300                v1::rdbms_types::ParameterValue::Binary(b) => pg4::ParameterValue::Binary(b),
301                v1::rdbms_types::ParameterValue::DbNull => pg4::ParameterValue::DbNull,
302            };
303            Ok(converted)
304        }
305    }
306
307    impl TryFrom<v2::rdbms_types::ParameterValue> for pg4::ParameterValue {
308        type Error = v2::rdbms_types::Error;
309
310        fn try_from(
311            value: v2::rdbms_types::ParameterValue,
312        ) -> Result<pg4::ParameterValue, Self::Error> {
313            let converted = match value {
314                v2::rdbms_types::ParameterValue::Boolean(b) => pg4::ParameterValue::Boolean(b),
315                v2::rdbms_types::ParameterValue::Int8(i) => pg4::ParameterValue::Int8(i),
316                v2::rdbms_types::ParameterValue::Int16(i) => pg4::ParameterValue::Int16(i),
317                v2::rdbms_types::ParameterValue::Int32(i) => pg4::ParameterValue::Int32(i),
318                v2::rdbms_types::ParameterValue::Int64(i) => pg4::ParameterValue::Int64(i),
319                v2::rdbms_types::ParameterValue::Uint8(_)
320                | v2::rdbms_types::ParameterValue::Uint16(_)
321                | v2::rdbms_types::ParameterValue::Uint32(_)
322                | v2::rdbms_types::ParameterValue::Uint64(_) => {
323                    return Err(v2::rdbms_types::Error::ValueConversionFailed(
324                        "Postgres does not support unsigned integers".to_owned(),
325                    ));
326                }
327                v2::rdbms_types::ParameterValue::Floating32(r) => {
328                    pg4::ParameterValue::Floating32(r)
329                }
330                v2::rdbms_types::ParameterValue::Floating64(r) => {
331                    pg4::ParameterValue::Floating64(r)
332                }
333                v2::rdbms_types::ParameterValue::Str(s) => pg4::ParameterValue::Str(s),
334                v2::rdbms_types::ParameterValue::Binary(b) => pg4::ParameterValue::Binary(b),
335                v2::rdbms_types::ParameterValue::DbNull => pg4::ParameterValue::DbNull,
336            };
337            Ok(converted)
338        }
339    }
340
341    impl From<pg3::ParameterValue> for pg4::ParameterValue {
342        fn from(value: pg3::ParameterValue) -> pg4::ParameterValue {
343            match value {
344                pg3::ParameterValue::Boolean(b) => pg4::ParameterValue::Boolean(b),
345                pg3::ParameterValue::Int8(i) => pg4::ParameterValue::Int8(i),
346                pg3::ParameterValue::Int16(i) => pg4::ParameterValue::Int16(i),
347                pg3::ParameterValue::Int32(i) => pg4::ParameterValue::Int32(i),
348                pg3::ParameterValue::Int64(i) => pg4::ParameterValue::Int64(i),
349                pg3::ParameterValue::Floating32(r) => pg4::ParameterValue::Floating32(r),
350                pg3::ParameterValue::Floating64(r) => pg4::ParameterValue::Floating64(r),
351                pg3::ParameterValue::Str(s) => pg4::ParameterValue::Str(s),
352                pg3::ParameterValue::Binary(b) => pg4::ParameterValue::Binary(b),
353                pg3::ParameterValue::Date(d) => pg4::ParameterValue::Date(d),
354                pg3::ParameterValue::Datetime(dt) => pg4::ParameterValue::Datetime(dt),
355                pg3::ParameterValue::Time(t) => pg4::ParameterValue::Time(t),
356                pg3::ParameterValue::Timestamp(t) => pg4::ParameterValue::Timestamp(t),
357                pg3::ParameterValue::DbNull => pg4::ParameterValue::DbNull,
358            }
359        }
360    }
361
362    impl From<v2::rdbms_types::Error> for v1::mysql::MysqlError {
363        fn from(error: v2::rdbms_types::Error) -> v1::mysql::MysqlError {
364            match error {
365                v2::mysql::Error::ConnectionFailed(e) => v1::mysql::MysqlError::ConnectionFailed(e),
366                v2::mysql::Error::BadParameter(e) => v1::mysql::MysqlError::BadParameter(e),
367                v2::mysql::Error::QueryFailed(e) => v1::mysql::MysqlError::QueryFailed(e),
368                v2::mysql::Error::ValueConversionFailed(e) => {
369                    v1::mysql::MysqlError::ValueConversionFailed(e)
370                }
371                v2::mysql::Error::Other(e) => v1::mysql::MysqlError::OtherError(e),
372            }
373        }
374    }
375
376    impl From<pg4::Error> for v1::postgres::PgError {
377        fn from(error: pg4::Error) -> v1::postgres::PgError {
378            match error {
379                pg4::Error::ConnectionFailed(e) => v1::postgres::PgError::ConnectionFailed(e),
380                pg4::Error::BadParameter(e) => v1::postgres::PgError::BadParameter(e),
381                pg4::Error::QueryFailed(e) => v1::postgres::PgError::QueryFailed(pg_error_text(e)),
382                pg4::Error::ValueConversionFailed(e) => {
383                    v1::postgres::PgError::ValueConversionFailed(e)
384                }
385                pg4::Error::Other(e) => v1::postgres::PgError::OtherError(e),
386            }
387        }
388    }
389
390    impl From<pg4::Error> for v2::rdbms_types::Error {
391        fn from(error: pg4::Error) -> v2::rdbms_types::Error {
392            match error {
393                pg4::Error::ConnectionFailed(e) => v2::rdbms_types::Error::ConnectionFailed(e),
394                pg4::Error::BadParameter(e) => v2::rdbms_types::Error::BadParameter(e),
395                pg4::Error::QueryFailed(e) => v2::rdbms_types::Error::QueryFailed(pg_error_text(e)),
396                pg4::Error::ValueConversionFailed(e) => {
397                    v2::rdbms_types::Error::ValueConversionFailed(e)
398                }
399                pg4::Error::Other(e) => v2::rdbms_types::Error::Other(e),
400            }
401        }
402    }
403
404    impl From<pg4::Error> for pg3::Error {
405        fn from(error: pg4::Error) -> pg3::Error {
406            match error {
407                pg4::Error::ConnectionFailed(e) => pg3::Error::ConnectionFailed(e),
408                pg4::Error::BadParameter(e) => pg3::Error::BadParameter(e),
409                pg4::Error::QueryFailed(e) => pg3::Error::QueryFailed(pg_error_text(e)),
410                pg4::Error::ValueConversionFailed(e) => pg3::Error::ValueConversionFailed(e),
411                pg4::Error::Other(e) => pg3::Error::Other(e),
412            }
413        }
414    }
415
416    impl From<v2::rdbms_types::Column> for mysql3::Column {
417        fn from(column: v2::rdbms_types::Column) -> Self {
418            Self {
419                name: column.name,
420                data_type: column.data_type.into(),
421            }
422        }
423    }
424
425    impl From<v2::rdbms_types::DbDataType> for mysql3::DbDataType {
426        fn from(ty: v2::rdbms_types::DbDataType) -> Self {
427            match ty {
428                v2::rdbms_types::DbDataType::Boolean => Self::Boolean,
429                v2::rdbms_types::DbDataType::Int8 => Self::Int8,
430                v2::rdbms_types::DbDataType::Int16 => Self::Int16,
431                v2::rdbms_types::DbDataType::Int32 => Self::Int32,
432                v2::rdbms_types::DbDataType::Int64 => Self::Int64,
433                v2::rdbms_types::DbDataType::Uint8 => Self::Uint8,
434                v2::rdbms_types::DbDataType::Uint16 => Self::Uint16,
435                v2::rdbms_types::DbDataType::Uint32 => Self::Uint32,
436                v2::rdbms_types::DbDataType::Uint64 => Self::Uint64,
437                v2::rdbms_types::DbDataType::Floating32 => Self::Floating32,
438                v2::rdbms_types::DbDataType::Floating64 => Self::Floating64,
439                v2::rdbms_types::DbDataType::Str => Self::Str,
440                v2::rdbms_types::DbDataType::Binary => Self::Binary,
441                v2::rdbms_types::DbDataType::Other => Self::Other,
442            }
443        }
444    }
445
446    impl From<v2::rdbms_types::DbValue> for mysql3::DbValue {
447        fn from(ty: v2::rdbms_types::DbValue) -> Self {
448            match ty {
449                v2::rdbms_types::DbValue::Boolean(v) => Self::Boolean(v),
450                v2::rdbms_types::DbValue::Int8(v) => Self::Int8(v),
451                v2::rdbms_types::DbValue::Int16(v) => Self::Int16(v),
452                v2::rdbms_types::DbValue::Int32(v) => Self::Int32(v),
453                v2::rdbms_types::DbValue::Int64(v) => Self::Int64(v),
454                v2::rdbms_types::DbValue::Uint8(v) => Self::Uint8(v),
455                v2::rdbms_types::DbValue::Uint16(v) => Self::Uint16(v),
456                v2::rdbms_types::DbValue::Uint32(v) => Self::Uint32(v),
457                v2::rdbms_types::DbValue::Uint64(v) => Self::Uint64(v),
458                v2::rdbms_types::DbValue::Floating32(v) => Self::Floating32(v),
459                v2::rdbms_types::DbValue::Floating64(v) => Self::Floating64(v),
460                v2::rdbms_types::DbValue::Str(v) => Self::Str(v),
461                v2::rdbms_types::DbValue::Binary(v) => Self::Binary(v),
462                v2::rdbms_types::DbValue::DbNull => Self::DbNull,
463                v2::rdbms_types::DbValue::Unsupported => Self::Unsupported,
464            }
465        }
466    }
467
468    impl From<mysql2::Error> for mysql3::Error {
469        fn from(error: mysql2::Error) -> Self {
470            match error {
471                mysql2::Error::ConnectionFailed(v) => Self::ConnectionFailed(v),
472                mysql2::Error::BadParameter(v) => Self::BadParameter(v),
473                mysql2::Error::QueryFailed(v) => Self::QueryFailed(v),
474                mysql2::Error::ValueConversionFailed(v) => Self::ValueConversionFailed(v),
475                mysql2::Error::Other(v) => Self::Other(v),
476            }
477        }
478    }
479
480    impl From<mysql3::Error> for mysql2::Error {
481        fn from(error: mysql3::Error) -> Self {
482            match error {
483                mysql3::Error::ConnectionFailed(v) => Self::ConnectionFailed(v),
484                mysql3::Error::BadParameter(v) => Self::BadParameter(v),
485                mysql3::Error::QueryFailed(v) => Self::QueryFailed(v),
486                mysql3::Error::ValueConversionFailed(v) => Self::ValueConversionFailed(v),
487                mysql3::Error::Other(v) => Self::Other(v),
488            }
489        }
490    }
491
492    impl From<mysql3::ParameterValue> for mysql2::ParameterValue {
493        fn from(value: mysql3::ParameterValue) -> Self {
494            match value {
495                mysql3::ParameterValue::Boolean(v) => Self::Boolean(v),
496                mysql3::ParameterValue::Int8(v) => Self::Int8(v),
497                mysql3::ParameterValue::Int16(v) => Self::Int16(v),
498                mysql3::ParameterValue::Int32(v) => Self::Int32(v),
499                mysql3::ParameterValue::Int64(v) => Self::Int64(v),
500                mysql3::ParameterValue::Uint8(v) => Self::Uint8(v),
501                mysql3::ParameterValue::Uint16(v) => Self::Uint16(v),
502                mysql3::ParameterValue::Uint32(v) => Self::Uint32(v),
503                mysql3::ParameterValue::Uint64(v) => Self::Uint64(v),
504                mysql3::ParameterValue::Floating32(v) => Self::Floating32(v),
505                mysql3::ParameterValue::Floating64(v) => Self::Floating64(v),
506                mysql3::ParameterValue::Str(v) => Self::Str(v),
507                mysql3::ParameterValue::Binary(v) => Self::Binary(v),
508                mysql3::ParameterValue::DbNull => Self::DbNull,
509            }
510        }
511    }
512
513    pub fn pg_error_text(error: pg4::QueryError) -> String {
514        match error {
515            pg4::QueryError::Text(text) => text,
516            pg4::QueryError::DbError(e) => e.as_text,
517        }
518    }
519}
520
521mod postgres {
522    use super::*;
523    use spin::postgres3_0_0::postgres as pg3;
524    use spin::postgres4_2_0::postgres as pg4;
525
526    impl From<pg4::RowSet> for v1::postgres::RowSet {
527        fn from(value: pg4::RowSet) -> v1::postgres::RowSet {
528            v1::mysql::RowSet {
529                columns: value.columns.into_iter().map(Into::into).collect(),
530                rows: value
531                    .rows
532                    .into_iter()
533                    .map(|r| r.into_iter().map(Into::into).collect())
534                    .collect(),
535            }
536        }
537    }
538
539    impl From<pg4::RowSet> for v2::rdbms_types::RowSet {
540        fn from(value: pg4::RowSet) -> v2::rdbms_types::RowSet {
541            v2::rdbms_types::RowSet {
542                columns: value.columns.into_iter().map(Into::into).collect(),
543                rows: value
544                    .rows
545                    .into_iter()
546                    .map(|r| r.into_iter().map(Into::into).collect())
547                    .collect(),
548            }
549        }
550    }
551
552    impl From<pg4::RowSet> for pg3::RowSet {
553        fn from(value: pg4::RowSet) -> pg3::RowSet {
554            pg3::RowSet {
555                columns: value.columns.into_iter().map(Into::into).collect(),
556                rows: value
557                    .rows
558                    .into_iter()
559                    .map(|r| r.into_iter().map(Into::into).collect())
560                    .collect(),
561            }
562        }
563    }
564}
565
566mod mysql {
567    use super::*;
568    impl From<v2::mysql::RowSet> for v1::mysql::RowSet {
569        fn from(value: v2::mysql::RowSet) -> v1::mysql::RowSet {
570            v1::mysql::RowSet {
571                columns: value.columns.into_iter().map(Into::into).collect(),
572                rows: value
573                    .rows
574                    .into_iter()
575                    .map(|r| r.into_iter().map(Into::into).collect())
576                    .collect(),
577            }
578        }
579    }
580}
581
582mod redis {
583    use super::*;
584    use crate::spin::redis::redis as v3;
585
586    impl From<v1::redis::RedisParameter> for v2::redis::RedisParameter {
587        fn from(value: v1::redis::RedisParameter) -> Self {
588            match value {
589                v1::redis::RedisParameter::Int64(i) => v2::redis::RedisParameter::Int64(i),
590                v1::redis::RedisParameter::Binary(b) => v2::redis::RedisParameter::Binary(b),
591            }
592        }
593    }
594
595    impl From<v2::redis::RedisResult> for v1::redis::RedisResult {
596        fn from(value: v2::redis::RedisResult) -> Self {
597            match value {
598                v2::redis::RedisResult::Nil => v1::redis::RedisResult::Nil,
599                v2::redis::RedisResult::Status(s) => v1::redis::RedisResult::Status(s),
600                v2::redis::RedisResult::Int64(i) => v1::redis::RedisResult::Int64(i),
601                v2::redis::RedisResult::Binary(b) => v1::redis::RedisResult::Binary(b),
602            }
603        }
604    }
605
606    impl From<v3::Error> for v2::redis::Error {
607        fn from(value: v3::Error) -> Self {
608            match value {
609                v3::Error::InvalidAddress => Self::InvalidAddress,
610                v3::Error::TooManyConnections => Self::TooManyConnections,
611                v3::Error::TypeError => Self::TypeError,
612                v3::Error::Other(m) => Self::Other(m),
613            }
614        }
615    }
616}
617
618mod llm {
619    use super::*;
620
621    impl From<v1::llm::InferencingParams> for v2::llm::InferencingParams {
622        fn from(value: v1::llm::InferencingParams) -> Self {
623            Self {
624                max_tokens: value.max_tokens,
625                repeat_penalty: value.repeat_penalty,
626                repeat_penalty_last_n_token_count: value.repeat_penalty_last_n_token_count,
627                temperature: value.temperature,
628                top_k: value.top_k,
629                top_p: value.top_p,
630            }
631        }
632    }
633
634    impl From<v2::llm::InferencingResult> for v1::llm::InferencingResult {
635        fn from(value: v2::llm::InferencingResult) -> Self {
636            Self {
637                text: value.text,
638                usage: v1::llm::InferencingUsage {
639                    prompt_token_count: value.usage.prompt_token_count,
640                    generated_token_count: value.usage.generated_token_count,
641                },
642            }
643        }
644    }
645
646    impl From<v2::llm::EmbeddingsResult> for v1::llm::EmbeddingsResult {
647        fn from(value: v2::llm::EmbeddingsResult) -> Self {
648            Self {
649                embeddings: value.embeddings,
650                usage: v1::llm::EmbeddingsUsage {
651                    prompt_token_count: value.usage.prompt_token_count,
652                },
653            }
654        }
655    }
656
657    impl From<v2::llm::Error> for v1::llm::Error {
658        fn from(value: v2::llm::Error) -> Self {
659            match value {
660                v2::llm::Error::ModelNotSupported => Self::ModelNotSupported,
661                v2::llm::Error::RuntimeError(s) => Self::RuntimeError(s),
662                v2::llm::Error::InvalidInput(s) => Self::InvalidInput(s),
663            }
664        }
665    }
666}
667
668mod mqtt {
669    use crate::fermyon::spin2_0_0::mqtt as v2;
670    use crate::spin::mqtt::mqtt as v3;
671
672    impl From<v3::Error> for v2::Error {
673        fn from(value: v3::Error) -> Self {
674            match value {
675                v3::Error::InvalidAddress => v2::Error::InvalidAddress,
676                v3::Error::TooManyConnections => v2::Error::TooManyConnections,
677                v3::Error::ConnectionFailed(e) => v2::Error::ConnectionFailed(e),
678                v3::Error::Other(e) => v2::Error::Other(e),
679            }
680        }
681    }
682}