Skip to content

Commit bcadaf6

Browse files
authored
Merge pull request #62 from SpringQL/test/rust
fix: UBs
2 parents 1a9954c + f668c10 commit bcadaf6

14 files changed

+344
-213
lines changed

CHANGELOG.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,26 @@ Also check the changes in springql-core: <https://github.com/SpringQL/SpringQL/b
1313
<!-- markdownlint-disable MD024 -->
1414
## [Unreleased]
1515

16+
## [v0.16.0+4] - 2022-07-12
17+
18+
### Fixed
19+
20+
- Undefined behaviors on the following structures: ([#62](https://github.com/SpringQL/SpringQL-client-c/pull/62))
21+
- SpringConfig
22+
- SpringPipeline
23+
- SpringSinkRow
24+
- SpringSourceRow
25+
- SpringSourceRowBuilder
26+
27+
### Changed
28+
29+
- `spring_push()` takes `SpringSourceRow *` instead of `const SpringSourceRow *`. It de-allocates `SpringSourceRow *`. ([#62](https://github.com/SpringQL/SpringQL-client-c/pull/62))
30+
- `spring_source_row_add_column_blob()` returns new builder instead of modifying the existing one. ([#62](https://github.com/SpringQL/SpringQL-client-c/pull/62))
31+
32+
### Removed
33+
34+
- `spring_source_row_close()` ([#62](https://github.com/SpringQL/SpringQL-client-c/pull/62))
35+
1636
## [v0.16.0+3] - 2022-07-11
1737

1838
### Fixed
@@ -124,8 +144,9 @@ Depends on springql-core v0.7.1.
124144
[Semantic Versioning]: https://semver.org/
125145

126146
<!-- Versions -->
127-
[Unreleased]: https://github.com/SpringQL/SpringQL-client-c/compare/v0.16.0+3...HEAD
147+
[Unreleased]: https://github.com/SpringQL/SpringQL-client-c/compare/v0.16.0+4...HEAD
128148
[Released]: https://github.com/SpringQL/SpringQL-client-c/releases
149+
[v0.16.0+4]: https://github.com/SpringQL/SpringQL-client-c/compare/v0.16.0+4...v0.16.0+4
129150
[v0.16.0+3]: https://github.com/SpringQL/SpringQL-client-c/compare/v0.16.0+2...v0.16.0+3
130151
[v0.16.0+2]: https://github.com/SpringQL/SpringQL-client-c/compare/v0.16.0...v0.16.0+2
131152
[v0.16.0]: https://github.com/SpringQL/SpringQL-client-c/compare/v0.15.0+2...v0.16.0

springql.h

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -42,35 +42,35 @@ typedef enum SpringErrno {
4242
/**
4343
* Configuration.
4444
*/
45-
typedef void *SpringConfig;
45+
typedef struct SpringConfig SpringConfig;
4646

4747
/**
4848
* Pipeline (dataflow definition) in SpringQL.
4949
*/
50-
typedef void *SpringPipeline;
50+
typedef struct SpringPipeline SpringPipeline;
5151

5252
/**
5353
* Row object to pop from an in memory queue.
5454
*/
55-
typedef void *SpringSinkRow;
55+
typedef struct SpringSinkRow SpringSinkRow;
5656

5757
/**
5858
* Row object to push into an in memory queue.
5959
*/
60-
typedef void *SpringSourceRow;
60+
typedef struct SpringSourceRow SpringSourceRow;
6161

6262
/**
6363
* Builder of SpringSourceRow
6464
*/
65-
typedef void *SpringSourceRowBuilder;
65+
typedef struct SpringSourceRowBuilder SpringSourceRowBuilder;
6666

6767
/**
6868
* Returns default configuration.
6969
*
7070
* Returned value is not modifiable (it is just a void pointer).
7171
* If you would like to change the default configuration, use `spring_config_toml()` instead.
7272
*/
73-
SpringConfig *spring_config_default(void);
73+
struct SpringConfig *spring_config_default(void);
7474

7575
/**
7676
* Configuration by TOML format string.
@@ -89,7 +89,7 @@ SpringConfig *spring_config_default(void);
8989
* - `overwrite_config_toml` includes invalid key and/or value.
9090
* - `overwrite_config_toml` is not valid as TOML.
9191
*/
92-
SpringConfig *spring_config_toml(const char *overwrite_config_toml);
92+
struct SpringConfig *spring_config_toml(const char *overwrite_config_toml);
9393

9494
/**
9595
* Frees heap occupied by a `SpringConfig`.
@@ -99,7 +99,7 @@ SpringConfig *spring_config_toml(const char *overwrite_config_toml);
9999
* - `Ok`: on success.
100100
* - `CNull`: `config` is a NULL pointer.
101101
*/
102-
enum SpringErrno spring_config_close(SpringConfig *config);
102+
enum SpringErrno spring_config_close(struct SpringConfig *config);
103103

104104
/**
105105
* Creates and open an in-process stream pipeline.
@@ -113,7 +113,7 @@ enum SpringErrno spring_config_close(SpringConfig *config);
113113
*
114114
* No errors are expected currently.
115115
*/
116-
SpringPipeline *spring_open(const SpringConfig *config);
116+
struct SpringPipeline *spring_open(const struct SpringConfig *config);
117117

118118
/**
119119
* Frees heap occupied by a `SpringPipeline`.
@@ -123,7 +123,7 @@ SpringPipeline *spring_open(const SpringConfig *config);
123123
* - `Ok`: on success.
124124
* - `CNull`: `pipeline` is a NULL pointer.
125125
*/
126-
enum SpringErrno spring_close(SpringPipeline *pipeline);
126+
enum SpringErrno spring_close(struct SpringPipeline *pipeline);
127127

128128
/**
129129
* Execute commands (DDL) to modify the pipeline.
@@ -138,7 +138,7 @@ enum SpringErrno spring_close(SpringPipeline *pipeline);
138138
* - `InvalidOption`:
139139
* - `OPTIONS` in `CREATE` statement includes invalid key or value.
140140
*/
141-
enum SpringErrno spring_command(const SpringPipeline *pipeline, const char *sql);
141+
enum SpringErrno spring_command(const struct SpringPipeline *pipeline, const char *sql);
142142

143143
/**
144144
* Pop a row from an in memory queue. This is a blocking function.
@@ -156,7 +156,7 @@ enum SpringErrno spring_command(const SpringPipeline *pipeline, const char *sql)
156156
*
157157
* - `Unavailable`: queue named `queue` does not exist.
158158
*/
159-
SpringSinkRow *spring_pop(const SpringPipeline *pipeline, const char *queue);
159+
struct SpringSinkRow *spring_pop(const struct SpringPipeline *pipeline, const char *queue);
160160

161161
/**
162162
* Pop a row from an in memory queue. This is a non-blocking function.
@@ -170,21 +170,23 @@ SpringSinkRow *spring_pop(const SpringPipeline *pipeline, const char *queue);
170170
*
171171
* - `Unavailable`: queue named `queue` does not exist.
172172
*/
173-
SpringSinkRow *spring_pop_non_blocking(const SpringPipeline *pipeline,
174-
const char *queue,
175-
bool *is_err);
173+
struct SpringSinkRow *spring_pop_non_blocking(const struct SpringPipeline *pipeline,
174+
const char *queue,
175+
bool *is_err);
176176

177177
/**
178178
* Push a row into an in memory queue. This is a non-blocking function.
179179
*
180+
* `row` is freed internally.
181+
*
180182
* # Returns
181183
*
182184
* - `Ok`: on success.
183185
* - `Unavailable`: queue named `queue` does not exist.
184186
*/
185-
enum SpringErrno spring_push(const SpringPipeline *pipeline,
187+
enum SpringErrno spring_push(const struct SpringPipeline *pipeline,
186188
const char *queue,
187-
const SpringSourceRow *row);
189+
struct SpringSourceRow *row);
188190

189191
/**
190192
* Create a source row from JSON string
@@ -198,7 +200,7 @@ enum SpringErrno spring_push(const SpringPipeline *pipeline,
198200
*
199201
* - `InvalidFormat`: JSON string is invalid.
200202
*/
201-
SpringSourceRow *spring_source_row_from_json(const char *json);
203+
struct SpringSourceRow *spring_source_row_from_json(const char *json);
202204

203205
/**
204206
* Start creating a source row using a builder.
@@ -207,10 +209,12 @@ SpringSourceRow *spring_source_row_from_json(const char *json);
207209
*
208210
* Pointer to the builder
209211
*/
210-
SpringSourceRowBuilder *spring_source_row_builder(void);
212+
struct SpringSourceRowBuilder *spring_source_row_builder(void);
211213

212214
/**
213-
* Add a BLOB column to the builder.
215+
* Add a BLOB column to the builder and return the new one.
216+
*
217+
* `builder` is freed internally.
214218
*
215219
* # Parameters
216220
*
@@ -221,13 +225,17 @@ SpringSourceRowBuilder *spring_source_row_builder(void);
221225
*
222226
* # Returns
223227
*
224-
* - `Ok`: on success.
228+
* - non-NULL: Successfully created a row.
229+
* - NULL: Error occurred.
230+
*
231+
* # Errors
232+
*
225233
* - `Sql`: `column_name` is already added to the builder.
226234
*/
227-
enum SpringErrno spring_source_row_add_column_blob(SpringSourceRowBuilder *builder,
228-
const char *column_name,
229-
const void *v,
230-
int v_len);
235+
struct SpringSourceRowBuilder *spring_source_row_add_column_blob(struct SpringSourceRowBuilder *builder,
236+
const char *column_name,
237+
const void *v,
238+
int v_len);
231239

232240
/**
233241
* Finish creating a source row using a builder.
@@ -238,17 +246,7 @@ enum SpringErrno spring_source_row_add_column_blob(SpringSourceRowBuilder *build
238246
*
239247
* SpringSourceRow
240248
*/
241-
SpringSourceRow *spring_source_row_build(SpringSourceRowBuilder *builder);
242-
243-
/**
244-
* Frees heap occupied by a `SpringSourceRow`.
245-
*
246-
* # Returns
247-
*
248-
* - `Ok`: on success.
249-
* - `CNull`: `pipeline` is a NULL pointer.
250-
*/
251-
enum SpringErrno spring_source_row_close(SpringSourceRow *row);
249+
struct SpringSourceRow *spring_source_row_build(struct SpringSourceRowBuilder *builder);
252250

253251
/**
254252
* Frees heap occupied by a `SpringSinkRow`.
@@ -258,7 +256,7 @@ enum SpringErrno spring_source_row_close(SpringSourceRow *row);
258256
* - `Ok`: on success.
259257
* - `CNull`: `pipeline` is a NULL pointer.
260258
*/
261-
enum SpringErrno spring_sink_row_close(SpringSinkRow *row);
259+
enum SpringErrno spring_sink_row_close(struct SpringSinkRow *row);
262260

263261
/**
264262
* Get a 2-byte integer column.
@@ -277,7 +275,7 @@ enum SpringErrno spring_sink_row_close(SpringSinkRow *row);
277275
* - `i_col` is out of range.
278276
* - `CNull`: Column value is NULL.
279277
*/
280-
enum SpringErrno spring_column_short(const SpringSinkRow *row, uint16_t i_col, short *out);
278+
enum SpringErrno spring_column_short(const struct SpringSinkRow *row, uint16_t i_col, short *out);
281279

282280
/**
283281
* Get a 4-byte integer column.
@@ -296,7 +294,7 @@ enum SpringErrno spring_column_short(const SpringSinkRow *row, uint16_t i_col, s
296294
* - `i_col` is out of range.
297295
* - `CNull`: Column value is NULL.
298296
*/
299-
enum SpringErrno spring_column_int(const SpringSinkRow *row, uint16_t i_col, int *out);
297+
enum SpringErrno spring_column_int(const struct SpringSinkRow *row, uint16_t i_col, int *out);
300298

301299
/**
302300
* Get an 8-byte integer column.
@@ -315,7 +313,7 @@ enum SpringErrno spring_column_int(const SpringSinkRow *row, uint16_t i_col, int
315313
* - `i_col` is out of range.
316314
* - `CNull`: Column value is NULL.
317315
*/
318-
enum SpringErrno spring_column_long(const SpringSinkRow *row, uint16_t i_col, long *out);
316+
enum SpringErrno spring_column_long(const struct SpringSinkRow *row, uint16_t i_col, long *out);
319317

320318
/**
321319
* Get a 4-byte unsigned integer column.
@@ -334,7 +332,7 @@ enum SpringErrno spring_column_long(const SpringSinkRow *row, uint16_t i_col, lo
334332
* - `i_col` is out of range.
335333
* - `CNull`: Column value is NULL.
336334
*/
337-
enum SpringErrno spring_column_unsigned_int(const SpringSinkRow *row,
335+
enum SpringErrno spring_column_unsigned_int(const struct SpringSinkRow *row,
338336
uint16_t i_col,
339337
unsigned int *out);
340338

@@ -356,7 +354,7 @@ enum SpringErrno spring_column_unsigned_int(const SpringSinkRow *row,
356354
* - `i_col` is out of range.
357355
* - `CNull`: Column value is NULL.
358356
*/
359-
int spring_column_text(const SpringSinkRow *row, uint16_t i_col, char *out, int out_len);
357+
int spring_column_text(const struct SpringSinkRow *row, uint16_t i_col, char *out, int out_len);
360358

361359
/**
362360
* Get a BLOB column.
@@ -376,7 +374,7 @@ int spring_column_text(const SpringSinkRow *row, uint16_t i_col, char *out, int
376374
* - `i_col` is out of range.
377375
* - `CNull`: Column value is NULL.
378376
*/
379-
int spring_column_blob(const SpringSinkRow *row, uint16_t i_col, void *out, int out_len);
377+
int spring_column_blob(const struct SpringSinkRow *row, uint16_t i_col, void *out, int out_len);
380378

381379
/**
382380
* Get a bool column.
@@ -395,7 +393,7 @@ int spring_column_blob(const SpringSinkRow *row, uint16_t i_col, void *out, int
395393
* - `i_col` is out of range.
396394
* - `CNull`: Column value is NULL.
397395
*/
398-
enum SpringErrno spring_column_bool(const SpringSinkRow *row, uint16_t i_col, bool *out);
396+
enum SpringErrno spring_column_bool(const struct SpringSinkRow *row, uint16_t i_col, bool *out);
399397

400398
/**
401399
* Get a 4-byte floating point column.
@@ -414,7 +412,7 @@ enum SpringErrno spring_column_bool(const SpringSinkRow *row, uint16_t i_col, bo
414412
* - `i_col` is out of range.
415413
* - `CNull`: Column value is NULL.
416414
*/
417-
enum SpringErrno spring_column_float(const SpringSinkRow *row, uint16_t i_col, float *out);
415+
enum SpringErrno spring_column_float(const struct SpringSinkRow *row, uint16_t i_col, float *out);
418416

419417
/**
420418
* Write the most recent error number into `errno_` and message into a caller-provided buffer as a UTF-8

0 commit comments

Comments
 (0)