tina4ruby 3.10.13 → 3.10.14

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6d46cd66e041da43c47eef3869b8fd66455270fe1937d4c86ee839836dd6419
4
- data.tar.gz: bf4853aa8715cc865c25fa2693b10d50168d1fd48bc9a9371e8368a963e142bc
3
+ metadata.gz: 369c8407929eb62f5cb731892cf04ead2ed42584770039116bf28bec683aebce
4
+ data.tar.gz: 753464d18ffc0fd0f3920a579ef47487bf51187de6a787e89b49a198e91be62b
5
5
  SHA512:
6
- metadata.gz: 21b443f74d40f46d610be7d039be8158b6a3a8be044476730ece168baaa2f8bb9b65a1b6e82f8a8c2d1cf50b9aafa614d99c3229b0c75b64b696973853cd1a21
7
- data.tar.gz: 93a487f54bcbf48995dc61915326b8826cac1a7a4250275ab0ec25fd3a47af55b39da60186dbeac86eb87db2c2d2b6b5f2a92f73f6ce46bf44db9c724cec8fb8
6
+ metadata.gz: '09a62c81d9cd67d79e5254de5751f0ee68f544d0c8a1e379f898613a9a486e584959331ab51db3963ee711c5ea912b7dca5cdff32884d6f2c896285c33086474'
7
+ data.tar.gz: 3dc7ea9d535599a1e86047efba6521b20e85a54a1fac79b738ecd1a928e19492968548e60bb85478e2b34d99314d8fc79c6456be30e46006d707ceda73efef70
@@ -311,6 +311,61 @@ module Tina4
311
311
  tables.any? { |t| t.downcase == table_name.to_s.downcase }
312
312
  end
313
313
 
314
+ # Pre-generate the next available primary key ID using engine-aware strategies.
315
+ #
316
+ # - Firebird: auto-creates a generator if missing, then increments via GEN_ID.
317
+ # - PostgreSQL: tries nextval() on the standard sequence, falls through to MAX+1.
318
+ # - SQLite/MySQL/MSSQL: uses MAX(pk) + 1.
319
+ # - Returns 1 if the table is empty or does not exist.
320
+ #
321
+ # @param table [String] Table name
322
+ # @param pk_column [String] Primary key column name (default: "id")
323
+ # @param generator_name [String, nil] Firebird generator name override
324
+ # @return [Integer] The next available ID
325
+ def get_next_id(table, pk_column: "id", generator_name: nil)
326
+ drv = current_driver
327
+
328
+ # Firebird — use generators
329
+ if @driver_name == "firebird"
330
+ gen_name = generator_name || "GEN_#{table.upcase}_ID"
331
+
332
+ # Auto-create the generator if it does not exist
333
+ begin
334
+ drv.execute("CREATE GENERATOR #{gen_name}")
335
+ rescue
336
+ # Generator already exists — ignore
337
+ end
338
+
339
+ rows = drv.execute_query("SELECT GEN_ID(#{gen_name}, 1) AS NEXT_ID FROM RDB$DATABASE")
340
+ row = rows.is_a?(Array) ? rows.first : nil
341
+ return (row && (row["NEXT_ID"] || row["next_id"]))&.to_i || 1
342
+ end
343
+
344
+ # PostgreSQL — try sequence first, fall through to MAX
345
+ if @driver_name == "postgres"
346
+ seq_name = "#{table.downcase}_#{pk_column.downcase}_seq"
347
+ begin
348
+ rows = drv.execute_query("SELECT nextval('#{seq_name}') AS next_id")
349
+ row = rows.is_a?(Array) ? rows.first : nil
350
+ if row && (row["next_id"] || row["nextval"])
351
+ return (row["next_id"] || row["nextval"]).to_i
352
+ end
353
+ rescue
354
+ # No sequence — fall through to MAX
355
+ end
356
+ end
357
+
358
+ # SQLite / MySQL / MSSQL / PostgreSQL fallback — MAX + 1
359
+ begin
360
+ rows = drv.execute_query("SELECT MAX(#{pk_column}) + 1 AS next_id FROM #{table}")
361
+ row = rows.is_a?(Array) ? rows.first : nil
362
+ next_id = row && (row["next_id"] || row["max"])
363
+ return next_id ? next_id.to_i : 1
364
+ rescue
365
+ return 1
366
+ end
367
+ end
368
+
314
369
  private
315
370
 
316
371
  def truthy?(val)
data/lib/tina4/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tina4
4
- VERSION = "3.10.13"
4
+ VERSION = "3.10.14"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tina4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.10.13
4
+ version: 3.10.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tina4 Team