beezwax 0.2.0 → 0.3.0

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