@sqg/sqg 0.17.2 → 0.17.4

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.
package/dist/index.mjs CHANGED
@@ -1870,7 +1870,10 @@ var JavaGenerator = class extends BaseGenerator {
1870
1870
  }).join(" + ");
1871
1871
  }
1872
1872
  readColumn(column, index, path) {
1873
- return this.typeMapper.parseValue(column, `rs.getObject(${index + 1})`, path);
1873
+ const idx = index + 1;
1874
+ const readExpr = jdbcReadExpression(column, idx, this.typeMapper);
1875
+ if (readExpr !== null) return readExpr;
1876
+ return this.typeMapper.parseValue(column, `rs.getObject(${idx})`, path);
1874
1877
  }
1875
1878
  async beforeGenerate(_projectDir, _gen, _queries, _tables) {
1876
1879
  Handlebars.registerHelper("isDuckDB", () => this.engine === "duckdb");
@@ -1979,6 +1982,39 @@ var JavaGenerator = class extends BaseGenerator {
1979
1982
  }
1980
1983
  }
1981
1984
  };
1985
+ const JDBC_GETTER_MAP = {
1986
+ String: (i) => `rs.getString(${i})`,
1987
+ "byte[]": (i) => `rs.getBytes(${i})`,
1988
+ BigDecimal: (i) => `rs.getBigDecimal(${i})`,
1989
+ Integer: (i) => `rs.getObject(${i}, Integer.class)`,
1990
+ Long: (i) => `rs.getObject(${i}, Long.class)`,
1991
+ Short: (i) => `rs.getObject(${i}, Short.class)`,
1992
+ Byte: (i) => `rs.getObject(${i}, Byte.class)`,
1993
+ Boolean: (i) => `rs.getObject(${i}, Boolean.class)`,
1994
+ Double: (i) => `rs.getObject(${i}, Double.class)`,
1995
+ Float: (i) => `rs.getObject(${i}, Float.class)`
1996
+ };
1997
+ const OPAQUE_SQL_TYPES = new Set([
1998
+ "TIMESTAMP",
1999
+ "DATETIME",
2000
+ "TIMESTAMPTZ",
2001
+ "TIMESTAMP WITH TIME ZONE",
2002
+ "TIMESTAMP_S",
2003
+ "TIMESTAMP_MS",
2004
+ "TIMESTAMP_NS",
2005
+ "DATE",
2006
+ "TIME",
2007
+ "TIME WITH TIME ZONE",
2008
+ "JSON",
2009
+ "JSONB"
2010
+ ]);
2011
+ function jdbcReadExpression(column, index, typeMapper) {
2012
+ if (column.type instanceof EnumType || column.type instanceof ListType || column.type instanceof StructType) return null;
2013
+ const upperType = column.type?.toString().toUpperCase() ?? "";
2014
+ if (OPAQUE_SQL_TYPES.has(upperType) || upperType.startsWith("_")) return null;
2015
+ const getter = JDBC_GETTER_MAP[typeMapper.getTypeName(column)];
2016
+ return getter ? getter(index) : null;
2017
+ }
1982
2018
  const JDBC_SETTER_MAP = {
1983
2019
  String: {
1984
2020
  setter: "setString",
package/dist/sqg.mjs CHANGED
@@ -2189,7 +2189,10 @@ var JavaGenerator = class extends BaseGenerator {
2189
2189
  }).join(" + ");
2190
2190
  }
2191
2191
  readColumn(column, index, path) {
2192
- return this.typeMapper.parseValue(column, `rs.getObject(${index + 1})`, path);
2192
+ const idx = index + 1;
2193
+ const readExpr = jdbcReadExpression(column, idx, this.typeMapper);
2194
+ if (readExpr !== null) return readExpr;
2195
+ return this.typeMapper.parseValue(column, `rs.getObject(${idx})`, path);
2193
2196
  }
2194
2197
  async beforeGenerate(_projectDir, _gen, _queries, _tables) {
2195
2198
  Handlebars.registerHelper("isDuckDB", () => this.engine === "duckdb");
@@ -2298,6 +2301,39 @@ var JavaGenerator = class extends BaseGenerator {
2298
2301
  }
2299
2302
  }
2300
2303
  };
2304
+ const JDBC_GETTER_MAP = {
2305
+ String: (i) => `rs.getString(${i})`,
2306
+ "byte[]": (i) => `rs.getBytes(${i})`,
2307
+ BigDecimal: (i) => `rs.getBigDecimal(${i})`,
2308
+ Integer: (i) => `rs.getObject(${i}, Integer.class)`,
2309
+ Long: (i) => `rs.getObject(${i}, Long.class)`,
2310
+ Short: (i) => `rs.getObject(${i}, Short.class)`,
2311
+ Byte: (i) => `rs.getObject(${i}, Byte.class)`,
2312
+ Boolean: (i) => `rs.getObject(${i}, Boolean.class)`,
2313
+ Double: (i) => `rs.getObject(${i}, Double.class)`,
2314
+ Float: (i) => `rs.getObject(${i}, Float.class)`
2315
+ };
2316
+ const OPAQUE_SQL_TYPES = new Set([
2317
+ "TIMESTAMP",
2318
+ "DATETIME",
2319
+ "TIMESTAMPTZ",
2320
+ "TIMESTAMP WITH TIME ZONE",
2321
+ "TIMESTAMP_S",
2322
+ "TIMESTAMP_MS",
2323
+ "TIMESTAMP_NS",
2324
+ "DATE",
2325
+ "TIME",
2326
+ "TIME WITH TIME ZONE",
2327
+ "JSON",
2328
+ "JSONB"
2329
+ ]);
2330
+ function jdbcReadExpression(column, index, typeMapper) {
2331
+ if (column.type instanceof EnumType || column.type instanceof ListType || column.type instanceof StructType) return null;
2332
+ const upperType = column.type?.toString().toUpperCase() ?? "";
2333
+ if (OPAQUE_SQL_TYPES.has(upperType) || upperType.startsWith("_")) return null;
2334
+ const getter = JDBC_GETTER_MAP[typeMapper.getTypeName(column)];
2335
+ return getter ? getter(index) : null;
2336
+ }
2301
2337
  const JDBC_SETTER_MAP = {
2302
2338
  String: {
2303
2339
  setter: "setString",
@@ -3418,7 +3454,7 @@ async function processProject(projectPath, ui) {
3418
3454
  //#region src/mcp-server.ts
3419
3455
  const server = new Server({
3420
3456
  name: "sqg-mcp",
3421
- version: process.env.npm_package_version ?? "0.17.2"
3457
+ version: process.env.npm_package_version ?? "0.17.4"
3422
3458
  }, { capabilities: {
3423
3459
  tools: {},
3424
3460
  resources: {}
@@ -3883,7 +3919,7 @@ function formatMs(ms) {
3883
3919
  }
3884
3920
  //#endregion
3885
3921
  //#region src/sqg.ts
3886
- const version = process.env.npm_package_version ?? "0.17.2";
3922
+ const version = process.env.npm_package_version ?? "0.17.4";
3887
3923
  updateNotifier({ pkg: {
3888
3924
  name: "@sqg/sqg",
3889
3925
  version
@@ -46,6 +46,12 @@ public class {{className}} {
46
46
  this.connection = connection;
47
47
  }
48
48
 
49
+ /** Options for streaming queries. fetchSize hints at the JDBC driver's batch size; 0 means driver default. */
50
+ public record StreamOptions(int fetchSize) {
51
+ public static final StreamOptions DEFAULT = new StreamOptions({{#if (isPostgres)}}1000{{else}}0{{/if}});
52
+ public StreamOptions withFetchSize(int fetchSize) { return new StreamOptions(fetchSize); }
53
+ }
54
+
49
55
  private static Object[] getObjectArray(Array array) {
50
56
  if (array == null) {
51
57
  return null;
@@ -258,7 +264,16 @@ public class {{className}} {
258
264
  {{/if}}
259
265
  {{#if isQuery}}{{#unless isOne}}
260
266
  public Stream<{{rowType}}> {{functionName}}Stream({{#each variables}}{{{type}}} {{name}}{{#unless @last}}, {{/unless}}{{/each}}) throws SQLException {
267
+ return {{functionName}}Stream({{#each variables}}{{name}}, {{/each}}StreamOptions.DEFAULT);
268
+ }
269
+
270
+ public Stream<{{rowType}}> {{functionName}}Stream({{#each variables}}{{{type}}} {{name}}, {{/each}}StreamOptions options) throws SQLException {
271
+ {{#if (isPostgres)}}
272
+ boolean wasAutoCommit = connection.getAutoCommit();
273
+ if (wasAutoCommit) connection.setAutoCommit(false);
274
+ {{/if}}
261
275
  var stmt = connection.prepareStatement({{{partsToString sqlQueryParts}}});
276
+ if (options.fetchSize() > 0) stmt.setFetchSize(options.fetchSize());
262
277
  {{#each parameters}}{{#if isArray}}stmt.setArray({{plusOne @index}}, connection.createArrayOf("{{arrayBaseType}}", {{name}}.toArray()));
263
278
  {{else if isEnum}}stmt.setObject({{plusOne @index}}, {{name}}.getValue());
264
279
  {{else}}{{{jdbcSet type (plusOne @index) name}}}
@@ -283,7 +298,13 @@ public class {{className}} {
283
298
  return StreamSupport.stream(
284
299
  Spliterators.spliteratorUnknownSize(iter, Spliterator.ORDERED), false
285
300
  ).onClose(() -> {
286
- try { rs.close(); stmt.close(); }
301
+ try {
302
+ rs.close();
303
+ stmt.close();
304
+ {{#if (isPostgres)}}
305
+ if (wasAutoCommit) connection.setAutoCommit(true);
306
+ {{/if}}
307
+ }
287
308
  catch (SQLException e) { throw new RuntimeException(e); }
288
309
  });
289
310
  }
@@ -13228,31 +13228,28 @@ var require_schemes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
13228
13228
  parse: wsParse,
13229
13229
  serialize: wsSerialize
13230
13230
  };
13231
- const wss = {
13232
- scheme: "wss",
13233
- domainHost: ws.domainHost,
13234
- parse: ws.parse,
13235
- serialize: ws.serialize
13236
- };
13237
- const urn = {
13238
- scheme: "urn",
13239
- parse: urnParse,
13240
- serialize: urnSerialize,
13241
- skipNormalize: true
13242
- };
13243
- const urnuuid = {
13244
- scheme: "urn:uuid",
13245
- parse: urnuuidParse,
13246
- serialize: urnuuidSerialize,
13247
- skipNormalize: true
13248
- };
13249
13231
  const SCHEMES = {
13250
13232
  http,
13251
13233
  https,
13252
13234
  ws,
13253
- wss,
13254
- urn,
13255
- "urn:uuid": urnuuid
13235
+ wss: {
13236
+ scheme: "wss",
13237
+ domainHost: ws.domainHost,
13238
+ parse: ws.parse,
13239
+ serialize: ws.serialize
13240
+ },
13241
+ urn: {
13242
+ scheme: "urn",
13243
+ parse: urnParse,
13244
+ serialize: urnSerialize,
13245
+ skipNormalize: true
13246
+ },
13247
+ "urn:uuid": {
13248
+ scheme: "urn:uuid",
13249
+ parse: urnuuidParse,
13250
+ serialize: urnuuidSerialize,
13251
+ skipNormalize: true
13252
+ }
13256
13253
  };
13257
13254
  Object.setPrototypeOf(SCHEMES, null);
13258
13255
  /**
@@ -22274,6 +22271,7 @@ var require_min_version = /* @__PURE__ */ __commonJSMin(((exports, module) => {
22274
22271
  break;
22275
22272
  case "<":
22276
22273
  case "<=": break;
22274
+ /* istanbul ignore next */
22277
22275
  default: throw new Error(`Unexpected operation: ${comparator.operator}`);
22278
22276
  }
22279
22277
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqg/sqg",
3
- "version": "0.17.2",
3
+ "version": "0.17.4",
4
4
  "description": "SQG - SQL Query Generator - Type-safe code generation from SQL (https://sqg.dev)",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",