ginjo-rfm 2.0.2 → 2.1.0.pre02

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rfm.rb CHANGED
@@ -32,6 +32,10 @@ module Rfm
32
32
  autoload :Factory, 'rfm/utilities/factory'
33
33
  autoload :CompoundQuery,'rfm/utilities/compound_query'
34
34
  autoload :VERSION, 'rfm/version'
35
+ autoload :Fmresultset, 'rfm/utilities/fmresultset.rb'
36
+ autoload :Fmpxmlresult, 'rfm/utilities/fmpxmlresult.rb'
37
+ autoload :Fmpdsoresult, 'rfm/utilities/fmpdsoresult.rb'
38
+ autoload :Fmpxmllayout, 'rfm/utilities/fmpxmllayout.rb'
35
39
 
36
40
  module Metadata
37
41
  autoload :Script, 'rfm/metadata/script'
data/lib/rfm/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.2
1
+ 2.1.0.pre02
data/lib/rfm/base.rb CHANGED
@@ -43,6 +43,9 @@ module Rfm
43
43
  class Layout
44
44
 
45
45
  class SubLayout < DelegateClass(Layout)
46
+ # Added by wbr to give config heirarchy: layout -> model -> sublayout
47
+ include Config
48
+
46
49
  include Layout::LayoutModule
47
50
  attr_accessor :model, :parent_layout
48
51
 
@@ -79,6 +82,10 @@ module Rfm
79
82
  @layout = layout_obj
80
83
  end
81
84
  @model = model_class
85
+
86
+ # Added by wbr to give config heirarchy: layout -> model -> sublayout
87
+ model.config :parent=>'@layout.parent_layout'
88
+ config :parent=>'model'
82
89
  end
83
90
  sub.model.to_s.constantize
84
91
  rescue StandardError, SyntaxError
@@ -172,7 +179,7 @@ module Rfm
172
179
  end
173
180
 
174
181
  def initialize(record={}, resultset_obj=[], field_meta='', layout_obj=self.class.layout, portal=nil)
175
- if resultset_obj == [] and !record.has_key? 'field'
182
+ if resultset_obj == [] and !record.respond_to?(:columns) #.has_key? 'field'
176
183
  @mods = Rfm::CaseInsensitiveHash.new
177
184
  @layout = layout_obj
178
185
  @resultset = Resultset.allocate
@@ -219,10 +226,20 @@ module Rfm
219
226
  return @layout if @layout
220
227
  cnf = get_config
221
228
  return unless cnf[:layout]
222
- @layout = Rfm::Factory.layout(get_config).sublayout
229
+ @layout = Rfm::Factory.layout(cnf).sublayout
230
+
231
+ # Added by wbr to give config heirarchy: layout -> model -> sublayout
232
+ config :parent=>'parent_layout'
233
+ @layout.config :parent=>'model'
234
+
223
235
  @layout.model = self
224
236
  @layout
225
237
  end
238
+
239
+ # Access the parent layout of this model
240
+ def parent_layout
241
+ layout.parent_layout
242
+ end
226
243
 
227
244
  # Just like Layout#find, but searching by record_id will return a record, not a resultset.
228
245
  def find(find_criteria, options={})
data/lib/rfm/database.rb CHANGED
@@ -58,6 +58,7 @@ module Rfm
58
58
  # * *name* is the name of this database
59
59
  # * *state* is a hash of all server options used to initialize this server
60
60
  class Database
61
+ include Config
61
62
 
62
63
  # Initialize a database object. You never really need to do this. Instead, just do this:
63
64
  #
@@ -65,21 +66,40 @@ module Rfm
65
66
  # myDatabase = myServer["Customers"]
66
67
  #
67
68
  # This sample code gets a database object representing the Customers database on the FileMaker server.
68
- def initialize(name, server_obj, acnt=nil, pass=nil)
69
- raise Rfm::Error::RfmError.new(0, "New instance of Rfm::Database has no name. Attempted name '#{name}'.") if name.to_s == ''
70
- @name = name.to_s
71
- rfm_metaclass.instance_variable_set :@server, server_obj
72
- @account_name = acnt #server.state[:account_name] or ""
73
- @password = pass #server.state[:password] or ""
74
- @layout = Rfm::Factory::LayoutFactory.new(server, self)
75
- @script = Rfm::Factory::ScriptFactory.new(server, self)
69
+ def initialize(*args) #name, server_obj, acnt=nil, pass=nil
70
+ options = get_config(*args)
71
+ rfm_metaclass.instance_variable_set :@server, (options[:objects].delete_at(0) || options[:server_object])
72
+ options = get_config(options)
73
+
74
+ config sanitize_config(options, {}, true)
75
+ config :parent=> 'server'
76
+ config :database=> options[:strings].delete_at(0) || options[:database]
77
+ config :account_name=> options[:strings].delete_at(0) || options[:account_name]
78
+ config :password=> options[:strings].delete_at(0) || options[:password]
79
+
80
+ raise Rfm::Error::RfmError.new(0, "New instance of Rfm::Database has no name. Attempted name '#{state[:database]}'.") if state[:database].to_s == ''
81
+
82
+ @layouts = Rfm::Factory::LayoutFactory.new(server, self)
83
+ @scripts = Rfm::Factory::ScriptFactory.new(server, self)
76
84
  end
77
85
 
78
86
  meta_attr_reader :server
79
- #attr_reader :server
80
- attr_reader :name, :account_name, :password, :layout, :script
81
- attr_writer :account_name, :password
82
- alias_method :layouts, :layout
87
+ attr_reader :layouts, :scripts
88
+ # Not sure if these writers are ever used
89
+ #attr_writer :account_name, :password
90
+ # Legacy methods
91
+ alias_method :layout, :layouts
92
+ alias_method :script, :scripts
93
+
94
+ def name; state[:database].to_s; end
95
+ def account_name; state[:account_name]; end
96
+ def account_name=(x); config :account_name=>x; end
97
+ def password; state[:password]; end
98
+ def password=(x); config :password=>x; end
99
+
100
+ def state(*args)
101
+ get_config(*args)
102
+ end
83
103
 
84
104
  # Access the Layout object representing a layout in this database. For example:
85
105
  #
@@ -95,7 +115,7 @@ module Rfm
95
115
  # def [](layout_name)
96
116
  # self.layout[layout_name]
97
117
  # end
98
- def_delegator :layout, :[]
118
+ def_delegator :layouts, :[]
99
119
 
100
120
  end
101
121
  end
data/lib/rfm/layout.rb CHANGED
@@ -119,6 +119,7 @@ module Rfm
119
119
  # list that is attached to any field on the layout
120
120
 
121
121
  class Layout
122
+ include Config
122
123
 
123
124
  # Initialize a layout object. You never really need to do this. Instead, just do this:
124
125
  #
@@ -133,32 +134,44 @@ module Rfm
133
134
  #
134
135
  # myServer = Rfm::Server.new(...)
135
136
  # myLayout = myServer["Customers"]["Details"]
136
- def initialize(name, db_obj)
137
- raise Rfm::Error::RfmError.new(0, "New instance of Rfm::Layout has no name. Attempted name '#{name}'.") if name.to_s == ''
138
- @name = name.to_s
139
- rfm_metaclass.instance_variable_set :@db, db_obj
140
-
137
+ def initialize(*args) #name, db_obj
138
+ options = get_config(*args)
139
+ rfm_metaclass.instance_variable_set :@db, (options[:objects].delete_at(0) || options[:database_object])
140
+ config :parent=> 'db'
141
+ options = get_config(options)
142
+
143
+ config sanitize_config(options, {}, true)
144
+ config :layout => options[:strings].delete_at(0) || options[:layout]
145
+
146
+ raise Rfm::Error::RfmError.new(0, "New instance of Rfm::Layout has no name. Attempted name '#{state[:layout]}'.") if state[:layout].to_s == ''
147
+
141
148
  @loaded = false
142
149
  @field_controls = Rfm::CaseInsensitiveHash.new
143
150
  @value_lists = Rfm::CaseInsensitiveHash.new
144
- # @portal_meta = nil
145
- # @field_names = nil
146
- @ignore_bad_data = (db_obj.server.state[:ignore_bad_data] rescue nil)
151
+ # @portal_meta = nil
152
+ # @field_names = nil
153
+ #@ignore_bad_data = (db_obj.server.state[:ignore_bad_data] rescue nil)
147
154
  end
148
155
 
149
156
  meta_attr_reader :db
150
- attr_reader :name #, :db
157
+ #attr_reader :name #, :db
151
158
  attr_writer :field_names, :portal_meta, :table
152
159
  def_delegator :db, :server
153
160
  alias_method :database, :db
154
-
161
+
162
+ # This method may be obsolete, since the option can now be set with #config.
163
+ def ignore_bad_data(val = nil)
164
+ (config :ignore_bad_data => val) unless val.nil?
165
+ state[:ignore_bad_data]
166
+ end
155
167
 
156
168
  # These methods are to be inclulded in Layout and SubLayout, so that
157
- # they have their own descrete 'self' in the master class and the subclass.
169
+ # they have their own discrete 'self' in the master class and the subclass.
158
170
  # This means these methods will not get forwarded, and will talk to the correct
159
171
  # variables & objects of the correct self.
160
172
  # Do not get or set instance variables in Layout from other objects directly,
161
173
  # always use getter & setter methods.
174
+ # This all means that any chain of methods that want to refer ultimately to Sublayout, must all be defined or included in Sublayout
162
175
  module LayoutModule
163
176
 
164
177
  # Returns a ResultSet object containing _every record_ in the table associated with this layout.
@@ -251,9 +264,13 @@ module Rfm
251
264
  end
252
265
 
253
266
  def get_records(action, extra_params = {}, options = {})
267
+ # The grammar stuff here won't work properly until you handle config between models/sublayouts/layout/server.
268
+ grammar_option = state(options)[:grammar]
269
+ options.merge!(:grammar=>grammar_option) if grammar_option
254
270
  include_portals = options[:include_portals] ? options.delete(:include_portals) : nil
255
- xml_response = db.server.connect(db.account_name, db.password, action, params.merge(extra_params), options).body
256
- Rfm::Resultset.new(db.server, xml_response, self, include_portals)
271
+ xml_response = server.connect(state[:account_name], state[:password], action, params.merge(extra_params), options).body
272
+ #Rfm::Resultset.new(db.server, xml_response, self, include_portals)
273
+ Rfm::Resultset.new(xml_response, self, include_portals)
257
274
  end
258
275
 
259
276
  def params
@@ -281,9 +298,35 @@ module Rfm
281
298
  end
282
299
  hash
283
300
  end
301
+
302
+ def name; state[:layout].to_s; end
284
303
 
304
+ def state(*args)
305
+ get_config(*args)
306
+ end
307
+
285
308
  end # LayoutModule
309
+
286
310
  include LayoutModule
311
+
312
+
313
+ ###
314
+ def view_meta
315
+ @view_meta ||= view
316
+ end
317
+ def date_format
318
+ @date_format ||= view_meta.date_format
319
+ end
320
+ def time_format
321
+ @time_format ||= view_meta.time_format
322
+ end
323
+ def timestamp_format
324
+ @timestamp_format ||= view_meta.timestamp_format
325
+ end
326
+ def field_meta
327
+ @field_meta ||= view_meta.field_meta
328
+ end
329
+ ###
287
330
 
288
331
 
289
332
  def field_controls
@@ -377,11 +420,6 @@ module Rfm
377
420
  @field_controls.freeze
378
421
  end
379
422
 
380
- def ignore_bad_data(val = nil)
381
- (@ignore_bad_data = val) unless val.nil?
382
- @ignore_bad_data
383
- end
384
-
385
423
  private :load, :get_records, :params
386
424
 
387
425
 
@@ -64,11 +64,11 @@ module Rfm
64
64
  # Initializes a field object. You'll never need to do this. Instead, get your Field objects from
65
65
  # ResultSet::fields
66
66
  def initialize(field)
67
- @name = field['name']
68
- @result = field['result']
69
- @type = field['type']
70
- @max_repeats = field['max-repeats']
71
- @global = field['global']
67
+ @name = field.name #['name']
68
+ @result = field.result #['result']
69
+ @type = field.type #['type']
70
+ @max_repeats = field.max_repeats #['max-repeats']
71
+ @global = field.global #['global']
72
72
  end
73
73
 
74
74
  # Coerces the text value from an +fmresultset+ document into proper Ruby types based on the
@@ -76,7 +76,7 @@ module Rfm
76
76
  # access field data through the Record object.
77
77
  def coerce(value, resultset)
78
78
  return nil if (value.nil? or value.empty?)
79
- case self.result
79
+ case self.result.downcase
80
80
  when "text" then value
81
81
  when "number" then BigDecimal.new(value)
82
82
  when "date" then Date.strptime(value, resultset.date_format)
data/lib/rfm/record.rb CHANGED
@@ -114,27 +114,26 @@ module Rfm
114
114
  def_delegators :layout, :db, :database, :server
115
115
 
116
116
  def initialize(record, resultset_obj, field_meta, layout_obj, portal=nil)
117
-
117
+
118
118
  @layout = layout_obj
119
119
  @resultset = resultset_obj
120
- @record_id = record['record-id']
121
- @mod_id = record['mod-id']
120
+ @record_id = record.record_id rescue nil
121
+ @mod_id = record.mod_id rescue nil
122
122
  @mods = {}
123
123
  @portals ||= Rfm::CaseInsensitiveHash.new
124
124
 
125
- relatedsets = !portal && resultset_obj.instance_variable_get(:@include_portals) ? record['relatedset'].rfm_force_array : []
126
-
127
- record['field'].rfm_force_array.each do |field|
125
+ relatedsets = !portal && resultset_obj.instance_variable_get(:@include_portals) ? record.portals : []
126
+
127
+ record.columns.each do |field|
128
128
  next unless field
129
- field_name = field['name']
129
+ field_name = field.name
130
130
  field_name.gsub!(Regexp.new(portal + '::'), '') if portal
131
131
  datum = []
132
-
133
- data = field['data']; data = data.is_a?(Hash) ? [data] : data
132
+ data = field.data #['data']; data = data.is_a?(Hash) ? [data] : data
134
133
  data.each do |x|
135
134
  next unless field_meta[field_name]
136
135
  begin
137
- datum.push(field_meta[field_name].coerce(x['__content__'], resultset_obj))
136
+ datum.push(field_meta[field_name].coerce(x, resultset_obj)) #(x['__content__'], resultset_obj))
138
137
  rescue StandardError => error
139
138
  self.errors.add(field_name, error) if self.respond_to? :errors
140
139
  raise error unless @layout.ignore_bad_data
@@ -153,9 +152,9 @@ module Rfm
153
152
  unless relatedsets.empty?
154
153
  relatedsets.each do |relatedset|
155
154
  next if relatedset.blank?
156
- tablename, records = relatedset['table'], []
155
+ tablename, records = relatedset.table, []
157
156
 
158
- relatedset['record'].rfm_force_array.each do |record|
157
+ relatedset.records.each do |record|
159
158
  next unless record
160
159
  records << self.class.new(record, resultset_obj, resultset_obj.portal_meta[tablename], layout_obj, tablename)
161
160
  end
@@ -223,15 +222,39 @@ module Rfm
223
222
  super
224
223
  end
225
224
 
226
-
227
225
  def []=(key, value)
228
226
  key_string = key.to_s.downcase
229
227
  return super unless @loaded # is this needed?
230
228
  raise Rfm::ParameterError, "You attempted to modify a field that does not exist in the current Filemaker layout." unless self.key?(key_string)
231
- @mods[key_string] = value
229
+ # @mods[key_string] = value
230
+ # TODO: This needs cleaning up.
231
+ # TODO: can we get field_type from record instead?
232
+ @mods[key_string] = if [Date, Time, DateTime].member?(value.class)
233
+ field_type = layout.field_meta[key_string.to_sym].result
234
+ case field_type
235
+ when 'time'; val.strftime(layout.time_format)
236
+ when 'date'; val.strftime(layout.date_format)
237
+ when 'timestamp'; val.strftime(layout.timestamp_format)
238
+ else value
239
+ end
240
+ else value
241
+ end
232
242
  super(key, value)
233
243
  end
234
-
244
+ #
245
+ # alias_method :old_setter, '[]='
246
+ # def []=(key,val)
247
+ # old_setter(key,val)
248
+ # return val unless [Date, Time, DateTime].member? val.class
249
+ # field_type = layout.field_meta[key.to_sym].result
250
+ # @mods[key] = case field_type
251
+ # when 'time'; val.strftime(layout.time_format)
252
+ # when 'date'; val.strftime(layout.date_format)
253
+ # when 'timestamp'; val.strftime(layout.timestamp_format)
254
+ # else val
255
+ # end
256
+ # end
257
+
235
258
  def field_names
236
259
  resultset.field_names rescue layout.field_names
237
260
  end
data/lib/rfm/resultset.rb CHANGED
@@ -36,12 +36,18 @@ 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
39
40
 
40
- attr_reader :layout, :server
41
- attr_reader :field_meta, :portal_meta
41
+ attr_reader :layout, :database, :server, :caller, :doc
42
+ attr_reader :field_meta, :portal_meta, :include_portals, :datasource
42
43
  attr_reader :date_format, :time_format, :timestamp_format
43
44
  attr_reader :total_count, :foundset_count, :table
44
- def_delegators :layout, :db, :database
45
+ #def_delegators :layout, :db, :database
46
+ alias_method :db, :database
47
+
48
+ class << self
49
+ alias_method :load_data, :new
50
+ end
45
51
 
46
52
  # Initializes a new ResultSet object. You will probably never do this your self (instead, use the Layout
47
53
  # object to get various ResultSet obejects).
@@ -64,53 +70,72 @@ module Rfm
64
70
  # * *portals* is a hash (with table occurrence names for keys and Field objects for values). If your
65
71
  # layout contains portals, you can find out what fields they contain here. Again, if it's the data you're
66
72
  # after, you want to look at the Record object.
67
-
68
- def initialize(server_obj, xml_response, layout_obj, portals=nil)
69
- @layout = layout_obj
70
- @server = server_obj
71
- @field_meta ||= Rfm::CaseInsensitiveHash.new
72
- @portal_meta ||= Rfm::CaseInsensitiveHash.new
73
- @include_portals = portals
73
+ def initialize(*args) # xml_response, caller, portals
74
+ #Was (server_obj, xml_response, layout_obj, portals=nil)
75
+
76
+ options = args.rfm_extract_options!
77
+ config :parent=>'caller'
78
+ config sanitize_config(options, {}, true)
74
79
 
75
- doc = XmlParser.new(xml_response, :namespace=>false, :parser=>(server.state[:parser] rescue nil))
80
+ xml_response = args[0] || options[:xml_response]
81
+ doc = XmlParser.parse(xml_response, :namespace=>false, :parser=>(state[:parser] rescue nil))
76
82
 
77
- error = doc['fmresultset']['error']['code'].to_i
83
+ error = doc.error
78
84
  check_for_errors(error, (server.state[:raise_on_401] rescue nil))
85
+
86
+ @doc = doc
87
+ @caller = args[1] || options[:caller]
88
+ @layout = (@caller.class.ancestors.include? Rfm::Layout::LayoutModule) ? @caller : options[:layout_object]
89
+ @database = (@layout.database rescue nil) || (@caller.class == Rfm::Database ? @caller : options[:database_object])
90
+ @server = (@database.server rescue nil) || (@caller.class == Rfm::Server ? @caller : options[:server_object])
91
+ @field_meta ||= Rfm::CaseInsensitiveHash.new
92
+ @portal_meta ||= Rfm::CaseInsensitiveHash.new
93
+ @include_portals = args[2] || options[:include_portals]
79
94
 
80
- @datasource = doc['fmresultset']['datasource']
81
- meta = doc['fmresultset']['metadata']
82
- resultset = doc['fmresultset']['resultset']
95
+ @datasource = doc.datasource
96
+ meta = doc.meta
97
+ resultset = doc.resultset
83
98
 
84
- @date_format = convert_date_time_format(@datasource['date-format'].to_s)
85
- @time_format = convert_date_time_format(@datasource['time-format'].to_s)
86
- @timestamp_format = convert_date_time_format(@datasource['timestamp-format'].to_s)
99
+ @date_format = doc.date_format
100
+ @time_format = doc.time_format
101
+ @timestamp_format = doc.timestamp_format
87
102
 
88
- @foundset_count = resultset['count'].to_s.to_i
89
- @total_count = @datasource['total-count'].to_s.to_i
90
- @table = @datasource['table']
91
-
103
+ @foundset_count = doc.foundset_count
104
+ @total_count = doc.total_count
105
+ @table = doc.table
106
+
92
107
  (layout.table = @table) if layout and layout.table_no_load.blank?
93
108
 
94
- parse_fields(meta)
109
+ parse_fields(doc)
95
110
 
96
111
  # This will always load portal meta, even if :include_portals was not specified.
97
112
  # See Record for control of portal data loading.
98
- parse_portals(meta)
113
+ parse_portals(doc)
99
114
 
100
115
  # These were added for loading resultset from file
101
- unless @layout
102
- @layout = @datasource['layout']
103
- @layout.instance_variable_set '@database', @datasource['database']
104
- @layout.instance_eval do
105
- def database
106
- @database
107
- end
108
- end
109
- end
116
+ # Kind of a hack. This should ideally condense down to just another option on the main @layout = ...
117
+ # unless @layout
118
+ # @layout = @datasource['layout']
119
+ # @layout.instance_variable_set '@database', @datasource['database']
120
+ # @layout.instance_eval do
121
+ # def database
122
+ # @database
123
+ # end
124
+ # end
125
+ # end
110
126
 
111
- return if resultset['record'].nil?
112
- Rfm::Record.build_records(resultset['record'].rfm_force_array, self, @field_meta, @layout)
127
+ return if doc.records.blank?
128
+ Rfm::Record.build_records(doc.records, self, @field_meta, @layout)
113
129
  end
130
+
131
+ # Load Resultset data from file-spec or string
132
+ # def self.load_data(file_or_string)
133
+ # self.new(file_or_string, nil)
134
+ # end
135
+
136
+ def state(*args)
137
+ get_config(*args)
138
+ end
114
139
 
115
140
  def field_names
116
141
  field_meta.collect{|k,v| v.name}
@@ -120,34 +145,29 @@ module Rfm
120
145
  portal_meta.keys
121
146
  end
122
147
 
123
- # Load Resultset data from file-spec or string
124
- def self.load_data(file_or_string)
125
- self.new(nil, file_or_string, nil)
126
- end
127
-
128
148
  private
129
149
 
130
150
  def check_for_errors(code, raise_401)
131
151
  raise Rfm::Error.getError(code) if code != 0 && (code != 401 || raise_401)
132
152
  end
133
153
 
134
- def parse_fields(meta)
135
- return if meta['field-definition'].blank?
154
+ def parse_fields(doc)
155
+ return if doc.fields.blank?
136
156
 
137
- meta['field-definition'].rfm_force_array.each do |field|
138
- @field_meta[field['name']] = Rfm::Metadata::Field.new(field)
157
+ doc.fields.each do |field|
158
+ @field_meta[field.name] = Rfm::Metadata::Field.new(field)
139
159
  end
140
160
  (layout.field_names = field_names) if layout and layout.field_names_no_load.blank?
141
161
  end
142
162
 
143
- def parse_portals(meta)
144
- return if meta['relatedset-definition'].blank?
145
- meta['relatedset-definition'].rfm_force_array.each do |relatedset|
163
+ def parse_portals(doc)
164
+ return if doc.portals.blank?
165
+ doc.portals.each do |relatedset|
146
166
  next if relatedset.blank?
147
- table, fields = relatedset['table'], {}
167
+ table, fields = relatedset.table, {}
148
168
 
149
- relatedset['field-definition'].rfm_force_array.each do |field|
150
- name = field['name'].to_s.gsub(Regexp.new(table + '::'), '')
169
+ relatedset.fields.each do |field|
170
+ name = field.name.to_s.gsub(Regexp.new(table + '::'), '')
151
171
  fields[name] = Rfm::Metadata::Field.new(field)
152
172
  end
153
173
 
@@ -156,15 +176,15 @@ module Rfm
156
176
  (layout.portal_meta = @portal_meta) if layout and layout.portal_meta_no_load.blank?
157
177
  end
158
178
 
159
- def convert_date_time_format(fm_format)
160
- fm_format.gsub!('MM', '%m')
161
- fm_format.gsub!('dd', '%d')
162
- fm_format.gsub!('yyyy', '%Y')
163
- fm_format.gsub!('HH', '%H')
164
- fm_format.gsub!('mm', '%M')
165
- fm_format.gsub!('ss', '%S')
166
- fm_format
167
- end
179
+ # def convert_date_time_format(fm_format)
180
+ # fm_format.gsub!('MM', '%m')
181
+ # fm_format.gsub!('dd', '%d')
182
+ # fm_format.gsub!('yyyy', '%Y')
183
+ # fm_format.gsub!('HH', '%H')
184
+ # fm_format.gsub!('mm', '%M')
185
+ # fm_format.gsub!('ss', '%S')
186
+ # fm_format
187
+ # end
168
188
 
169
189
  end
170
190
  end