mkxms-mssql 1.0.0 → 1.1.0

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.
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