tina4ruby 3.10.12 → 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: 58885d2a44c72f086b6359780fe7f01f88870bf3491973d9f1068934bb8780e1
4
- data.tar.gz: c567b4d7a4a027d460da4bd528204ffd7ba3ce4aa6e0b3e5d303c748d00f12fe
3
+ metadata.gz: 369c8407929eb62f5cb731892cf04ead2ed42584770039116bf28bec683aebce
4
+ data.tar.gz: 753464d18ffc0fd0f3920a579ef47487bf51187de6a787e89b49a198e91be62b
5
5
  SHA512:
6
- metadata.gz: 409514dda53214f3f02d36dacd58b845cd9c282e63e814590be34c13e4cac839e8c8f6c6dc571575c434d0736a055109f12e3b56f76087ceee2d4b046930b1e8
7
- data.tar.gz: caaa5dc05a96d5061bc3e70af18371d5e3fb7e8c10bd8e03cc84ca47be1863527814d478ec5788654b417d13ee754cc84f575ccb3ec43a5c16826fff798a5a52
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/orm.rb CHANGED
@@ -315,6 +315,7 @@ module Tina4
315
315
 
316
316
  sql = "CREATE TABLE IF NOT EXISTS #{table_name} (#{col_defs.join(', ')})"
317
317
  db.execute(sql)
318
+ db.commit
318
319
  true
319
320
  end
320
321
 
@@ -401,6 +402,7 @@ module Tina4
401
402
  end
402
403
  @persisted = true
403
404
  end
405
+ self.class.db.commit
404
406
  true
405
407
  rescue => e
406
408
  @errors << e.message
@@ -422,6 +424,7 @@ module Tina4
422
424
  else
423
425
  self.class.db.delete(self.class.table_name, { pk => pk_value })
424
426
  end
427
+ self.class.db.commit
425
428
  @persisted = false
426
429
  true
427
430
  end
@@ -432,6 +435,7 @@ module Tina4
432
435
  raise "Cannot delete: no primary key value" unless pk_value
433
436
 
434
437
  self.class.db.delete(self.class.table_name, { pk => pk_value })
438
+ self.class.db.commit
435
439
  @persisted = false
436
440
  true
437
441
  end
@@ -448,6 +452,7 @@ module Tina4
448
452
  { self.class.soft_delete_field => 0 },
449
453
  { pk => pk_value }
450
454
  )
455
+ self.class.db.commit
451
456
  __send__("#{self.class.soft_delete_field}=", 0) if respond_to?("#{self.class.soft_delete_field}=")
452
457
  true
453
458
  end
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.12"
4
+ VERSION = "3.10.14"
5
5
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tina4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.10.12
4
+ version: 3.10.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tina4 Team
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-03-28 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: rack
@@ -399,6 +400,7 @@ licenses:
399
400
  - MIT
400
401
  metadata:
401
402
  homepage_uri: https://tina4.com
403
+ post_install_message:
402
404
  rdoc_options: []
403
405
  require_paths:
404
406
  - lib
@@ -413,7 +415,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
413
415
  - !ruby/object:Gem::Version
414
416
  version: '0'
415
417
  requirements: []
416
- rubygems_version: 4.0.3
418
+ rubygems_version: 3.4.19
419
+ signing_key:
417
420
  specification_version: 4
418
421
  summary: Simple. Fast. Human. This is not a framework.
419
422
  test_files: []