KirbyBase 2.5.1 → 2.5.2

Sign up to get free protection for your applications and to get access to all the features.
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: