KirbyBase 2.5.1 → 2.5.2

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.
data/README CHANGED
@@ -1,4 +1,4 @@
1
- = KirbyBase 2.5.1
1
+ = KirbyBase 2.5.2
2
2
 
3
3
  A small, plain-text, dbms written in Ruby. It can be used either embedded
4
4
  or client/server.
@@ -24,8 +24,8 @@ See the examples directory for examples of how to use KirbyBase.
24
24
  * install.rb - install script
25
25
  * changes.txt - history of changes.
26
26
  * kirbybaserubymanual.html - documentation
27
- * kirbybase.rb - dbms library
28
- * kbserver.rb - multi-threaded database server script.
27
+ * lib/kirbybase.rb - dbms library
28
+ * bin/kbserver.rb - multi-threaded database server script.
29
29
  * test directory - unit tests
30
30
  * examples directory - many example scripts demonstrating features.
31
31
  * images directory - images used in manual.
@@ -1,3 +1,9 @@
1
+ 2005-12-30:: Version 2.5.2
2
+ * Changed the behavior of KBTable#insert method. If user specifies nil
3
+ for a field value and there is a default value for that field, the
4
+ default value will no longer override the user specified nil value.
5
+ Thanks to Assaph Mehr for suggesting this.
6
+
1
7
  2005-12-28:: Version 2.5.1
2
8
  * Fixed a bug that had broken encrypted tables.
3
9
  * Changed KBTable#pack method so that it raises an error if trying to
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  #-------------------- Initialize KirbyBase Instance ------------------------
13
13
  # To run local, single-user, uncomment next line.
14
- db = KirbyBase.new
14
+ db = KirbyBase.new
15
15
 
16
16
  # To run as a client in a multi-user environment, uncomment next line.
17
17
  # Also, make sure kbserver.rb is running.
@@ -24,6 +24,17 @@ rescue StandardError => e
24
24
  puts;puts
25
25
  end
26
26
 
27
+ begin
28
+ # Same thing should happen if I don't even specify a value for
29
+ # :category.
30
+ address_book_tbl.insert(:firstname=>'Bruce', :lastname=>'Wayne',
31
+ :street_addres=>'1234 Bat Cave', :city=>'Gotham City',
32
+ :phone=>'111-111-1111')
33
+ rescue StandardError => e
34
+ puts e
35
+ puts;puts
36
+ end
37
+
27
38
  # Now, let's turn off the required flag for :category.
28
39
  address_book_tbl.change_column_required(:category, false)
29
40
 
@@ -13,30 +13,41 @@ address_book_tbl = db.create_table(:address_book,
13
13
  :city, :String, :phone, :String,
14
14
  :category, {:DataType=>:String, :Default=>'Super Hero'})
15
15
 
16
- # Insert a record. Notice that I am passing nil for :category. KirbyBase
17
- # will insert the default value, 'Super Hero', in that field.
18
- address_book_tbl.insert('Bruce', 'Wayne', '1234 Bat Cave', 'Gotham City',
19
- '111-111-1111', nil)
16
+ # Insert a record. Notice that I am not passing a value for :category.
17
+ # KirbyBase will insert the default value, 'Super Hero', in that field.
18
+ address_book_tbl.insert(:firstname=>'Bruce', :lastname=>'Wayne',
19
+ :street_address=>'1234 Bat Cave', :city=>'Gotham City',
20
+ :phone=>'111-111-1111')
20
21
 
21
22
  # Insert another record. Here we supply the value for :category, so
22
23
  # KirbyBase will use it instead of the default.
23
- address_book_tbl.insert('Bugs', 'Bunny', '1234 Rabbit Hole', 'The Forest',
24
- '222-222-2222', 'Cartoon Character')
24
+ address_book_tbl.insert(:firstname=>'Bugs', :lastname=>'Bunny',
25
+ :street_address=>'1234 Rabbit Hole', :city=>'The Forest',
26
+ :phone=>'222-222-2222', :category=>'Cartoon Character')
27
+
28
+ # Insert another record. Here we explicitly supply nil as the value for
29
+ # category. KirbyBase will not override this with the default value
30
+ # because we explicitly specified nil as the value.
31
+ address_book_tbl.insert(:firstname=>'Super', :lastname=>'Man',
32
+ :street_address=>'1234 Fortress of Solitude', :city=>'Metropolis',
33
+ :phone=>'333-333-3333', :category=>nil)
25
34
 
26
35
  # Now lets change the default value for :category to 'President'.
27
36
  address_book_tbl.change_column_default_value(:category, 'President')
28
37
 
29
38
  # And let's add another record without supplying a value for :category.
30
- address_book_tbl.insert(firstname='George', lastname='Bush',
31
- street_address='1600 Pennsylvania Ave', 'Washington', '333-333-3333', nil)
39
+ address_book_tbl.insert(:firstname=>'George', :lastname=>'Bush',
40
+ :street_address=>'1600 Pennsylvania Ave', :city=>'Washington',
41
+ :phone=>'333-333-3333')
32
42
 
33
43
  # Now, let's remove the default value for :category
34
44
  address_book_tbl.change_column_default_value(:category, nil)
35
45
 
36
46
  # And add another record. We won't specify a value for :category and,
37
47
  # KirbyBase will not use a default value, because we removed it.
38
- address_book_tbl.insert('Silver', 'Surfer', '1234 Galaxy Way',
39
- 'Any City', '444-444-4444', nil)
48
+ address_book_tbl.insert(:firstname=>'Silver', :lastname=>'Surfer',
49
+ :street_address=>'1234 Galaxy Way', :city=>'Any City',
50
+ :phone=>'444-444-4444')
40
51
 
41
52
  # Now lets print the table out and you will see how all of the defaults
42
53
  # worked.
@@ -262,7 +262,7 @@ div.exampleblock-content {
262
262
  <h1>KirbyBase Manual (Ruby Version)</h1>
263
263
  <span id="author">Jamey Cribbs</span><br />
264
264
  <span id="email"><tt>&lt;<a href="mailto:jcribbs@twmi.rr.com">jcribbs@twmi.rr.com</a>&gt;</tt></span><br />
265
- v2.5.1 December 2005
265
+ v2.5.2 December 2005
266
266
  </div>
267
267
  <div id="preamble">
268
268
  <div class="sectionbody">
@@ -753,7 +753,7 @@ memo/blob files, you need to pass the location as an argument, like so:</p>
753
753
  <pre><tt>db = KirbyBase.new(:local, nil, './', '.tbl', './memos')</tt></pre>
754
754
  </div></div>
755
755
  <p>If you don't want KirbyBase to spend time initially creating all of the
756
- indexes for the tables in the database, you can pass false as the
756
+ indexes for the tables in the database, you can pass true as the
757
757
  delay_index_creation argument:</p>
758
758
  <div class="listingblock">
759
759
  <div class="content">
@@ -2266,7 +2266,7 @@ an Array like all of the regular indexes. So selects are even faster.</p>
2266
2266
  </div>
2267
2267
  <div id="footer">
2268
2268
  <div id="footer-text">
2269
- Last updated 28-Dec-2005 13:27:25 Eastern Daylight Time
2269
+ Last updated 30-Dec-2005 10:16:41 Eastern Daylight Time
2270
2270
  </div>
2271
2271
  </div>
2272
2272
  </body>
@@ -146,6 +146,12 @@ require 'yaml'
146
146
  # * Moved #build_header_string from KBEngine class to KirbyBase class.
147
147
  # * Added KirbyBase::VERSION constant.
148
148
  #
149
+ # 2005-12-30:: Version 2.5.2
150
+ # * Changed the behavior of KBTable#insert method. If user explicitly
151
+ # specifies nil for a field value and there is a default value for that
152
+ # field, the default value will no longer override the user specified nil
153
+ # value. Thanks to Assaph Mehr for suggesting this.
154
+ #
149
155
  #
150
156
  #---------------------------------------------------------------------------
151
157
  # KBTypeConversionsMixin
@@ -336,7 +342,7 @@ class KirbyBase
336
342
  include DRb::DRbUndumped
337
343
  include KBTypeConversionsMixin
338
344
 
339
- VERSION = "2.5.1"
345
+ VERSION = "2.5.2"
340
346
 
341
347
  attr_reader :engine
342
348
 
@@ -2102,10 +2108,10 @@ class KBTable
2102
2108
 
2103
2109
  input_rec = Struct.new(*field_names).new(*field_names.zip(
2104
2110
  @field_defaults).collect do |fn, fd|
2105
- if input_rec[fn].nil?
2106
- fd
2107
- else
2111
+ if input_rec.has_key?(fn)
2108
2112
  input_rec[fn]
2113
+ else
2114
+ fd
2109
2115
  end
2110
2116
  end)
2111
2117
 
@@ -9,7 +9,7 @@ class TestDatabaseLocal < Test::Unit::TestCase
9
9
  include BaseTest
10
10
 
11
11
  def test_version
12
- assert_equal('2.5.1', KirbyBase::VERSION)
12
+ assert_equal('2.5.2', KirbyBase::VERSION)
13
13
  end
14
14
 
15
15
  def test_local?
@@ -123,7 +123,7 @@ class TestTableLocal < Test::Unit::TestCase
123
123
  t.encrypt = @encrypted }
124
124
  tbl.insert('Spitfire', nil)
125
125
 
126
- assert_equal([1, 'Spitfire', 300], tbl[1].to_a)
126
+ assert_equal([1, 'Spitfire', nil], tbl[1].to_a)
127
127
  end
128
128
 
129
129
  def test_insert_007
@@ -219,7 +219,7 @@ class TestTableLocal < Test::Unit::TestCase
219
219
  tbl = @db.create_table(:plane, :name, :String,
220
220
  :speed, {:DataType=>:Integer, :Default=>300, :Required=>true}
221
221
  ) { |t| t.encrypt = @encrypted }
222
- tbl.insert(:name => 'Spitfire', :speed => nil)
222
+ tbl.insert(:name => 'Spitfire')
223
223
 
224
224
  assert_raise(ArgumentError) { tbl.update(:speed => nil) { |r|
225
225
  r.recno == 1 } }
@@ -459,6 +459,34 @@ class TestTableLocal < Test::Unit::TestCase
459
459
  assert_equal([1, 'one', 'bob'], tbl[1].to_a)
460
460
  end
461
461
 
462
+ def test_column_required_005
463
+ tbl = @db.create_table(:empty, :one, :String, :two,
464
+ {:DataType => :String, :Required => true}) { |t|
465
+ t.encrypt = @encrypted }
466
+ tbl.insert('one', 'two')
467
+
468
+ assert_raise(ArgumentError) {
469
+ tbl.update('one', nil) { |r| r.recno == 1 } }
470
+ end
471
+
472
+ def test_column_required_006
473
+ tbl = @db.create_table(:empty, :one, :String, :two,
474
+ {:DataType => :String, :Required => true}) { |t|
475
+ t.encrypt = @encrypted }
476
+ tbl.insert('one', 'two')
477
+
478
+ assert_raise(ArgumentError) {
479
+ tbl.update(:two => nil) { |r| r.recno == 1 } }
480
+ end
481
+
482
+ def test_column_required_007
483
+ tbl = @db.create_table(:empty, :one, :String, :two,
484
+ {:DataType => :String, :Required => true, :Default => 'three'}
485
+ ) { |t| t.encrypt = @encrypted }
486
+
487
+ assert_raise(ArgumentError) { tbl.insert('one', nil) }
488
+ end
489
+
462
490
  def test_change_column_required_001
463
491
  tbl = @db.create_table(:empty, :one, :String, :two, :String
464
492
  ) { |t| t.encrypt = @encrypted }
@@ -481,7 +509,7 @@ class TestTableLocal < Test::Unit::TestCase
481
509
  {:DataType => :String, :Default => 'two'}) { |t|
482
510
  t.encrypt = @encrypted }
483
511
  tbl.insert('one', nil)
484
- assert_equal([1, 'one', 'two'], tbl[1].to_a)
512
+ assert_equal([1, 'one', nil], tbl[1].to_a)
485
513
  end
486
514
 
487
515
  def test_column_default_002
@@ -493,6 +521,32 @@ class TestTableLocal < Test::Unit::TestCase
493
521
  assert_equal([1, 'one', 'not two'], tbl[1].to_a)
494
522
  end
495
523
 
524
+ def test_column_default_003
525
+ tbl = @db.create_table(:empty, :one, :String, :two,
526
+ {:DataType => :String, :Default => 'two'}) { |t|
527
+ t.encrypt = @encrypted }
528
+ tbl.insert(:one => 'one')
529
+
530
+ assert_equal([1, 'one', 'two'], tbl[1].to_a)
531
+ end
532
+
533
+ def test_column_default_004
534
+ tbl = @db.create_table(:empty, :one, :String, :two,
535
+ {:DataType => :String, :Default => 'two'}) { |t|
536
+ t.encrypt = @encrypted }
537
+ tbl.insert(Struct.new(:one, :two).new('one'))
538
+
539
+ assert_equal([1, 'one', nil], tbl[1].to_a)
540
+ end
541
+
542
+ def test_column_default_005
543
+ tbl = @db.create_table(:empty, :one, :String, :two,
544
+ {:DataType => :String, :Default => 'two', :Required => true}) { |t|
545
+ t.encrypt = @encrypted }
546
+
547
+ assert_raise(ArgumentError) { tbl.insert('one', nil) }
548
+ end
549
+
496
550
  def test_change_column_default_value_001
497
551
  tbl = @db.create_table(:empty, :one, :String, :two, :String
498
552
  ) { |t| t.encrypt = @encrypted }
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: KirbyBase
5
5
  version: !ruby/object:Gem::Version
6
- version: 2.5.1
7
- date: 2005-12-28
6
+ version: 2.5.2
7
+ date: 2006-01-03
8
8
  summary: "KirbyBase is a simple, pure-Ruby, plain-text, flat-file database management
9
9
  system."
10
10
  require_paths: