8
8
9
9
#include " duckdb.h"
10
10
11
+ // Conversion betweeen structs and objects
12
+
13
+ Napi::Object MakeDateObject (Napi::Env env, duckdb_date date) {
14
+ auto date_obj = Napi::Object::New (env);
15
+ date_obj.Set (" days" , Napi::Number::New (env, date.days ));
16
+ return date_obj;
17
+ }
18
+
19
+ duckdb_date GetDateFromObject (Napi::Object date_obj) {
20
+ auto days = date_obj.Get (" days" ).As <Napi::Number>().Int32Value ();
21
+ return { days };
22
+ }
23
+
24
+ Napi::Object MakeDatePartsObject (Napi::Env env, duckdb_date_struct date_parts) {
25
+ auto date_parts_obj = Napi::Object::New (env);
26
+ date_parts_obj.Set (" year" , Napi::Number::New (env, date_parts.year ));
27
+ date_parts_obj.Set (" month" , Napi::Number::New (env, date_parts.month ));
28
+ date_parts_obj.Set (" day" , Napi::Number::New (env, date_parts.day ));
29
+ return date_parts_obj;
30
+ }
31
+
32
+ duckdb_date_struct GetDatePartsFromObject (Napi::Object date_parts_obj) {
33
+ int32_t year = date_parts_obj.Get (" year" ).As <Napi::Number>().Int32Value ();
34
+ int8_t month = date_parts_obj.Get (" month" ).As <Napi::Number>().Int32Value ();
35
+ int8_t day = date_parts_obj.Get (" day" ).As <Napi::Number>().Int32Value ();
36
+ return { year, month, day };
37
+ }
38
+
39
+ Napi::Object MakeTimeObject (Napi::Env env, duckdb_time time) {
40
+ auto time_obj = Napi::Object::New (env);
41
+ time_obj.Set (" micros" , Napi::Number::New (env, time.micros ));
42
+ return time_obj;
43
+ }
44
+
45
+ duckdb_time GetTimeFromObject (Napi::Object time_obj) {
46
+ auto micros = time_obj.Get (" micros" ).As <Napi::Number>().Int64Value ();
47
+ return { micros };
48
+ }
49
+
50
+ Napi::Object MakeTimePartsObject (Napi::Env env, duckdb_time_struct time_parts) {
51
+ auto time_parts_obj = Napi::Object::New (env);
52
+ time_parts_obj.Set (" hour" , Napi::Number::New (env, time_parts.hour ));
53
+ time_parts_obj.Set (" min" , Napi::Number::New (env, time_parts.min ));
54
+ time_parts_obj.Set (" sec" , Napi::Number::New (env, time_parts.sec ));
55
+ time_parts_obj.Set (" micros" , Napi::Number::New (env, time_parts.micros ));
56
+ return time_parts_obj;
57
+ }
58
+
59
+ duckdb_time_struct GetTimePartsFromObject (Napi::Object time_parts_obj) {
60
+ int8_t hour = time_parts_obj.Get (" hour" ).As <Napi::Number>().Int32Value ();
61
+ int8_t min = time_parts_obj.Get (" min" ).As <Napi::Number>().Int32Value ();
62
+ int8_t sec = time_parts_obj.Get (" sec" ).As <Napi::Number>().Int32Value ();
63
+ int32_t micros = time_parts_obj.Get (" micros" ).As <Napi::Number>().Int32Value ();
64
+ return { hour, min, sec, micros };
65
+ }
66
+
67
+ Napi::Object MakeTimeTZObject (Napi::Env env, duckdb_time_tz time_tz) {
68
+ auto time_tz_obj = Napi::Object::New (env);
69
+ time_tz_obj.Set (" bits" , Napi::BigInt::New (env, time_tz.bits ));
70
+ return time_tz_obj;
71
+ }
72
+
73
+ duckdb_time_tz GetTimeTZFromObject (Napi::Env env, Napi::Object time_tz_obj) {
74
+ bool lossless;
75
+ auto bits = time_tz_obj.Get (" bits" ).As <Napi::BigInt>().Uint64Value (&lossless);
76
+ if (!lossless) {
77
+ throw Napi::Error::New (env, " bits out of uint64 range" );
78
+ }
79
+ return { bits };
80
+ }
81
+
82
+ Napi::Object MakeTimeTZPartsObject (Napi::Env env, duckdb_time_tz_struct time_tz_parts) {
83
+ auto time_tz_parts_obj = Napi::Object::New (env);
84
+ time_tz_parts_obj.Set (" time" , MakeTimePartsObject (env, time_tz_parts.time ));
85
+ time_tz_parts_obj.Set (" offset" , Napi::Number::New (env, time_tz_parts.offset ));
86
+ return time_tz_parts_obj;
87
+ }
88
+
89
+ // GetTimeTZFromObject not used
90
+
91
+ Napi::Object MakeTimestampObject (Napi::Env env, duckdb_timestamp timestamp) {
92
+ auto timestamp_obj = Napi::Object::New (env);
93
+ timestamp_obj.Set (" micros" , Napi::BigInt::New (env, timestamp.micros ));
94
+ return timestamp_obj;
95
+ }
96
+
97
+ duckdb_timestamp GetTimestampFromObject (Napi::Env env, Napi::Object timestamp_obj) {
98
+ bool lossless;
99
+ auto micros = timestamp_obj.Get (" micros" ).As <Napi::BigInt>().Int64Value (&lossless);
100
+ if (!lossless) {
101
+ throw Napi::Error::New (env, " micros out of int64 range" );
102
+ }
103
+ return { micros };
104
+ }
105
+
106
+ Napi::Object MakeTimestampPartsObject (Napi::Env env, duckdb_timestamp_struct timestamp_parts) {
107
+ auto timestamp_parts_obj = Napi::Object::New (env);
108
+ timestamp_parts_obj.Set (" date" , MakeDatePartsObject (env, timestamp_parts.date ));
109
+ timestamp_parts_obj.Set (" time" , MakeTimePartsObject (env, timestamp_parts.time ));
110
+ return timestamp_parts_obj;
111
+ }
112
+
113
+ duckdb_timestamp_struct GetTimestampPartsFromObject (Napi::Object timestamp_parts_obj) {
114
+ auto date = GetDatePartsFromObject (timestamp_parts_obj.Get (" date" ).As <Napi::Object>());
115
+ auto time = GetTimePartsFromObject (timestamp_parts_obj.Get (" time" ).As <Napi::Object>());
116
+ return { date, time };
117
+ }
118
+
119
+ // Externals
120
+
11
121
template <typename T>
12
122
Napi::External<T> CreateExternal (Napi::Env env, const napi_type_tag &type_tag, T *data) {
13
123
auto external = Napi::External<T>::New (env, data);
@@ -134,6 +244,8 @@ duckdb_vector GetVectorFromExternal(Napi::Env env, Napi::Value value) {
134
244
return GetDataFromExternal<_duckdb_vector>(env, VectorTypeTag, value, " Invalid vector argument" );
135
245
}
136
246
247
+ // Promise workers
248
+
137
249
class PromiseWorker : public Napi ::AsyncWorker {
138
250
139
251
public:
@@ -430,6 +542,8 @@ class FetchWorker : public PromiseWorker {
430
542
431
543
};
432
544
545
+ // Enums
546
+
433
547
void DefineEnumMember (Napi::Object enumObj, const char *key, uint32_t value) {
434
548
enumObj.Set (key, value);
435
549
enumObj.Set (value, key);
@@ -525,6 +639,8 @@ Napi::Object CreateTypeEnum(Napi::Env env) {
525
639
return typeEnum;
526
640
}
527
641
642
+ // Addon
643
+
528
644
class DuckDBNodeAddon : public Napi ::Addon<DuckDBNodeAddon> {
529
645
530
646
public:
@@ -1015,38 +1131,27 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
1015
1131
Napi::Value from_date (const Napi::CallbackInfo& info) {
1016
1132
auto env = info.Env ();
1017
1133
auto date_obj = info[0 ].As <Napi::Object>();
1018
- auto days = date_obj.Get (" days" ).As <Napi::Number>().Int32Value ();
1019
- duckdb_date date = { days };
1134
+ auto date = GetDateFromObject (date_obj);
1020
1135
auto date_parts = duckdb_from_date (date);
1021
- auto result = Napi::Object::New (env);
1022
- result.Set (" year" , Napi::Number::New (env, date_parts.year ));
1023
- result.Set (" month" , Napi::Number::New (env, date_parts.month ));
1024
- result.Set (" day" , Napi::Number::New (env, date_parts.day ));
1025
- return result;
1136
+ return MakeDatePartsObject (env, date_parts);
1026
1137
}
1027
1138
1028
1139
// DUCKDB_API duckdb_date duckdb_to_date(duckdb_date_struct date);
1029
1140
// function to_date(parts: DateParts): Date_
1030
1141
Napi::Value to_date (const Napi::CallbackInfo& info) {
1031
1142
auto env = info.Env ();
1032
1143
auto date_parts_obj = info[0 ].As <Napi::Object>();
1033
- int32_t year = date_parts_obj.Get (" year" ).As <Napi::Number>().Int32Value ();
1034
- int8_t month = date_parts_obj.Get (" month" ).As <Napi::Number>().Int32Value ();
1035
- int8_t day = date_parts_obj.Get (" day" ).As <Napi::Number>().Int32Value ();
1036
- duckdb_date_struct date_parts = { year, month, day };
1144
+ auto date_parts = GetDatePartsFromObject (date_parts_obj);
1037
1145
auto date = duckdb_to_date (date_parts);
1038
- auto result = Napi::Object::New (env);
1039
- result.Set (" days" , Napi::Number::New (env, date.days ));
1040
- return result;
1146
+ return MakeDateObject (env, date);
1041
1147
}
1042
1148
1043
1149
// DUCKDB_API bool duckdb_is_finite_date(duckdb_date date);
1044
1150
// function is_finite_date(date: Date_): boolean
1045
1151
Napi::Value is_finite_date (const Napi::CallbackInfo& info) {
1046
1152
auto env = info.Env ();
1047
1153
auto date_obj = info[0 ].As <Napi::Object>();
1048
- auto days = date_obj.Get (" days" ).As <Napi::Number>().Int32Value ();
1049
- duckdb_date date = { days };
1154
+ auto date = GetDateFromObject (date_obj);
1050
1155
auto is_finite = duckdb_is_finite_date (date);
1051
1156
return Napi::Boolean::New (env, is_finite);
1052
1157
}
@@ -1056,15 +1161,9 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
1056
1161
Napi::Value from_time (const Napi::CallbackInfo& info) {
1057
1162
auto env = info.Env ();
1058
1163
auto time_obj = info[0 ].As <Napi::Object>();
1059
- auto micros = time_obj.Get (" micros" ).As <Napi::Number>().Int64Value ();
1060
- duckdb_time time = { micros };
1164
+ auto time = GetTimeFromObject (time_obj);
1061
1165
auto time_parts = duckdb_from_time (time);
1062
- auto result = Napi::Object::New (env);
1063
- result.Set (" hour" , Napi::Number::New (env, time_parts.hour ));
1064
- result.Set (" min" , Napi::Number::New (env, time_parts.min ));
1065
- result.Set (" sec" , Napi::Number::New (env, time_parts.sec ));
1066
- result.Set (" micros" , Napi::Number::New (env, time_parts.micros ));
1067
- return result;
1166
+ return MakeTimePartsObject (env, time_parts);
1068
1167
}
1069
1168
1070
1169
// DUCKDB_API duckdb_time_tz duckdb_create_time_tz(int64_t micros, int32_t offset);
@@ -1074,69 +1173,57 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
1074
1173
auto micros = info[0 ].As <Napi::Number>().Int64Value ();
1075
1174
auto offset = info[1 ].As <Napi::Number>().Int32Value ();
1076
1175
auto time_tz = duckdb_create_time_tz (micros, offset);
1077
- auto result = Napi::Object::New (env);
1078
- result.Set (" bits" , Napi::BigInt::New (env, time_tz.bits ));
1079
- return result;
1176
+ return MakeTimeTZObject (env, time_tz);
1080
1177
}
1081
1178
1082
1179
// DUCKDB_API duckdb_time_tz_struct duckdb_from_time_tz(duckdb_time_tz micros);
1083
1180
// function from_time_tz(time_tz: TimeTZ): TimeTZParts
1084
1181
Napi::Value from_time_tz (const Napi::CallbackInfo& info) {
1085
1182
auto env = info.Env ();
1086
1183
auto time_tz_obj = info[0 ].As <Napi::Object>();
1087
- bool lossless;
1088
- auto bits = time_tz_obj.Get (" bits" ).As <Napi::BigInt>().Uint64Value (&lossless);
1089
- if (!lossless) {
1090
- throw Napi::Error::New (env, " bits out of uint64 range" );
1091
- }
1092
- duckdb_time_tz time_tz = { bits };
1184
+ auto time_tz = GetTimeTZFromObject (env, time_tz_obj);
1093
1185
auto time_tz_parts = duckdb_from_time_tz (time_tz);
1094
- auto result = Napi::Object::New (env);
1095
- auto time = Napi::Object::New (env);
1096
- time.Set (" hour" , Napi::Number::New (env, time_tz_parts.time .hour ));
1097
- time.Set (" min" , Napi::Number::New (env, time_tz_parts.time .min ));
1098
- time.Set (" sec" , Napi::Number::New (env, time_tz_parts.time .sec ));
1099
- time.Set (" micros" , Napi::Number::New (env, time_tz_parts.time .micros ));
1100
- result.Set (" time" , time);
1101
- result.Set (" offset" , Napi::Number::New (env, time_tz_parts.offset ));
1102
- return result;
1186
+ return MakeTimeTZPartsObject (env, time_tz_parts);
1103
1187
}
1104
1188
1105
1189
// DUCKDB_API duckdb_time duckdb_to_time(duckdb_time_struct time);
1106
1190
// function to_time(parts: TimeParts): Time
1107
1191
Napi::Value to_time (const Napi::CallbackInfo& info) {
1108
1192
auto env = info.Env ();
1109
1193
auto time_parts_obj = info[0 ].As <Napi::Object>();
1110
- int8_t hour = time_parts_obj.Get (" hour" ).As <Napi::Number>().Int32Value ();
1111
- int8_t min = time_parts_obj.Get (" min" ).As <Napi::Number>().Int32Value ();
1112
- int8_t sec = time_parts_obj.Get (" sec" ).As <Napi::Number>().Int32Value ();
1113
- int32_t micros = time_parts_obj.Get (" micros" ).As <Napi::Number>().Int32Value ();
1114
- duckdb_time_struct time_parts = { hour, min, sec, micros };
1194
+ auto time_parts = GetTimePartsFromObject (time_parts_obj);
1115
1195
auto time = duckdb_to_time (time_parts);
1116
- auto result = Napi::Object::New (env);
1117
- result.Set (" micros" , Napi::Number::New (env, time.micros ));
1118
- return result;
1196
+ return MakeTimeObject (env, time);
1119
1197
}
1120
1198
1121
1199
// DUCKDB_API duckdb_timestamp_struct duckdb_from_timestamp(duckdb_timestamp ts);
1122
1200
// function from_timestamp(timestamp: Timestamp): TimestampParts
1123
1201
Napi::Value from_timestamp (const Napi::CallbackInfo& info) {
1124
1202
auto env = info.Env ();
1125
- throw Napi::Error::New (env, " Not implemented yet" );
1203
+ auto timestamp_obj = info[0 ].As <Napi::Object>();
1204
+ auto timestamp = GetTimestampFromObject (env, timestamp_obj);
1205
+ auto timestamp_parts = duckdb_from_timestamp (timestamp);
1206
+ return MakeTimestampPartsObject (env, timestamp_parts);
1126
1207
}
1127
1208
1128
1209
// DUCKDB_API duckdb_timestamp duckdb_to_timestamp(duckdb_timestamp_struct ts);
1129
1210
// function to_timestamp(parts: TimestampParts): Timestamp
1130
1211
Napi::Value to_timestamp (const Napi::CallbackInfo& info) {
1131
1212
auto env = info.Env ();
1132
- throw Napi::Error::New (env, " Not implemented yet" );
1213
+ auto timestamp_parts_obj = info[0 ].As <Napi::Object>();
1214
+ auto timestamp_parts = GetTimestampPartsFromObject (timestamp_parts_obj);
1215
+ auto timestamp = duckdb_to_timestamp (timestamp_parts);
1216
+ return MakeTimestampObject (env, timestamp);
1133
1217
}
1134
1218
1135
1219
// DUCKDB_API bool duckdb_is_finite_timestamp(duckdb_timestamp ts);
1136
1220
// function is_finite_timestamp(timestamp: Timestamp): boolean
1137
1221
Napi::Value is_finite_timestamp (const Napi::CallbackInfo& info) {
1138
1222
auto env = info.Env ();
1139
- throw Napi::Error::New (env, " Not implemented yet" );
1223
+ auto timestamp_obj = info[0 ].As <Napi::Object>();
1224
+ auto timestamp = GetTimestampFromObject (env, timestamp_obj);
1225
+ auto is_finite = duckdb_is_finite_timestamp (timestamp);
1226
+ return Napi::Boolean::New (env, is_finite);
1140
1227
}
1141
1228
1142
1229
// DUCKDB_API double duckdb_hugeint_to_double(duckdb_hugeint val);
0 commit comments