mkxms-mssql 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -10
  3. data/lib/mkxms/mssql.rb +18 -0
  4. data/lib/mkxms/mssql/adoption_script_writer.rb +759 -91
  5. data/lib/mkxms/mssql/clr_aggregate_handler.rb +98 -0
  6. data/lib/mkxms/mssql/clr_assembly_handler.rb +92 -0
  7. data/lib/mkxms/mssql/clr_function_handler.rb +172 -0
  8. data/lib/mkxms/mssql/clr_impl.rb +58 -0
  9. data/lib/mkxms/mssql/clr_stored_procedure_handler.rb +88 -0
  10. data/lib/mkxms/mssql/clr_type_handler.rb +92 -0
  11. data/lib/mkxms/mssql/database_handler.rb +124 -3
  12. data/lib/mkxms/mssql/declaratives_creator.rb +206 -0
  13. data/lib/mkxms/mssql/dml_trigger_handler.rb +107 -0
  14. data/lib/mkxms/mssql/filegroup_handler.rb +1 -4
  15. data/lib/mkxms/mssql/function_handler.rb +1 -4
  16. data/lib/mkxms/mssql/indented_string_builder.rb +8 -2
  17. data/lib/mkxms/mssql/index_handler.rb +1 -4
  18. data/lib/mkxms/mssql/keywords.rb +492 -0
  19. data/lib/mkxms/mssql/primary_key_handler.rb +1 -4
  20. data/lib/mkxms/mssql/property_handler.rb +8 -0
  21. data/lib/mkxms/mssql/query_cursor.rb +12 -4
  22. data/lib/mkxms/mssql/references_handler.rb +24 -0
  23. data/lib/mkxms/mssql/role_handler.rb +1 -4
  24. data/lib/mkxms/mssql/scalar_type_handler.rb +108 -0
  25. data/lib/mkxms/mssql/schema_handler.rb +1 -4
  26. data/lib/mkxms/mssql/sql_string_manipulators.rb +4 -4
  27. data/lib/mkxms/mssql/statistics_handler.rb +1 -4
  28. data/lib/mkxms/mssql/stored_procedure_handler.rb +1 -4
  29. data/lib/mkxms/mssql/synonym_handler.rb +40 -0
  30. data/lib/mkxms/mssql/table_handler.rb +2 -8
  31. data/lib/mkxms/mssql/table_type_handler.rb +254 -0
  32. data/lib/mkxms/mssql/utils.rb +96 -0
  33. data/lib/mkxms/mssql/version.rb +1 -1
  34. data/lib/mkxms/mssql/view_handler.rb +1 -4
  35. data/spec/utils/indented_string_builder_spec.rb +21 -0
  36. data/spec/utils/query_cursor_spec.rb +2 -2
  37. data/spec/utils/sql_string_manipulators_spec.rb +59 -0
  38. metadata +18 -3
@@ -0,0 +1,107 @@
1
+ require 'mkxms/mssql/clr_impl'
2
+ require 'mkxms/mssql/references_handler'
3
+ require 'mkxms/mssql/utils'
4
+
5
+ module Mkxms; end
6
+
7
+ module Mkxms::Mssql
8
+ class Trigger
9
+ extend Utils::InitializedAttributes
10
+ include ExtendedProperties, Property::Hosting, Property::SchemaScoped
11
+ include Dependencies
12
+ include Utils::SchemaQualifiedName
13
+ include XMigra::MSSQLSpecifics
14
+
15
+ def initialize(schema, name, timing, execute_as: nil, disabled: false, not_replicable: false)
16
+ @schema = schema
17
+ @name = name
18
+ @timing = timing
19
+ @execute_as = execute_as
20
+ @disabled = disabled
21
+ @not_replicable = not_replicable
22
+ end
23
+
24
+ attr_accessor :schema, :name, :table, :timing, :execute_as, :disabled, :not_replicable, :clr_impl
25
+ attr_init(:events) {[]}
26
+ attr_init(:definition) {""}
27
+
28
+ def to_sql
29
+ def_sql = clr_impl ? clr_definition : definition
30
+ [def_sql.expand_tabs.gsub(/ +\n/, "\n")].tap do |result|
31
+ unless (ep_sql = extended_properties_sql).empty?
32
+ result << ep_sql.joined_on_new_lines
33
+ end
34
+ if disabled
35
+ result << "DISABLE TRIGGER #{qualified_name} ON #{table.qualified_name};"
36
+ end
37
+ end.join(ddl_block_separator)
38
+ end
39
+
40
+ def clr_definition
41
+ [].tap do |lines|
42
+ lines << "CREATE TRIGGER #{schema}.#{name}"
43
+ lines << "ON #{table.qualified_name}"
44
+ case execute_as
45
+ when 'OWNER'
46
+ lines << "WITH EXECUTE AS OWNER"
47
+ when String
48
+ lines << "WITH EXECUTE AS #{execute_as.sql_quoted}"
49
+ end
50
+ lines << "#{timing} #{events.join(', ')}"
51
+ lines << "NOT FOR REPLICATION" if not_replicable
52
+ lines << "AS EXTERNAL NAME #{clr_impl.full_specifier};"
53
+ end.join("\n")
54
+ end
55
+ end
56
+
57
+ class DmlTriggerHandler
58
+ extend XMigra::MSSQLSpecifics
59
+ include PropertyHandler::ElementHandler
60
+ include ReferencesHandler::ElementHandler
61
+
62
+ def initialize(triggers, node)
63
+ a = node.attributes
64
+
65
+ @trigger = Trigger.new(
66
+ a['schema'],
67
+ a['name'],
68
+ a['timing'],
69
+ execute_as: a['execute_as'],
70
+ disabled: a['disabled'],
71
+ not_replicable: a['not-for-replication'],
72
+ ).tap do |t|
73
+ store_properties_on t
74
+ triggers << t
75
+ end
76
+ end
77
+
78
+ def dependencies
79
+ @trigger.dependencies
80
+ end
81
+
82
+ def handle_table_element(parse)
83
+ a = parse.node.attributes
84
+ @trigger.table = Reference.new(a['schema'], a['name'])
85
+ end
86
+
87
+ def handle_event_element(parse)
88
+ a = parse.node.attributes
89
+ @trigger.events << a['type']
90
+ end
91
+
92
+ def handle_do_element(parse); end
93
+
94
+ def handle_text(text, parent_element)
95
+ case [parent_element.namespace, parent_element.name]
96
+ when ['', 'do']
97
+ @trigger.definition << text
98
+ end
99
+ end
100
+
101
+ # This function handles a CLR implementation
102
+ def handle_implementation_element(parse)
103
+ a = parse.node.attributes
104
+ @trigger.clr_impl = ClrMethod.new(a['assembly'], a['class'], a['method'])
105
+ end
106
+ end
107
+ end
@@ -31,15 +31,12 @@ module Mkxms::Mssql
31
31
  end
32
32
  ]
33
33
  @filegroup = Filegroup.new(**group_options).tap do |fg|
34
+ store_properties_on fg
34
35
  filegroups << fg
35
36
  end
36
37
  @files = []
37
38
  end
38
39
 
39
- def extended_properties
40
- @filegroup.extended_properties
41
- end
42
-
43
40
  def handle_file_element(parse)
44
41
  parse.context = DatabaseFile.new(@files, parse.node)
45
42
  end
@@ -45,14 +45,11 @@ module Mkxms::Mssql
45
45
  a = node.attributes
46
46
 
47
47
  @function = Function.new(a).tap do |f|
48
+ store_properties_on f
48
49
  functions << f
49
50
  end
50
51
  end
51
52
 
52
- def extended_properties
53
- @function.extended_properties
54
- end
55
-
56
53
  def handle_definition_element(parse); end
57
54
 
58
55
  def handle_references_element(parse)
@@ -48,7 +48,13 @@ module Mkxms::Mssql
48
48
 
49
49
  def puts(*args, &blk)
50
50
  if blk
51
- @builder.puts(*args) {IndentedStringBuilder.new.tap {|i| i.dsl(&blk)}}
51
+ if args[0].kind_of? Range
52
+ @builder.puts(args[0].begin, *args[1..-1])
53
+ indented(&blk)
54
+ @builder.puts(args[0].end, *args[1..-1])
55
+ else
56
+ @builder.puts(*args) {IndentedStringBuilder.new.tap {|i| i.dsl(&blk)}}
57
+ end
52
58
  else
53
59
  @builder.puts(*args)
54
60
  end
@@ -123,7 +129,7 @@ module Mkxms::Mssql
123
129
  subbed_multiline = false
124
130
  s.scan(scan_pattern) do |m|
125
131
  chunk_range, completed = completed...$~.begin(0), $~.end(0)
126
- chunk_empty = !chunk_range.cover?(chunk_range.begin)
132
+ chunk_empty = !chunk_range.cover?(chunk_range.begin) && s != ''
127
133
 
128
134
  case
129
135
  when m == "\n"
@@ -75,14 +75,11 @@ module Mkxms::Mssql
75
75
 
76
76
  def initialize(indexes, node)
77
77
  @index = Index.new(node.attributes).tap do |i|
78
+ store_properties_on i
78
79
  indexes << i
79
80
  end
80
81
  end
81
82
 
82
- def extended_properties
83
- @index.extended_properties
84
- end
85
-
86
83
  def handle_column_element(parse)
87
84
  a = parse.node.attributes
88
85
 
@@ -0,0 +1,492 @@
1
+ require 'set'
2
+
3
+ module Mkxms; end
4
+
5
+ module Mkxms::Mssql
6
+ KEYWORDS = %w[
7
+ ABSOLUTE
8
+ ACTION
9
+ ADA
10
+ ADD
11
+ ADMIN
12
+ AFTER
13
+ AGGREGATE
14
+ ALIAS
15
+ ALL
16
+ ALLOCATE
17
+ ALTER
18
+ AND
19
+ ANY
20
+ ARE
21
+ ARRAY
22
+ AS
23
+ ASC
24
+ ASENSITIVE
25
+ ASSERTION
26
+ ASYMMETRIC
27
+ AT
28
+ ATOMIC
29
+ AUTHORIZATION
30
+ AVG
31
+ BACKUP
32
+ BEFORE
33
+ BEGIN
34
+ BETWEEN
35
+ BINARY
36
+ BIT
37
+ BIT_LENGTH
38
+ BLOB
39
+ BOOLEAN
40
+ BOTH
41
+ BREADTH
42
+ BREAK
43
+ BROWSE
44
+ BULK
45
+ BY
46
+ CALL
47
+ CALLED
48
+ CARDINALITY
49
+ CASCADE
50
+ CASCADED
51
+ CASE
52
+ CAST
53
+ CATALOG
54
+ CHAR
55
+ CHARACTER
56
+ CHARACTER_LENGTH
57
+ CHAR_LENGTH
58
+ CHECK
59
+ CHECKPOINT
60
+ CLASS
61
+ CLOB
62
+ CLOSE
63
+ CLUSTERED
64
+ COALESCE
65
+ COLLATE
66
+ COLLATION
67
+ COLLECT
68
+ COLUMN
69
+ COMMIT
70
+ COMPLETION
71
+ COMPUTE
72
+ CONDITION
73
+ CONNECT
74
+ CONNECTION
75
+ CONSTRAINT
76
+ CONSTRAINTS
77
+ CONSTRUCTOR
78
+ CONTAINS
79
+ CONTAINSTABLE
80
+ CONTINUE
81
+ CONVERT
82
+ CORR
83
+ CORRESPONDING
84
+ COUNT
85
+ COVAR_POP
86
+ COVAR_SAMP
87
+ CREATE
88
+ CROSS
89
+ CUBE
90
+ CUME_DIST
91
+ CURRENT
92
+ CURRENT_CATALOG
93
+ CURRENT_DATE
94
+ CURRENT_DEFAULT_TRANSFORM_GROUP
95
+ CURRENT_PATH
96
+ CURRENT_ROLE
97
+ CURRENT_SCHEMA
98
+ CURRENT_TIME
99
+ CURRENT_TIMESTAMP
100
+ CURRENT_TRANSFORM_GROUP_FOR_TYPE
101
+ CURRENT_USER
102
+ CURSOR
103
+ CYCLE
104
+ DATA
105
+ DATABASE
106
+ DATE
107
+ DAY
108
+ DBCC
109
+ DEALLOCATE
110
+ DEC
111
+ DECIMAL
112
+ DECLARE
113
+ DEFAULT
114
+ DEFERRABLE
115
+ DEFERRED
116
+ DELETE
117
+ DENY
118
+ DEPTH
119
+ DEREF
120
+ DESC
121
+ DESCRIBE
122
+ DESCRIPTOR
123
+ DESTROY
124
+ DESTRUCTOR
125
+ DETERMINISTIC
126
+ DIAGNOSTICS
127
+ DICTIONARY
128
+ DISCONNECT
129
+ DISK
130
+ DISTINCT
131
+ DISTRIBUTED
132
+ DOMAIN
133
+ DOUBLE
134
+ DROP
135
+ DUMP
136
+ DYNAMIC
137
+ EACH
138
+ ELEMENT
139
+ ELSE
140
+ END
141
+ END-EXEC
142
+ EQUALS
143
+ ERRLVL
144
+ ESCAPE
145
+ EVERY
146
+ EXCEPT
147
+ EXCEPTION
148
+ EXEC
149
+ EXECUTE
150
+ EXISTS
151
+ EXIT
152
+ EXTERNAL
153
+ EXTRACT
154
+ FALSE
155
+ FETCH
156
+ FILE
157
+ FILLFACTOR
158
+ FILTER
159
+ FIRST
160
+ FLOAT
161
+ FOR
162
+ FOREIGN
163
+ FORTRAN
164
+ FOUND
165
+ FREE
166
+ FREETEXT
167
+ FREETEXTTABLE
168
+ FROM
169
+ FULL
170
+ FULLTEXTTABLE
171
+ FUNCTION
172
+ FUSION
173
+ GENERAL
174
+ GET
175
+ GLOBAL
176
+ GO
177
+ GOTO
178
+ GRANT
179
+ GROUP
180
+ GROUPING
181
+ HAVING
182
+ HOLD
183
+ HOLDLOCK
184
+ HOST
185
+ HOUR
186
+ IDENTITY
187
+ IDENTITYCOL
188
+ IDENTITY_INSERT
189
+ IF
190
+ IGNORE
191
+ IMMEDIATE
192
+ IN
193
+ INCLUDE
194
+ INDEX
195
+ INDICATOR
196
+ INITIALIZE
197
+ INITIALLY
198
+ INNER
199
+ INOUT
200
+ INPUT
201
+ INSENSITIVE
202
+ INSERT
203
+ INT
204
+ INTEGER
205
+ INTERSECT
206
+ INTERSECTION
207
+ INTERVAL
208
+ INTO
209
+ IS
210
+ ISOLATION
211
+ ITERATE
212
+ JOIN
213
+ KEY
214
+ KILL
215
+ LANGUAGE
216
+ LARGE
217
+ LAST
218
+ LATERAL
219
+ LEADING
220
+ LEFT
221
+ LESS
222
+ LEVEL
223
+ LIKE
224
+ LIKE_REGEX
225
+ LIMIT
226
+ LINENO
227
+ LN
228
+ LOAD
229
+ LOCAL
230
+ LOCALTIME
231
+ LOCALTIMESTAMP
232
+ LOCATOR
233
+ LOWER
234
+ MAP
235
+ MATCH
236
+ MAX
237
+ MEMBER
238
+ MERGE
239
+ METHOD
240
+ MIN
241
+ MINUTE
242
+ MOD
243
+ MODIFIES
244
+ MODIFY
245
+ MODULE
246
+ MONTH
247
+ MULTISET
248
+ NAMES
249
+ NATIONAL
250
+ NATURAL
251
+ NCHAR
252
+ NCLOB
253
+ NEW
254
+ NEXT
255
+ NO
256
+ NOCHECK
257
+ NONCLUSTERED
258
+ NONE
259
+ NORMALIZE
260
+ NOT
261
+ NULL
262
+ NULLIF
263
+ NUMERIC
264
+ OBJECT
265
+ OCCURRENCES_REGEX
266
+ OCTET_LENGTH
267
+ OF
268
+ OFF
269
+ OFFSETS
270
+ OLD
271
+ ON
272
+ ONLY
273
+ OPEN
274
+ OPENDATASOURCE
275
+ OPENQUERY
276
+ OPENROWSET
277
+ OPENXML
278
+ OPERATION
279
+ OPTION
280
+ OR
281
+ ORDER
282
+ ORDINALITY
283
+ OUT
284
+ OUTER
285
+ OUTPUT
286
+ OVER
287
+ OVERLAPS
288
+ OVERLAY
289
+ PAD
290
+ PARAMETER
291
+ PARAMETERS
292
+ PARTIAL
293
+ PARTITION
294
+ PASCAL
295
+ PATH
296
+ PERCENT
297
+ PERCENTILE_CONT
298
+ PERCENTILE_DISC
299
+ PERCENT_RANK
300
+ PIVOT
301
+ PLAN
302
+ POSITION
303
+ POSITION_REGEX
304
+ POSTFIX
305
+ PRECISION
306
+ PREFIX
307
+ PREORDER
308
+ PREPARE
309
+ PRESERVE
310
+ PRIMARY
311
+ PRINT
312
+ PRIOR
313
+ PRIVILEGES
314
+ PROC
315
+ PROCEDURE
316
+ PUBLIC
317
+ RAISERROR
318
+ RANGE
319
+ READ
320
+ READS
321
+ READTEXT
322
+ REAL
323
+ RECONFIGURE
324
+ RECURSIVE
325
+ REF
326
+ REFERENCES
327
+ REFERENCING
328
+ REGR_AVGX
329
+ REGR_AVGY
330
+ REGR_COUNT
331
+ REGR_INTERCEPT
332
+ REGR_R2
333
+ REGR_SLOPE
334
+ REGR_SXX
335
+ REGR_SXY
336
+ REGR_SYY
337
+ RELATIVE
338
+ RELEASE
339
+ REPLICATION
340
+ RESTORE
341
+ RESTRICT
342
+ RESULT
343
+ RETURN
344
+ RETURNS
345
+ REVERT
346
+ REVOKE
347
+ RIGHT
348
+ ROLE
349
+ ROLLBACK
350
+ ROLLUP
351
+ ROUTINE
352
+ ROW
353
+ ROWCOUNT
354
+ ROWGUIDCOL
355
+ ROWS
356
+ RULE
357
+ SAVE
358
+ SAVEPOINT
359
+ SCHEMA
360
+ SCOPE
361
+ SCROLL
362
+ SEARCH
363
+ SECOND
364
+ SECTION
365
+ SECURITYAUDIT
366
+ SELECT
367
+ SEMANTICKEYPHRASETABLE
368
+ SEMANTICSIMILARITYDETAILSTABLE
369
+ SEMANTICSIMILARITYTABLE
370
+ SENSITIVE
371
+ SEQUENCE
372
+ SESSION
373
+ SESSION_USER
374
+ SET
375
+ SETS
376
+ SETUSER
377
+ SHUTDOWN
378
+ SIMILAR
379
+ SIZE
380
+ SMALLINT
381
+ SOME
382
+ SPACE
383
+ SPECIFIC
384
+ SPECIFICTYPE
385
+ SQL
386
+ SQLCA
387
+ SQLCODE
388
+ SQLERROR
389
+ SQLEXCEPTION
390
+ SQLSTATE
391
+ SQLWARNING
392
+ START
393
+ STATE
394
+ STATEMENT
395
+ STATIC
396
+ STATISTICS
397
+ STDDEV_POP
398
+ STDDEV_SAMP
399
+ STRUCTURE
400
+ SUBMULTISET
401
+ SUBSTRING
402
+ SUBSTRING_REGEX
403
+ SUM
404
+ SYMMETRIC
405
+ SYSTEM
406
+ SYSTEM_USER
407
+ TABLE
408
+ TABLESAMPLE
409
+ TEMPORARY
410
+ TERMINATE
411
+ TEXTSIZE
412
+ THAN
413
+ THEN
414
+ TIME
415
+ TIMESTAMP
416
+ TIMEZONE_HOUR
417
+ TIMEZONE_MINUTE
418
+ TO
419
+ TOP
420
+ TRAILING
421
+ TRAN
422
+ TRANSACTION
423
+ TRANSLATE
424
+ TRANSLATE_REGEX
425
+ TRANSLATION
426
+ TREAT
427
+ TRIGGER
428
+ TRIM
429
+ TRUE
430
+ TRUNCATE
431
+ TRY_CONVERT
432
+ TSEQUAL
433
+ UESCAPE
434
+ UNDER
435
+ UNION
436
+ UNIQUE
437
+ UNKNOWN
438
+ UNNEST
439
+ UNPIVOT
440
+ UPDATE
441
+ UPDATETEXT
442
+ UPPER
443
+ USAGE
444
+ USE
445
+ USER
446
+ USING
447
+ VALUE
448
+ VALUES
449
+ VARCHAR
450
+ VARIABLE
451
+ VARYING
452
+ VAR_POP
453
+ VAR_SAMP
454
+ VIEW
455
+ WAITFOR
456
+ WHEN
457
+ WHENEVER
458
+ WHERE
459
+ WHILE
460
+ WIDTH_BUCKET
461
+ WINDOW
462
+ WITH
463
+ WITHIN
464
+ WITHOUT
465
+ WORK
466
+ WRITE
467
+ WRITETEXT
468
+ XMLAGG
469
+ XMLATTRIBUTES
470
+ XMLBINARY
471
+ XMLCAST
472
+ XMLCOMMENT
473
+ XMLCONCAT
474
+ XMLDOCUMENT
475
+ XMLELEMENT
476
+ XMLEXISTS
477
+ XMLFOREST
478
+ XMLITERATE
479
+ XMLNAMESPACES
480
+ XMLPARSE
481
+ XMLPI
482
+ XMLQUERY
483
+ XMLSERIALIZE
484
+ XMLTABLE
485
+ XMLTEXT
486
+ XMLVALIDATE
487
+ YEAR
488
+ ZONE
489
+ ]
490
+
491
+ KEYWORDS_SET = Set.new KEYWORDS
492
+ end