rbase 0.1.1 → 0.1.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/Rakefile CHANGED
@@ -7,7 +7,7 @@ desc 'Create a gem'
7
7
  task :gem do
8
8
  spec = Gem::Specification.new do |s|
9
9
  s.name = 'rbase'
10
- s.version = '0.1.1'
10
+ s.version = '0.1.2'
11
11
  s.summary = 'Library to create/read/write to XBase databases (*.DBF files)'
12
12
  s.files = Dir.glob('**/*').delete_if { |item| item.include?('.svn') }
13
13
  s.require_path = 'lib'
@@ -10,14 +10,14 @@ module RBase
10
10
  #
11
11
  # == Example
12
12
  #
13
- # XBase.create_table 'people' do |t|
13
+ # RBase.create_table 'people' do |t|
14
14
  # t.column :name, :string, :size => 30
15
15
  # t.column :birthdate, :date
16
16
  # t.column :active, :boolean
17
17
  # t.column :tax, :integer, :size => 10, :decimal => 2
18
18
  # end
19
19
  #
20
- # For documentation on column parameters see XBase::Schema.column documentation.
20
+ # For documentation on column parameters see RBase::Schema.column documentation.
21
21
  #
22
22
  def self.create_table(name, options = {})
23
23
  options[:language] ||= LANGUAGE_RUSSIAN_WINDOWS
@@ -1,4 +1,14 @@
1
1
  module RBase
2
+ class Error < Exception; end
3
+
4
+ class UnknownColumnError < RBase::Error
5
+ attr_reader :name
6
+
7
+ def initialize(name)
8
+ super("Unknown column '#{name}'")
9
+ @name = name
10
+ end
11
+ end
2
12
 
3
13
  # Class that contains data for particular table row.
4
14
  # Should not be created explicitly (use Table#create to create records)
@@ -17,25 +27,25 @@ module RBase
17
27
  #
18
28
  class Record
19
29
  attr_reader :table, :index
20
-
30
+
21
31
  def initialize(table, attributes = {})
22
32
  @table = table
23
33
  @values_cached = {}
24
34
  @values_changed = {}
25
-
35
+
26
36
  attributes.each { |k, v| @values_changed[k.to_s.upcase] = v }
27
37
  end
28
38
 
29
39
  private
30
-
40
+
31
41
  def load(index, data)
32
42
  @table = table
33
43
  @index = index
34
44
  @data = data.dup
35
45
  end
36
-
46
+
37
47
  public
38
-
48
+
39
49
  # Returns true if record was never saved to database; otherwise return false.
40
50
  def new_record?
41
51
  @data.nil?
@@ -52,12 +62,20 @@ module RBase
52
62
  @deleted = true
53
63
  save
54
64
  end
55
-
65
+
56
66
  # Returns true if record was marked as deleted; otherwise return false.
57
67
  def deleted?
58
68
  @deleted ||= new_record? ? false : @data[0, 1] == '*'
59
69
  end
60
70
 
71
+ # Returns cloned copy of current record
72
+ def clone
73
+ c = self.class.new(@table, @values_changed)
74
+ c.instance_variable_set("@values_cached", @values_cached)
75
+ c.instance_variable_set("@data", @data)
76
+ c
77
+ end
78
+
61
79
  def method_missing(sym, *args)
62
80
  name = sym.to_s
63
81
  if /=$/ =~ name && args.size == 1
@@ -66,7 +84,7 @@ module RBase
66
84
  get_value(name)
67
85
  end
68
86
  end
69
-
87
+
70
88
  def serialize
71
89
  if new_record?
72
90
  @data = deleted? ? '*' : ' '
@@ -75,23 +93,24 @@ module RBase
75
93
  end.join
76
94
  else
77
95
  @data[0, 1] = deleted? ? '*' : ' '
78
- values_changed.each do |k, v|
79
- column = @table.column(name)
80
- @data[column.offset, column.size] = column.pack(value)
81
- values_cached[k] = v
96
+ @values_changed.each do |k, v|
97
+ column = @table.column(k)
98
+ @data[column.offset, column.size] = column.pack(v)
99
+ @values_cached[k] = v
82
100
  end
83
101
  end
84
102
  @data
85
103
  end
86
104
 
87
105
  protected
88
-
106
+
89
107
  # Returns value of specified column
90
108
  def get_value(name)
91
109
  name = name.to_s.upcase.to_sym
92
110
  return @values_changed[name] if @values_changed.has_key?(name)
93
111
  return nil if new_record?
94
112
  column = @table.column(name)
113
+ raise UnknownColumnError.new(name) unless column
95
114
  @values_cached[name] ||= column.unpack(@data[column.offset, column.size])
96
115
  end
97
116
 
@@ -103,3 +122,4 @@ module RBase
103
122
  end
104
123
 
105
124
  end
125
+
@@ -4,13 +4,13 @@ module RBase
4
4
  # Produce ruby schema for a given table.
5
5
  #
6
6
  # Parameters
7
- # table - instance of XBase::Table opened
7
+ # table - instance of RBase::Table opened
8
8
  #
9
9
  # == Example
10
10
  #
11
- # users = XBase::Table.open('users')
11
+ # users = RBase::Table.open('users')
12
12
  # File.open('users.dump.rb', 'w') do |f|
13
- # f.write XBase::SchemaDumper.dump(users)
13
+ # f.write RBase::SchemaDumper.dump(users)
14
14
  # end
15
15
  # users.close
16
16
  #
@@ -2,7 +2,7 @@ module RBase
2
2
 
3
3
  class Table
4
4
  private_class_method :new
5
-
5
+
6
6
  # Create new XBase table file. Table file name will be equal to name with ".dbf" suffix.
7
7
  #
8
8
  # Allowed options
@@ -17,7 +17,7 @@ module RBase
17
17
  #data << [0x3].pack('C') # version
18
18
  data << [date.year % 100, date.month, date.day].pack('CCC') # last modification date
19
19
  data << [0].pack('L') # number of records
20
- # data << [32+schema.columns.size*32+263+1].pack('v') # data size
20
+ # data << [32+schema.columns.size*32+263+1].pack('v') # data size
21
21
  data << [32+schema.columns.size*32+1].pack('v') # data size
22
22
  data << [record_size].pack('v') # record size
23
23
  data << [].pack('x2') # reserved
@@ -55,7 +55,7 @@ module RBase
55
55
  f.write data
56
56
  end
57
57
  end
58
-
58
+
59
59
  # Open table with given name.
60
60
  # Table name should be like file name without ".dbf" suffix.
61
61
  def self.open(name)
@@ -69,7 +69,7 @@ module RBase
69
69
  table
70
70
  end
71
71
  end
72
-
72
+
73
73
  # Physically remove records that were marked as deleted from file.
74
74
  def pack
75
75
  packed_count = 0
@@ -84,12 +84,12 @@ module RBase
84
84
  packed_count += 1
85
85
  end
86
86
  end
87
-
87
+
88
88
  file_end = @record_offset + @record_size*packed_count
89
89
  @file.pos = file_end
90
90
  @file.write "\x1a"
91
91
  @file.truncate file_end+1
92
-
92
+
93
93
  self.count = packed_count
94
94
  update_header
95
95
  end
@@ -100,11 +100,11 @@ module RBase
100
100
 
101
101
  attr_reader :name, :count, :columns, :last_modified_on, :language
102
102
 
103
- # Return instance of XBase::Column for given column name
103
+ # Return instance of RBase::Column for given column name
104
104
  def column(name)
105
105
  @name_to_columns[name]
106
106
  end
107
-
107
+
108
108
  # Returns instance of MemoFile that is associated with table
109
109
  def memo
110
110
  return @memo_file
@@ -121,7 +121,7 @@ module RBase
121
121
  record.save
122
122
  record
123
123
  end
124
-
124
+
125
125
  # Load record stored in position 'index'
126
126
  def load(index)
127
127
  @file.pos = @record_offset + @record_size*index
@@ -130,18 +130,18 @@ module RBase
130
130
  record.instance_eval { load(index, data) }
131
131
  record
132
132
  end
133
-
133
+
134
134
  alias_method :[], :load
135
-
135
+
136
136
  def []=(index, record)
137
137
  record.instance_eval { @index = index }
138
138
  save(record)
139
139
  end
140
-
140
+
141
141
  # Iterate through all (even deleted) records
142
142
  def each_with_deleted
143
143
  return unless block_given?
144
-
144
+
145
145
  count.times do |i|
146
146
  yield load(i)
147
147
  end
@@ -185,12 +185,12 @@ module RBase
185
185
  @columns << Columns::Column.column_for(type).new(name, :offset => offset, :size => size, :decimal => decimal)
186
186
  @name_to_columns[name.upcase.to_sym] = @columns.last
187
187
  end
188
-
188
+
189
189
  @columns.each { |column| column.attach_to(self) }
190
-
190
+
191
191
  @memo_file = MemoFile::DummyMemoFile.new
192
192
  end
193
-
193
+
194
194
  def save(record)
195
195
  if !record.index
196
196
  @file.pos = @record_offset + @record_size*count
@@ -198,8 +198,8 @@ module RBase
198
198
  @file.write [26].pack('c')
199
199
  self.count += 1
200
200
  else
201
- throw "Index out of bound" if index>=count
202
- @file.pos = @record_offset + @record_size*index
201
+ throw "Index out of bound" if record.index>=count
202
+ @file.pos = @record_offset + @record_size*record.index
203
203
  @file.write record.serialize
204
204
  end
205
205
  update_header
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.10
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: rbase
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
7
- date: 2006-09-26
6
+ version: 0.1.2
7
+ date: 2007-05-30 00:00:00 +04:00
8
8
  summary: Library to create/read/write to XBase databases (*.DBF files)
9
9
  require_paths:
10
- - lib
11
- email: "maxim.kulkin@gmail.com, leonardo.pires@gmail.com"
10
+ - lib
11
+ email: maxim.kulkin@gmail.com, leonardo.pires@gmail.com
12
12
  homepage: http://rbase.rubyforge.com/
13
13
  rubyforge_project: rbase
14
14
  description:
@@ -18,30 +18,39 @@ bindir: bin
18
18
  has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
- -
22
- - ">="
23
- - !ruby/object:Gem::Version
24
- version: 1.8.2
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.2
25
24
  version:
26
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
27
29
  authors:
28
- - "Maxim Kulkin, Leonardo Augusto Pires"
30
+ - Maxim Kulkin, Leonardo Augusto Pires
29
31
  files:
30
- - lib
31
- - Rakefile
32
- - lib/rbase
33
- - lib/rbase.rb
34
- - lib/rbase/builder.rb
35
- - lib/rbase/columns.rb
36
- - lib/rbase/memo_file.rb
37
- - lib/rbase/record.rb
38
- - lib/rbase/schema.rb
39
- - lib/rbase/schema_dumper.rb
40
- - lib/rbase/table.rb
32
+ - lib
33
+ - Rakefile
34
+ - lib/rbase
35
+ - lib/rbase.rb
36
+ - lib/rbase/record.rb
37
+ - lib/rbase/columns.rb
38
+ - lib/rbase/schema.rb
39
+ - lib/rbase/builder.rb
40
+ - lib/rbase/table.rb
41
+ - lib/rbase/memo_file.rb
42
+ - lib/rbase/schema_dumper.rb
41
43
  test_files: []
44
+
42
45
  rdoc_options: []
46
+
43
47
  extra_rdoc_files: []
48
+
44
49
  executables: []
50
+
45
51
  extensions: []
52
+
46
53
  requirements: []
47
- dependencies: []
54
+
55
+ dependencies: []
56
+