beezwax 0.2.0 → 0.3.0

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -21,6 +21,61 @@ class BtrieveRecord
21
21
  def delete
22
22
  btr_op(@session, DELETE, @btrieve_table.pos_buffer, NULL_BUFFER, NULL_BUFFER, NULL_KEY)
23
23
  end
24
+
25
+ def get_relation_bindings(key)
26
+ table_map=@session.relations[@btrieve_table.tablename]
27
+ raise Exception.new("No relations defined for table #{@btrieve_table.tablename}") if table_map.nil?
28
+ relation=table_map[key]
29
+ raise Exception.new("No relation found named #{key.to_s} in table #{@btrieve_table.tablename}") if relation.nil?
30
+ bindings=relation[:join].inject({}) do |map,join|
31
+ value=join[1][:match]
32
+ map[join[0]]=join[1][:source]==:table ? self[value] : value
33
+ map
34
+ end
35
+ {:table=>relation[:target],:index=>relation[:index],:bindings=>bindings}
36
+ end
37
+
38
+ def get_relations_bindings(keys)
39
+ keys.inject({}){|map,key|map[key]=self.get_relation_bindings(key);map}
40
+ end
41
+
42
+ def get_all_relations_bindings()
43
+ relations=@session.relations[@btrieve_table.tablename]||={}
44
+ get_relations_bindings(relations.keys)
45
+ end
46
+
47
+ def get_relation(key)
48
+ match=get_relation_bindings(key)
49
+ target_table=BtrieveTable.new(relation[:target], @session)
50
+ index_number=relation[:index]
51
+ target_table.find(match,index_number)
52
+ end
53
+
54
+ def get_relations(keys)
55
+ keys.inject({}){|map,key|map[key]=self.get_relation(key);map}
56
+ end
57
+
58
+ def get_all_relations()
59
+ relations=@session.relations[@btrieve_table.tablename]||={}
60
+ get_relations(relations.keys)
61
+ end
62
+
63
+ def get_mapping(key)
64
+ table_map=@session.mappings[@btrieve_table.tablename]
65
+ raise Exception.new("No mappings defined for table #{@btrieve_table.tablename}") if table_map.nil?
66
+ mapping=table_map[key]
67
+ raise Exception.new("No mapping found named #{key.to_s} in table #{@btrieve_table.tablename}") if mapping.nil?
68
+ @session.mapping_functions[mapping[:transform]].call(self[mapping[:column]])
69
+ end
70
+
71
+ def get_mappings(keys)
72
+ keys.inject({}){|map,key|map[key]=self.get_mapping(key);map}
73
+ end
74
+
75
+ def get_all_mappings()
76
+ mappings=@session.mappings[@btrieve_table.tablename]||={}
77
+ get_mappings(mappings.keys)
78
+ end
24
79
 
25
80
  def get_attributes(keys)
26
81
  keys.inject({}){|vals, key| vals[key]=self[key]; vals}
@@ -60,13 +115,10 @@ class BtrieveRecord
60
115
  def [](key_name)
61
116
  schema_key=get_schema_key(key_name)
62
117
  return nil if(schema_key.nil?)
63
- raw_data=@data_buffer.unpack(schema_key[:unpacker])[0]
64
- btrieve_map = @session.btrieve_map
65
- btrieve_map.up(@btrieve_table.tablename, key_name, raw_data)
118
+ @data_buffer.unpack(schema_key[:unpacker])[0]
66
119
  end
67
120
 
68
- def []=(key_name, raw_data)
69
- value=@session.btrieve_map.down(@btrieve_table.tablename, key_name, raw_data)
121
+ def []=(key_name, value)
70
122
  schema_key = get_schema_key(key_name)
71
123
  packer_string = schema_key[:unpacker]
72
124
  match = packer_string.match(/@(\d+)([a-zA-Z]+)(\d*)/)
@@ -2,7 +2,7 @@ class BtrieveSession
2
2
  SESSIONS = {}
3
3
  include Btrieve
4
4
  attr_reader :pathname, :client_id, :cache, :model_classes, :btrieve_schema
5
- attr_accessor :btrieve_map
5
+ attr_accessor :mappings, :mapping_functions, :relations
6
6
 
7
7
  def self.set_context(pathname)
8
8
  session = get_session
@@ -44,7 +44,6 @@ class BtrieveSession
44
44
  @client_id = "#{0.chr*12}#{[0x5257].pack('S')}#{rand(65535)}"
45
45
  btr_op(self, SET_DIRECTORY, NULL_BUFFER, NULL_BUFFER, @pathname, NULL_KEY)
46
46
  @btrieve_schema = BtrieveSchema.new(self)
47
- @btrieve_map = BtrieveMap.new()
48
47
  end
49
48
  end
50
49
 
@@ -4,7 +4,7 @@ class BtrieveTable
4
4
  include Btrieve
5
5
  attr_reader :tablename, :session, :pos_buffer, :schema
6
6
 
7
- def initialize(tablename, session, schema = nil)
7
+ def initialize(tablename, session, schema=nil)
8
8
  @tablename = tablename
9
9
  @session = session
10
10
  @pos_buffer = Btrieve.create_string_buffer(POS_BLOCK_SIZE)
@@ -14,6 +14,33 @@ class BtrieveTable
14
14
  def open(mode = NORMAL_MODE)
15
15
  btr_op(@session, OPEN, @pos_buffer, NULL_BUFFER, @schema[:filename], mode)
16
16
  end
17
+
18
+ def mappings()
19
+ @session.mappings[@tablename] ||= {}
20
+ end
21
+
22
+ def add_mapping(attr_name, mapping_name, transform)
23
+ mappings[mapping_name.to_sym]={:column=>attr_name.to_sym,:transform=>transform.to_sym}
24
+ end
25
+
26
+ def relations()
27
+ @session.relations[@tablename] ||= {}
28
+ end
29
+
30
+ def add_relation(name, target_table, index, join)
31
+ relations[name.to_sym]={:target=>target_table.to_sym,:index=>index,:join=>join}
32
+ end
33
+
34
+ def find(match, index_number)
35
+ unique=schema[:index_flags].map{|f|f&1==1}[index_number]
36
+ result=nil
37
+ if(unique)
38
+ result=find_in_unique_index(match, index_numer)
39
+ else
40
+ result=find_in_index(match, index_numer)
41
+ end
42
+ result
43
+ end
17
44
 
18
45
  def find_in_unique_index(match, index_number=nil)
19
46
  finder(match, index_number) do |key_buffer, index|
@@ -77,7 +104,7 @@ class BtrieveTable
77
104
  def self.url_to_tablename(url_tablename)
78
105
  url_tablename.gsub('.and.', ' & ').gsub('ac.', 'a/c ').gsub('es.o','es - o').gsub('.',' ')
79
106
  end
80
-
107
+
81
108
  private
82
109
 
83
110
  def step_next
@@ -101,8 +128,7 @@ class BtrieveTable
101
128
  index = @schema[:indices][index_number]
102
129
  columns = @schema[:columns]
103
130
  key_components = index.inject([]) do |vals, key|
104
- datatype = BtrieveSchema.lookup(columns[key][:datatype], columns[key][:size])[:name]
105
- puts "#{key}=>#{datatype}"
131
+ datatype = BtrieveSchema.lookup(columns[key][:datatype], columns[key][:size])[:name]
106
132
  value = match[key]
107
133
  value = value.to_f if FLOAT_TYPES.include?(datatype)
108
134
  value = value.to_i if INTEGER_TYPES.include?(datatype)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beezwax
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 3
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Patrick Lardin
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-25 00:00:00 -07:00
18
+ date: 2010-08-29 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -53,7 +53,6 @@ files:
53
53
  - lib/beezwax.rb
54
54
  - lib/btrieve/btrieve_const.rb
55
55
  - lib/btrieve/btrieve_core.rb
56
- - lib/btrieve/btrieve_map.rb
57
56
  - lib/btrieve/btrieve_model.rb
58
57
  - lib/btrieve/btrieve_record.rb
59
58
  - lib/btrieve/btrieve_schema.rb
@@ -1,28 +0,0 @@
1
- class BtrieveMap
2
- include Btrieve
3
-
4
- attr_accessor :mapping
5
-
6
- def initialize()
7
- @mapping={}
8
- end
9
-
10
- def up(tablename, column_name, value)
11
- db_cast(tablename, column_name, value, :up)
12
- end
13
-
14
- def down(tablename, column_name, value)
15
- db_cast(tablename, column_name, value, :down)
16
- end
17
-
18
- private
19
-
20
- def db_cast(tablename, column_name, value, mode)
21
- table=mapping[tablename.to_s]
22
- return value if(table.nil?)
23
- column=table[column_name.to_s]
24
- return value if(column.nil?)
25
- column[mode].call(value)
26
- end
27
-
28
- end