ginjo-rfm 3.0.9 → 3.0.10

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.
@@ -13,10 +13,10 @@ module Rfm
13
13
  @name = name
14
14
  self.db = db_obj
15
15
  end
16
-
16
+
17
17
  meta_attr_accessor :db
18
18
  attr_reader :name
19
19
  end # Script
20
-
20
+
21
21
  end # Metadata
22
- end # Rfm
22
+ end # Rfm
@@ -1,31 +1,31 @@
1
1
  module Rfm
2
- module Metadata
3
-
4
- # The ValueListItem object represents an item in a Filemaker value list.
5
- # ValueListItem is subclassed from String, so you can use it just like
6
- # a string. It does have three additional methods to help separate Filemaker *value*
7
- # vs *display* items.
8
- #
9
- # Getting values vs display items:
10
- #
11
- # * *#value* the value list item value
12
- #
13
- # * *#display* is the value list item display. It could be the same
14
- # as +value+, or it could be the "second field", if that option is checked in Filemaker
15
- #
16
- # * *#value_list_name* is the name of the parent value list, if any
17
- class ValueListItem < String
18
- # TODO: re-instate saving of value_list_name.
19
- attr_reader :value, :display, :value_list_name
20
-
21
- # def initialize(value, display, value_list_name)
22
- # @value_list_name = value_list_name
23
- # @value = value.to_s
24
- # @display = display.to_s
25
- # self.replace @value
26
- # end
27
-
28
- end # ValueListItem
29
-
30
- end # Metadata
31
- end # Rfm
2
+ module Metadata
3
+
4
+ # The ValueListItem object represents an item in a Filemaker value list.
5
+ # ValueListItem is subclassed from String, so you can use it just like
6
+ # a string. It does have three additional methods to help separate Filemaker *value*
7
+ # vs *display* items.
8
+ #
9
+ # Getting values vs display items:
10
+ #
11
+ # * *#value* the value list item value
12
+ #
13
+ # * *#display* is the value list item display. It could be the same
14
+ # as +value+, or it could be the "second field", if that option is checked in Filemaker
15
+ #
16
+ # * *#value_list_name* is the name of the parent value list, if any
17
+ class ValueListItem < String
18
+ # TODO: re-instate saving of value_list_name.
19
+ attr_reader :value, :display, :value_list_name
20
+
21
+ # def initialize(value, display, value_list_name)
22
+ # @value_list_name = value_list_name
23
+ # @value = value.to_s
24
+ # @display = display.to_s
25
+ # self.replace @value
26
+ # end
27
+
28
+ end # ValueListItem
29
+
30
+ end # Metadata
31
+ end # Rfm
@@ -71,13 +71,13 @@ module Rfm
71
71
  #
72
72
  # This code iterates through the rows of the _Orders_ portal.
73
73
  #
74
- # As a convenience, you can call a specific portal as a method on your record, if the table occurrence name does
74
+ # As a convenience, you can call a specific portal as a method on your record, if the table occurrence name does
75
75
  # not have any characters that are prohibited in ruby method names, just as you can call a field with a method:
76
- #
77
- # myRecord.orders.each {|portal_row|
78
- # puts portal_row["Order Number"]
79
- # }
80
- #
76
+ #
77
+ # myRecord.orders.each {|portal_row|
78
+ # puts portal_row["Order Number"]
79
+ # }
80
+ #
81
81
  # =Field Types and Ruby Types
82
82
  #
83
83
  # RFM automatically converts data from FileMaker into a Ruby object with the most reasonable type possible. The
@@ -107,41 +107,40 @@ module Rfm
107
107
  # changes so you can tell if the Record object you're looking at is up-to-date as compared to another
108
108
  # copy of the same record
109
109
  class Record < Rfm::CaseInsensitiveHash
110
-
110
+
111
111
  attr_accessor :layout #, :resultset
112
112
  attr_reader :record_id, :mod_id, :portals
113
113
  def_delegators :layout, :db, :database, :server, :field_meta, :portal_meta, :field_names, :portal_names
114
-
114
+
115
115
  # This is called during the parsing process, but only to allow creation of the correct type of model instance.
116
116
  # This is also called by the end-user when constructing a new empty record, but it is called from the model subclass.
117
- def self.new(*args) # resultset
118
- record = case
119
-
120
- # Get model from layout, then allocate record.
121
- # This should only use model class if the class already exists,
122
- # since we don't want to create classes that aren't defined by the user - they won't be persistant.
123
- when args[0].is_a?(Resultset) && args[0].layout && args[0].layout.model
124
- args[0].layout.modelize.allocate
117
+ def self.new(*args) # resultset
118
+ record = case
119
+ # Get model from layout, then allocate record.
120
+ # This should only use model class if the class already exists,
121
+ # since we don't want to create classes that aren't defined by the user - they won't be persistant.
122
+ when args[0].is_a?(Resultset) && args[0].layout && args[0].layout.model
123
+ args[0].layout.modelize.allocate
124
+ # Allocate instance of Rfm::Record.
125
+ else
126
+ self.allocate
127
+ end
125
128
 
126
- # Allocate instance of Rfm::Record.
127
- else
128
- self.allocate
129
- end
130
- record.send(:initialize, *args)
131
- record
132
- # rescue
133
- # puts "Record.new bombed and is defaulting to super.new. Error: #{$!}"
134
- # super
135
- end
129
+ record.send(:initialize, *args)
130
+ record
131
+ # rescue
132
+ # puts "Record.new bombed and is defaulting to super.new. Error: #{$!}"
133
+ # super
134
+ end
136
135
 
137
136
  def initialize(*args) # resultset, attributes
138
- @mods ||= {}
137
+ @mods ||= {}
139
138
  @portals ||= Rfm::CaseInsensitiveHash.new
140
- options = args.rfm_extract_options!
141
- if args[0].is_a?(Resultset)
142
- @layout = args[0].layout
143
- elsif self.is_a?(Base)
144
- @layout = self.class.layout
139
+ options = args.rfm_extract_options!
140
+ if args[0].is_a?(Resultset)
141
+ @layout = args[0].layout
142
+ elsif self.is_a?(Base)
143
+ @layout = self.class.layout
145
144
  @layout.field_keys.each do |field|
146
145
  self[field] = nil
147
146
  end
@@ -150,8 +149,8 @@ module Rfm
150
149
  @loaded = true
151
150
  end
152
151
  _attach_as_instance_variables(args[1]) if args[1].is_a? Hash
153
- #@loaded = true
154
- self
152
+ #@loaded = true
153
+ self
155
154
  end
156
155
 
157
156
  # Saves local changes to the Record object back to Filemaker. For example:
@@ -181,7 +180,7 @@ module Rfm
181
180
  self.replace_with_fresh_data(layout.edit(@record_id, @mods, {:modification_id => @mod_id})[0]) if @mods.size > 0
182
181
  @mods.clear
183
182
  end
184
-
183
+
185
184
  # Gets the value of a field from the record. For example:
186
185
  #
187
186
  # first = myRecord["First Name"]
@@ -195,19 +194,19 @@ module Rfm
195
194
  #
196
195
  # When you do, the change is noted, but *the data is not updated in FileMaker*. You must call
197
196
  # Record::save or Record::save_if_not_modified to actually save the data.
198
- def [](key)
199
- # Added by wbr, 2013-03-31
200
- return super unless @loaded
201
- return fetch(key.to_s.downcase)
202
- rescue IndexError
203
- raise Rfm::ParameterError, "#{key} does not exists as a field in the current Filemaker layout." unless key.to_s == '' #unless (!layout or self.key?(key_string))
204
- end
197
+ def [](key)
198
+ # Added by wbr, 2013-03-31
199
+ return super unless @loaded
200
+ return fetch(key.to_s.downcase)
201
+ rescue IndexError
202
+ raise Rfm::ParameterError, "#{key} does not exists as a field in the current Filemaker layout." unless key.to_s == '' #unless (!layout or self.key?(key_string))
203
+ end
205
204
 
206
205
  def respond_to?(symbol, include_private = false)
207
206
  return true if self.include?(symbol.to_s)
208
207
  super
209
208
  end
210
-
209
+
211
210
  def []=(key, val)
212
211
  key_string = key.to_s.downcase
213
212
  return super unless @loaded # is this needed?
@@ -215,45 +214,49 @@ module Rfm
215
214
  # @mods[key_string] = val
216
215
  # TODO: This needs cleaning up.
217
216
  # TODO: can we get field_type from record instead?
218
- @mods[key_string] = if [Date, Time, DateTime].member?(val.class)
219
- field_type = layout.field_meta[key_string.to_sym].result
220
- case field_type
221
- when 'time'; val.strftime(layout.time_format)
222
- when 'date'; val.strftime(layout.date_format)
223
- when 'timestamp'; val.strftime(layout.timestamp_format)
224
- else val
225
- end
226
- else val
227
- end
217
+ @mods[key_string] = if [Date, Time, DateTime].member?(val.class)
218
+ field_type = layout.field_meta[key_string.to_sym].result
219
+ case field_type
220
+ when 'time'
221
+ val.strftime(layout.time_format)
222
+ when 'date'
223
+ val.strftime(layout.date_format)
224
+ when 'timestamp'
225
+ val.strftime(layout.timestamp_format)
226
+ else
227
+ val
228
+ end
229
+ else
230
+ val
231
+ end
228
232
  super(key, val)
229
233
  end
230
-
231
- def field_names
232
- layout.field_names
234
+
235
+ def field_names
236
+ layout.field_names
233
237
  end
234
-
238
+
235
239
  def replace_with_fresh_data(record)
236
- self.replace record
237
- [:@mod_id, :@record_id, :@portals, :@mods].each do |var|
238
- self.instance_variable_set var, record.instance_variable_get(var) || {}
239
- end
240
- self
241
- end
242
-
243
-
240
+ self.replace record
241
+ [:@mod_id, :@record_id, :@portals, :@mods].each do |var|
242
+ self.instance_variable_set var, record.instance_variable_get(var) || {}
243
+ end
244
+ self
245
+ end
246
+
244
247
 
245
- private
248
+ private
246
249
 
247
- def method_missing (symbol, *attrs, &block)
248
- method = symbol.to_s
249
- return self[method] if self.key?(method)
250
- return @portals[method] if @portals and @portals.key?(method)
250
+ def method_missing (symbol, *attrs, &block)
251
+ method = symbol.to_s
252
+ return self[method] if self.key?(method)
253
+ return @portals[method] if @portals and @portals.key?(method)
254
+
255
+ if method =~ /(=)$/
256
+ return self[$`] = attrs.first if self.key?($`)
257
+ end
258
+ super
259
+ end
251
260
 
252
- if method =~ /(=)$/
253
- return self[$`] = attrs.first if self.key?($`)
254
- end
255
- super
256
- end
257
-
258
261
  end # Record
259
- end # Rfm
262
+ end # Rfm
@@ -36,25 +36,23 @@ module Rfm
36
36
  # it provides metadata about the portals in the ResultSet and the Fields on those portals
37
37
 
38
38
  class Resultset < Array
39
- include Config
40
-
39
+ include Config
40
+
41
41
  attr_reader :layout, :meta, :calling_object
42
- # attr_reader :layout, :database, :server, :calling_object, :doc
43
- # attr_reader :field_meta, :portal_meta, :include_portals, :datasource
44
- # attr_reader :date_format, :time_format, :timestamp_format
45
- # attr_reader :total_count, :foundset_count, :table
42
+ # attr_reader :layout, :database, :server, :calling_object, :doc
43
+ # attr_reader :field_meta, :portal_meta, :include_portals, :datasource
44
+ # attr_reader :date_format, :time_format, :timestamp_format
45
+ # attr_reader :total_count, :foundset_count, :table
46
46
  #def_delegators :layout, :db, :database
47
47
  # alias_method :db, :database
48
- def_delegators :meta, :field_meta, :portal_meta, :date_format, :time_format, :timestamp_format, :total_count, :foundset_count, :fetch_size, :table, :error, :field_names, :field_keys, :portal_names
48
+ def_delegators :meta, :field_meta, :portal_meta, :date_format, :time_format, :timestamp_format, :total_count, :foundset_count, :fetch_size, :table, :error, :field_names, :field_keys, :portal_names
49
49
 
50
-
51
50
  class << self
52
- def load_data(data, object=self.new)
53
- Rfm::Connection
54
- Rfm::SaxParser.parse(data, :fmresultset, object)
55
- end
51
+ def load_data(data, object=self.new)
52
+ Rfm::SaxParser.parse(data, :fmresultset, object)
53
+ end
56
54
  end
57
-
55
+
58
56
  # Initializes a new ResultSet object. You will probably never do this your self (instead, use the Layout
59
57
  # object to get various ResultSet obejects).
60
58
  #
@@ -77,68 +75,68 @@ module Rfm
77
75
  # layout contains portals, you can find out what fields they contain here. Again, if it's the data you're
78
76
  # after, you want to look at the Record object.
79
77
  def initialize(*args) # parent, layout
80
- config *args
81
- self.meta
78
+ config(*args)
79
+ self.meta
82
80
  end # initialize
83
81
 
84
82
  def config(*args)
85
- super do |params|
86
- (@layout = params[:objects][0]) if params &&
87
- params[:objects] &&
88
- params[:objects][0] &&
89
- params[:objects][0].is_a?(Rfm::Layout)
90
- end
83
+ super do |params|
84
+ (@layout = params[:objects][0]) if params &&
85
+ params[:objects] &&
86
+ params[:objects][0] &&
87
+ params[:objects][0].is_a?(Rfm::Layout)
88
+ end
91
89
  end
92
-
90
+
93
91
  # This method was added for situations where a layout was not provided at resultset instantiation,
94
92
  # such as when loading a resultset from an xml file.
95
93
  def layout
96
- @layout ||= (Layout.new(meta.layout, self) if meta.respond_to? :layout)
94
+ @layout ||= (Layout.new(meta.layout, self) if meta.respond_to? :layout)
95
+ end
96
+
97
+ def database
98
+ layout.database
99
+ end
100
+
101
+ alias_method :db, :database
102
+
103
+ def server
104
+ database.server
105
+ end
106
+
107
+ def meta
108
+ # Access the meta inst var here.
109
+ @meta ||= Metadata::ResultsetMeta.new
110
+ end
111
+
112
+ # Deprecated on 7/29/2014. Stop using.
113
+ def handle_new_record(attributes)
114
+ r = Rfm::Record.new(self, attributes, {})
115
+ self << r
116
+ r
117
+ end
118
+
119
+ def end_datasource_element_callback(cursor)
120
+ %w(date_format time_format timestamp_format).each{|f| convert_date_time_format(send(f))}
121
+ @meta.attach_layout_object_from_cursor(cursor)
97
122
  end
98
-
99
- def database
100
- layout.database
101
- end
102
-
103
- alias_method :db, :database
104
-
105
- def server
106
- database.server
107
- end
108
-
109
- def meta
110
- # Access the meta inst var here.
111
- @meta ||= Metadata::ResultsetMeta.new
112
- end
113
-
114
- # Deprecated on 7/29/2014. Stop using.
115
- def handle_new_record(attributes)
116
- r = Rfm::Record.new(self, attributes, {})
117
- self << r
118
- r
119
- end
120
-
121
- def end_datasource_element_callback(cursor)
122
- %w(date_format time_format timestamp_format).each{|f| convert_date_time_format(send(f))}
123
- @meta.attach_layout_object_from_cursor(cursor)
124
- end
125
-
126
- private
127
-
123
+
124
+ private
125
+
128
126
  def check_for_errors(error_code=@meta['error'].to_i, raise_401=state[:raise_401])
129
- #puts ["\nRESULTSET#check_for_errors", "meta[:error] #{@meta[:error]}", "error_code: #{error_code}", "raise_401: #{raise_401}"]
127
+ #puts ["\nRESULTSET#check_for_errors", "meta[:error] #{@meta[:error]}", "error_code: #{error_code}", "raise_401: #{raise_401}"]
130
128
  raise Rfm::Error.getError(error_code) if error_code != 0 && (error_code != 401 || raise_401)
131
129
  end
132
130
 
133
- def convert_date_time_format(fm_format)
134
- fm_format.gsub!('MM', '%m')
135
- fm_format.gsub!('dd', '%d')
136
- fm_format.gsub!('yyyy', '%Y')
137
- fm_format.gsub!('HH', '%H')
138
- fm_format.gsub!('mm', '%M')
139
- fm_format.gsub!('ss', '%S')
140
- fm_format
141
- end
142
-
131
+ def convert_date_time_format(fm_format)
132
+ fm_format.gsub!('MM', '%m')
133
+ fm_format.gsub!('dd', '%d')
134
+ fm_format.gsub!('yyyy', '%Y')
135
+ fm_format.gsub!('HH', '%H')
136
+ fm_format.gsub!('mm', '%M')
137
+ fm_format.gsub!('ss', '%S')
138
+ fm_format
139
+ end
140
+
143
141
  end
144
- end
142
+ end