instructure-pysqlsync 0.8.5.dev0__tar.gz → 0.8.5.dev1__tar.gz

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 (132) hide show
  1. {instructure_pysqlsync-0.8.5.dev0/instructure_pysqlsync.egg-info → instructure_pysqlsync-0.8.5.dev1}/PKG-INFO +1 -9
  2. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/README.md +0 -8
  3. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1/instructure_pysqlsync.egg-info}/PKG-INFO +1 -9
  4. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/instructure_pysqlsync.egg-info/SOURCES.txt +1 -0
  5. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/__init__.py +1 -1
  6. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/data_types.py +8 -2
  7. instructure_pysqlsync-0.8.5.dev1/tests/test_mssql_odbc_types.py +57 -0
  8. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/LICENSE +0 -0
  9. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/MANIFEST.in +0 -0
  10. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/instructure_pysqlsync.egg-info/dependency_links.txt +0 -0
  11. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/instructure_pysqlsync.egg-info/requires.txt +0 -0
  12. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/instructure_pysqlsync.egg-info/top_level.txt +0 -0
  13. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/instructure_pysqlsync.egg-info/zip-safe +0 -0
  14. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pyproject.toml +0 -0
  15. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/base.py +0 -0
  16. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/connection.py +0 -0
  17. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/data/__init__.py +0 -0
  18. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/data/exchange.py +0 -0
  19. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/data/generator.py +0 -0
  20. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/README.md +0 -0
  21. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/__init__.py +0 -0
  22. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/delta/__init__.py +0 -0
  23. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/delta/data_types.py +0 -0
  24. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/delta/dependency.py +0 -0
  25. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/delta/engine.py +0 -0
  26. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/delta/generator.py +0 -0
  27. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/delta/object_types.py +0 -0
  28. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/README.md +0 -0
  29. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/__init__.py +0 -0
  30. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/connection.py +0 -0
  31. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/dependency.py +0 -0
  32. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/discovery.py +0 -0
  33. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/engine.py +0 -0
  34. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/generator.py +0 -0
  35. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/mutation.py +0 -0
  36. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mssql/object_types.py +0 -0
  37. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/__init__.py +0 -0
  38. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/connection.py +0 -0
  39. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/data_types.py +0 -0
  40. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/dependency.py +0 -0
  41. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/discovery.py +0 -0
  42. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/engine.py +0 -0
  43. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/generator.py +0 -0
  44. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/mutation.py +0 -0
  45. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/mysql/object_types.py +0 -0
  46. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/README.md +0 -0
  47. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/__init__.py +0 -0
  48. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/connection.py +0 -0
  49. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/data_types.py +0 -0
  50. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/dependency.py +0 -0
  51. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/discovery.py +0 -0
  52. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/engine.py +0 -0
  53. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/generator.py +0 -0
  54. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/mutation.py +0 -0
  55. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/oracle/object_types.py +0 -0
  56. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/__init__.py +0 -0
  57. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/connection.py +0 -0
  58. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/data_types.py +0 -0
  59. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/dependency.py +0 -0
  60. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/discovery.py +0 -0
  61. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/engine.py +0 -0
  62. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/generator.py +0 -0
  63. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/mutation.py +0 -0
  64. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/postgresql/object_types.py +0 -0
  65. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/redshift/__init__.py +0 -0
  66. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/redshift/connection.py +0 -0
  67. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/redshift/data_types.py +0 -0
  68. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/redshift/dependency.py +0 -0
  69. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/redshift/engine.py +0 -0
  70. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/redshift/generator.py +0 -0
  71. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/snowflake/__init__.py +0 -0
  72. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/snowflake/data_types.py +0 -0
  73. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/snowflake/dependency.py +0 -0
  74. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/snowflake/engine.py +0 -0
  75. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/snowflake/generator.py +0 -0
  76. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/snowflake/object_types.py +0 -0
  77. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/test/__init__.py +0 -0
  78. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/test/dependency.py +0 -0
  79. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/trino/__init__.py +0 -0
  80. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/trino/connection.py +0 -0
  81. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/trino/dependency.py +0 -0
  82. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/trino/discovery.py +0 -0
  83. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/trino/engine.py +0 -0
  84. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/dialect/trino/generator.py +0 -0
  85. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/factory.py +0 -0
  86. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/__init__.py +0 -0
  87. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/constraints.py +0 -0
  88. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/data_types.py +0 -0
  89. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/discovery.py +0 -0
  90. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/inspection.py +0 -0
  91. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/mutation.py +0 -0
  92. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/object_dict.py +0 -0
  93. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/object_types.py +0 -0
  94. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/py_to_sql.py +0 -0
  95. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/formation/sql_to_py.py +0 -0
  96. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/model/__init__.py +0 -0
  97. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/model/data_types.py +0 -0
  98. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/model/entity_types.py +0 -0
  99. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/model/id_types.py +0 -0
  100. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/model/key_types.py +0 -0
  101. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/model/properties.py +0 -0
  102. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/py.typed +0 -0
  103. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/python_types.py +0 -0
  104. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/resultset.py +0 -0
  105. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/util/__init__.py +0 -0
  106. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/util/dataclasses.py +0 -0
  107. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/util/dispatch.py +0 -0
  108. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/pysqlsync/util/typing.py +0 -0
  109. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/setup.cfg +0 -0
  110. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/setup.py +0 -0
  111. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/__init__.py +0 -0
  112. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/example.py +0 -0
  113. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/measure.py +0 -0
  114. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/model/__init__.py +0 -0
  115. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/model/country.py +0 -0
  116. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/model/event.py +0 -0
  117. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/model/school.py +0 -0
  118. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/model/user.py +0 -0
  119. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/params.py +0 -0
  120. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/tables.py +0 -0
  121. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_api.py +0 -0
  122. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_connection.py +0 -0
  123. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_converter.py +0 -0
  124. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_discovery.py +0 -0
  125. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_exchange.py +0 -0
  126. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_generator.py +0 -0
  127. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_performance.py +0 -0
  128. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_synchronize.py +0 -0
  129. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/test_types.py +0 -0
  130. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/timed_test.py +0 -0
  131. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/update_readme.py +0 -0
  132. {instructure_pysqlsync-0.8.5.dev0 → instructure_pysqlsync-0.8.5.dev1}/tests/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instructure-pysqlsync
3
- Version: 0.8.5.dev0
3
+ Version: 0.8.5.dev1
4
4
  Summary: Synchronize schema and large volumes of data
5
5
  Author-email: "Instructure, Inc." <dapclient@instructure.com>
6
6
  Maintainer-email: "Instructure, Inc." <dapclient@instructure.com>
@@ -234,11 +234,3 @@ All objects are identified either with a local ID (e.g. namespaces and columns)
234
234
  pysqlsync comes with several database dialects shipped with the library. However, it is possible to create and register new dialects that behave the same way as built-in dialects. In terms of capabilities, there are no differences between built-in and user-defined dialects.
235
235
 
236
236
  If you are about to write integration for a new database dialect, it is recommended that you take one of the existing dialects (e.g. PostgreSQL, Microsoft SQL Server, Oracle or MySQL), and use it as a template. For more information, explore the folder `pysqlsync/dialect`.
237
-
238
- ## Upstream
239
-
240
- This is an internal fork of [hunyadi/pysqlsync](https://github.com/hunyadi/pysqlsync). To track upstream changes, add the original repository as a remote:
241
-
242
- ```sh
243
- git remote add hunyadi git@github.com:hunyadi/pysqlsync.git
244
- ```
@@ -185,11 +185,3 @@ All objects are identified either with a local ID (e.g. namespaces and columns)
185
185
  pysqlsync comes with several database dialects shipped with the library. However, it is possible to create and register new dialects that behave the same way as built-in dialects. In terms of capabilities, there are no differences between built-in and user-defined dialects.
186
186
 
187
187
  If you are about to write integration for a new database dialect, it is recommended that you take one of the existing dialects (e.g. PostgreSQL, Microsoft SQL Server, Oracle or MySQL), and use it as a template. For more information, explore the folder `pysqlsync/dialect`.
188
-
189
- ## Upstream
190
-
191
- This is an internal fork of [hunyadi/pysqlsync](https://github.com/hunyadi/pysqlsync). To track upstream changes, add the original repository as a remote:
192
-
193
- ```sh
194
- git remote add hunyadi git@github.com:hunyadi/pysqlsync.git
195
- ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instructure-pysqlsync
3
- Version: 0.8.5.dev0
3
+ Version: 0.8.5.dev1
4
4
  Summary: Synchronize schema and large volumes of data
5
5
  Author-email: "Instructure, Inc." <dapclient@instructure.com>
6
6
  Maintainer-email: "Instructure, Inc." <dapclient@instructure.com>
@@ -234,11 +234,3 @@ All objects are identified either with a local ID (e.g. namespaces and columns)
234
234
  pysqlsync comes with several database dialects shipped with the library. However, it is possible to create and register new dialects that behave the same way as built-in dialects. In terms of capabilities, there are no differences between built-in and user-defined dialects.
235
235
 
236
236
  If you are about to write integration for a new database dialect, it is recommended that you take one of the existing dialects (e.g. PostgreSQL, Microsoft SQL Server, Oracle or MySQL), and use it as a template. For more information, explore the folder `pysqlsync/dialect`.
237
-
238
- ## Upstream
239
-
240
- This is an internal fork of [hunyadi/pysqlsync](https://github.com/hunyadi/pysqlsync). To track upstream changes, add the original repository as a remote:
241
-
242
- ```sh
243
- git remote add hunyadi git@github.com:hunyadi/pysqlsync.git
244
- ```
@@ -116,6 +116,7 @@ tests/test_converter.py
116
116
  tests/test_discovery.py
117
117
  tests/test_exchange.py
118
118
  tests/test_generator.py
119
+ tests/test_mssql_odbc_types.py
119
120
  tests/test_performance.py
120
121
  tests/test_synchronize.py
121
122
  tests/test_types.py
@@ -7,7 +7,7 @@ of Python language elements and database drivers (client libraries).
7
7
  :see: https://github.com/instructure-internal/pysqlsync
8
8
  """
9
9
 
10
- __version__ = "0.8.5.dev0"
10
+ __version__ = "0.8.5.dev1"
11
11
  __author__ = "Instructure, Inc."
12
12
  __copyright__ = "Copyright 2023-2025, Levente Hunyadi; 2026 Instructure, Inc."
13
13
  __license__ = "MIT"
@@ -102,9 +102,15 @@ def sql_to_odbc_type(data_type: SqlDataType) -> tuple[int, int, int]:
102
102
  return pyodbc.SQL_TYPE_TIME, data_type.precision or 6, 0
103
103
 
104
104
  elif isinstance(data_type, SqlFixedCharacterType):
105
- return pyodbc.SQL_CHAR, data_type.limit or 0, 0
105
+ # Bind as a wide (Unicode) type so the driver describes the parameter
106
+ # buffer in terms of UTF-16 code units, not bytes. `char`/`varchar`
107
+ # columns under a UTF-8 collation hold multibyte data; binding them as
108
+ # the narrow `SQL_CHAR`/`SQL_VARCHAR` makes `fast_executemany` miscount
109
+ # the buffer width, observed to silently corrupt non-Latin text. SQL
110
+ # Server converts UTF-16 to the column's UTF-8 storage on insert.
111
+ return pyodbc.SQL_WCHAR, data_type.limit or 0, 0
106
112
  elif isinstance(data_type, SqlVariableCharacterType):
107
- return pyodbc.SQL_VARCHAR, data_type.limit or 0, 0
113
+ return pyodbc.SQL_WVARCHAR, data_type.limit or 0, 0
108
114
  elif isinstance(data_type, SqlFixedBinaryType):
109
115
  return pyodbc.SQL_BINARY, data_type.storage or 0, 0
110
116
  elif isinstance(data_type, SqlVariableBinaryType):
@@ -0,0 +1,57 @@
1
+ import importlib.util
2
+ import unittest
3
+
4
+ from pysqlsync.model.data_types import (
5
+ SqlFixedCharacterType,
6
+ SqlVariableCharacterType,
7
+ )
8
+
9
+ HAS_PYODBC = importlib.util.find_spec("pyodbc") is not None
10
+
11
+
12
+ @unittest.skipUnless(HAS_PYODBC, "pyodbc (mssql extra) is not installed")
13
+ class TestMSSQLOdbcTypes(unittest.TestCase):
14
+ """
15
+ Pins the ODBC type codes that `setinputsizes` feeds to `fast_executemany`.
16
+
17
+ `char`/`varchar` must bind as the *wide* (Unicode) types so the driver
18
+ sizes the bulk parameter buffer in UTF-16 code units rather than bytes;
19
+ the narrow `SQL_CHAR`/`SQL_VARCHAR` silently corrupt non-Latin text under
20
+ a UTF-8 collation. See `sql_to_odbc_type`.
21
+
22
+ The `pyodbc`-dependent imports are local to each test so the module still
23
+ imports (and skips cleanly) where the `mssql` extra is absent.
24
+ """
25
+
26
+ def test_fixed_character_binds_as_wide(self) -> None:
27
+ import pyodbc
28
+
29
+ from pysqlsync.dialect.mssql.data_types import sql_to_odbc_type
30
+
31
+ odbc_type, size, _ = sql_to_odbc_type(SqlFixedCharacterType(40))
32
+ self.assertEqual(odbc_type, pyodbc.SQL_WCHAR)
33
+ self.assertEqual(size, 40)
34
+
35
+ def test_variable_character_binds_as_wide(self) -> None:
36
+ import pyodbc
37
+
38
+ from pysqlsync.dialect.mssql.data_types import sql_to_odbc_type
39
+
40
+ odbc_type, size, _ = sql_to_odbc_type(SqlVariableCharacterType(40))
41
+ self.assertEqual(odbc_type, pyodbc.SQL_WVARCHAR)
42
+ self.assertEqual(size, 40)
43
+
44
+ def test_unbounded_variable_character_binds_as_wide_size_zero(self) -> None:
45
+ # str -> MSSQLVariableCharacterType() with no limit, i.e. varchar(max);
46
+ # `limit or 0` yields column_size 0, letting the driver size from data.
47
+ import pyodbc
48
+
49
+ from pysqlsync.dialect.mssql.data_types import sql_to_odbc_type
50
+
51
+ odbc_type, size, _ = sql_to_odbc_type(SqlVariableCharacterType())
52
+ self.assertEqual(odbc_type, pyodbc.SQL_WVARCHAR)
53
+ self.assertEqual(size, 0)
54
+
55
+
56
+ if __name__ == "__main__":
57
+ unittest.main()