@@ -30,14 +30,8 @@ def create_function(name, options = {})
3030 version = options . fetch ( :version , 1 )
3131 sql_definition = options [ :sql_definition ]
3232
33- if version . nil? && sql_definition . nil?
34- raise (
35- ArgumentError ,
36- "version or sql_definition must be specified"
37- )
38- end
39- sql_definition = sql_definition . strip_heredoc if sql_definition
40- sql_definition ||= Fx ::Definition . function ( name : name , version : version ) . to_sql
33+ validate_version_or_sql_definition_present! ( version , sql_definition )
34+ sql_definition = resolve_sql_definition ( sql_definition , name , version , :function )
4135
4236 Fx . database . create_function ( sql_definition )
4337 end
@@ -90,15 +84,9 @@ def update_function(name, options = {})
9084 version = options [ :version ]
9185 sql_definition = options [ :sql_definition ]
9286
93- if version . nil? && sql_definition . nil?
94- raise (
95- ArgumentError ,
96- "version or sql_definition must be specified"
97- )
98- end
87+ validate_version_or_sql_definition_present! ( version , sql_definition )
9988
100- sql_definition = sql_definition . strip_heredoc if sql_definition
101- sql_definition ||= Fx ::Definition . function ( name : name , version : version ) . to_sql
89+ sql_definition = resolve_sql_definition ( sql_definition , name , version , :function )
10290
10391 Fx . database . update_function ( name , sql_definition )
10492 end
@@ -127,22 +115,13 @@ def update_function(name, options = {})
127115 #
128116 def create_trigger ( name , options = { } )
129117 version = options [ :version ]
130- _on = options [ :on ]
131118 sql_definition = options [ :sql_definition ]
132119
133- if version . present? && sql_definition . present?
134- raise (
135- ArgumentError ,
136- "sql_definition and version cannot both be set"
137- )
138- end
120+ validate_version_and_sql_definition_exclusive! ( version , sql_definition )
139121
140- if version . nil?
141- version = 1
142- end
122+ version ||= 1
143123
144- sql_definition = sql_definition . strip_heredoc if sql_definition
145- sql_definition ||= Fx ::Definition . trigger ( name : name , version : version ) . to_sql
124+ sql_definition = resolve_sql_definition ( sql_definition , name , version , :trigger )
146125
147126 Fx . database . create_trigger ( sql_definition )
148127 end
@@ -202,32 +181,56 @@ def update_trigger(name, options = {})
202181 on = options [ :on ]
203182 sql_definition = options [ :sql_definition ]
204183
205- if version . nil? && sql_definition . nil?
206- raise (
207- ArgumentError ,
208- "version or sql_definition must be specified"
209- )
210- end
211-
212- if version . present? && sql_definition . present?
213- raise (
214- ArgumentError ,
215- "sql_definition and version cannot both be set"
216- )
217- end
184+ validate_version_or_sql_definition_present! ( version , sql_definition )
185+ validate_version_and_sql_definition_exclusive! ( version , sql_definition )
218186
219187 if on . nil?
220188 raise ArgumentError , "on is required"
221189 end
222190
223- sql_definition = sql_definition . strip_heredoc if sql_definition
224- sql_definition ||= Fx ::Definition . trigger ( name : name , version : version ) . to_sql
191+ sql_definition = resolve_sql_definition ( sql_definition , name , version , :trigger )
225192
226193 Fx . database . update_trigger (
227194 name ,
228195 on : on ,
229196 sql_definition : sql_definition
230197 )
231198 end
199+
200+ private
201+
202+ VERSION_OR_SQL_DEFINITION_REQUIRED = "version or sql_definition must be specified" . freeze
203+ private_constant :VERSION_OR_SQL_DEFINITION_REQUIRED
204+
205+ VERSION_AND_SQL_DEFINITION_EXCLUSIVE = "sql_definition and version cannot both be set" . freeze
206+ private_constant :VERSION_AND_SQL_DEFINITION_EXCLUSIVE
207+
208+ def validate_version_or_sql_definition_present! ( version , sql_definition )
209+ if version . nil? && sql_definition . nil?
210+ raise ArgumentError , VERSION_OR_SQL_DEFINITION_REQUIRED , caller
211+ end
212+ end
213+
214+ def validate_version_and_sql_definition_exclusive! ( version , sql_definition )
215+ if version . present? && sql_definition . present?
216+ raise ArgumentError , VERSION_AND_SQL_DEFINITION_EXCLUSIVE , caller
217+ end
218+ end
219+
220+ def resolve_sql_definition ( sql_definition , name , version , type )
221+ return sql_definition . strip_heredoc if sql_definition
222+
223+ definition =
224+ case type
225+ when :function
226+ Fx ::Definition . function ( name : name , version : version )
227+ when :trigger
228+ Fx ::Definition . trigger ( name : name , version : version )
229+ else
230+ raise ArgumentError , "Unknown type: #{ type } . Must be :function or :trigger" , caller
231+ end
232+
233+ definition . to_sql
234+ end
232235 end
233236end
0 commit comments