typeorm 1.0.0-beta.2 → 1.0.0-beta.3

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 (330) hide show
  1. package/README.md +1 -3
  2. package/browser/connection/ConnectionOptionsReader.js +1 -1
  3. package/browser/connection/ConnectionOptionsReader.js.map +1 -1
  4. package/browser/data-source/DataSource.d.ts +1 -1
  5. package/browser/data-source/DataSource.js.map +1 -1
  6. package/browser/decorator/options/JoinColumnOptions.js.map +1 -1
  7. package/browser/driver/DriverUtils.d.ts +1 -0
  8. package/browser/driver/DriverUtils.js +27 -29
  9. package/browser/driver/DriverUtils.js.map +1 -1
  10. package/browser/driver/aurora-mysql/AuroraMysqlDriver.js +4 -4
  11. package/browser/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
  12. package/browser/driver/aurora-mysql/AuroraMysqlQueryRunner.d.ts +2 -1
  13. package/browser/driver/aurora-mysql/AuroraMysqlQueryRunner.js +9 -6
  14. package/browser/driver/aurora-mysql/AuroraMysqlQueryRunner.js.map +1 -1
  15. package/browser/driver/aurora-postgres/AuroraPostgresQueryRunner.d.ts +2 -1
  16. package/browser/driver/aurora-postgres/AuroraPostgresQueryRunner.js +3 -0
  17. package/browser/driver/aurora-postgres/AuroraPostgresQueryRunner.js.map +1 -1
  18. package/browser/driver/better-sqlite3/BetterSqlite3QueryRunner.d.ts +2 -1
  19. package/browser/driver/better-sqlite3/BetterSqlite3QueryRunner.js +3 -0
  20. package/browser/driver/better-sqlite3/BetterSqlite3QueryRunner.js.map +1 -1
  21. package/browser/driver/capacitor/CapacitorQueryRunner.d.ts +1 -1
  22. package/browser/driver/capacitor/CapacitorQueryRunner.js +5 -1
  23. package/browser/driver/capacitor/CapacitorQueryRunner.js.map +1 -1
  24. package/browser/driver/cockroachdb/CockroachDriver.js +3 -3
  25. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  26. package/browser/driver/cockroachdb/CockroachQueryRunner.d.ts +2 -1
  27. package/browser/driver/cockroachdb/CockroachQueryRunner.js +55 -50
  28. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  29. package/browser/driver/cordova/CordovaQueryRunner.d.ts +1 -1
  30. package/browser/driver/cordova/CordovaQueryRunner.js +2 -0
  31. package/browser/driver/cordova/CordovaQueryRunner.js.map +1 -1
  32. package/browser/driver/expo/ExpoDataSourceOptions.d.ts +5 -3
  33. package/browser/driver/expo/ExpoDataSourceOptions.js.map +1 -1
  34. package/browser/driver/expo/ExpoDriver.d.ts +16 -1
  35. package/browser/driver/expo/ExpoDriver.js +68 -6
  36. package/browser/driver/expo/ExpoDriver.js.map +1 -1
  37. package/browser/driver/expo/ExpoQueryRunner.d.ts +2 -1
  38. package/browser/driver/expo/ExpoQueryRunner.js +3 -0
  39. package/browser/driver/expo/ExpoQueryRunner.js.map +1 -1
  40. package/browser/driver/mysql/MysqlDriver.js +4 -4
  41. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  42. package/browser/driver/mysql/MysqlQueryRunner.d.ts +2 -1
  43. package/browser/driver/mysql/MysqlQueryRunner.js +78 -82
  44. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  45. package/browser/driver/nativescript/NativescriptQueryRunner.d.ts +1 -1
  46. package/browser/driver/nativescript/NativescriptQueryRunner.js +3 -0
  47. package/browser/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
  48. package/browser/driver/oracle/OracleDriver.js +2 -2
  49. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  50. package/browser/driver/postgres/PostgresDriver.js +8 -8
  51. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  52. package/browser/driver/postgres/PostgresQueryRunner.d.ts +2 -1
  53. package/browser/driver/postgres/PostgresQueryRunner.js +12 -8
  54. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  55. package/browser/driver/react-native/ReactNativeDriver.js +1 -1
  56. package/browser/driver/react-native/ReactNativeDriver.js.map +1 -1
  57. package/browser/driver/react-native/ReactNativeQueryRunner.d.ts +1 -1
  58. package/browser/driver/react-native/ReactNativeQueryRunner.js +3 -0
  59. package/browser/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
  60. package/browser/driver/sap/SapDriver.js +5 -3
  61. package/browser/driver/sap/SapDriver.js.map +1 -1
  62. package/browser/driver/sap/SapQueryRunner.d.ts +2 -1
  63. package/browser/driver/sap/SapQueryRunner.js +171 -16
  64. package/browser/driver/sap/SapQueryRunner.js.map +1 -1
  65. package/browser/driver/spanner/SpannerDriver.d.ts +1 -1
  66. package/browser/driver/spanner/SpannerDriver.js +6 -8
  67. package/browser/driver/spanner/SpannerDriver.js.map +1 -1
  68. package/browser/driver/spanner/SpannerQueryRunner.d.ts +16 -1
  69. package/browser/driver/spanner/SpannerQueryRunner.js +75 -7
  70. package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -1
  71. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
  72. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  73. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +10 -14
  74. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  75. package/browser/driver/sqljs/SqljsQueryRunner.d.ts +2 -1
  76. package/browser/driver/sqljs/SqljsQueryRunner.js +3 -0
  77. package/browser/driver/sqljs/SqljsQueryRunner.js.map +1 -1
  78. package/browser/driver/sqlserver/SqlServerDriver.js +1 -1
  79. package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
  80. package/browser/driver/sqlserver/SqlServerQueryRunner.d.ts +2 -1
  81. package/browser/driver/sqlserver/SqlServerQueryRunner.js +65 -60
  82. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  83. package/browser/entity-manager/EntityManager.d.ts +1 -1
  84. package/browser/entity-manager/EntityManager.js.map +1 -1
  85. package/browser/error/NamedPlaceholdersNotSupportedError.d.ts +7 -0
  86. package/browser/error/NamedPlaceholdersNotSupportedError.js +14 -0
  87. package/browser/error/NamedPlaceholdersNotSupportedError.js.map +1 -0
  88. package/browser/error/QueryFailedError.d.ts +3 -2
  89. package/browser/error/QueryFailedError.js.map +1 -1
  90. package/browser/error/index.d.ts +1 -0
  91. package/browser/error/index.js +1 -0
  92. package/browser/error/index.js.map +1 -1
  93. package/browser/index.d.ts +0 -1
  94. package/browser/index.js +1 -3
  95. package/browser/index.js.map +1 -1
  96. package/browser/logger/AbstractLogger.d.ts +5 -4
  97. package/browser/logger/AbstractLogger.js +3 -1
  98. package/browser/logger/AbstractLogger.js.map +1 -1
  99. package/browser/logger/DebugLogger.js +3 -1
  100. package/browser/logger/DebugLogger.js.map +1 -1
  101. package/browser/logger/Logger.d.ts +5 -4
  102. package/browser/logger/Logger.js.map +1 -1
  103. package/browser/naming-strategy/DefaultNamingStrategy.d.ts +7 -26
  104. package/browser/naming-strategy/DefaultNamingStrategy.js +19 -37
  105. package/browser/naming-strategy/DefaultNamingStrategy.js.map +1 -1
  106. package/browser/naming-strategy/NamingStrategyInterface.d.ts +9 -13
  107. package/browser/naming-strategy/NamingStrategyInterface.js.map +1 -1
  108. package/browser/persistence/EntityPersistExecutor.js +20 -8
  109. package/browser/persistence/EntityPersistExecutor.js.map +1 -1
  110. package/browser/persistence/SubjectDatabaseEntityLoader.js +15 -5
  111. package/browser/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
  112. package/browser/persistence/SubjectExecutor.js +50 -30
  113. package/browser/persistence/SubjectExecutor.js.map +1 -1
  114. package/browser/platform/PlatformTools.js +1 -1
  115. package/browser/platform/PlatformTools.js.map +1 -1
  116. package/browser/query-builder/JoinAttribute.js +3 -3
  117. package/browser/query-builder/JoinAttribute.js.map +1 -1
  118. package/browser/query-builder/QueryBuilder.d.ts +0 -1
  119. package/browser/query-builder/QueryBuilder.js +3 -13
  120. package/browser/query-builder/QueryBuilder.js.map +1 -1
  121. package/browser/query-builder/SelectQueryBuilder.js +33 -27
  122. package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
  123. package/browser/query-builder/SoftDeleteQueryBuilder.js +0 -2
  124. package/browser/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
  125. package/browser/query-builder/UpdateQueryBuilder.js +0 -2
  126. package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
  127. package/browser/query-builder/relation-id/RelationIdAttribute.js +4 -4
  128. package/browser/query-builder/relation-id/RelationIdAttribute.js.map +1 -1
  129. package/browser/query-builder/relation-id/RelationIdLoader.js +16 -9
  130. package/browser/query-builder/relation-id/RelationIdLoader.js.map +1 -1
  131. package/browser/query-runner/BaseQueryRunner.d.ts +44 -21
  132. package/browser/query-runner/BaseQueryRunner.js +61 -21
  133. package/browser/query-runner/BaseQueryRunner.js.map +1 -1
  134. package/browser/query-runner/QueryRunner.d.ts +11 -2
  135. package/browser/query-runner/QueryRunner.js.map +1 -1
  136. package/browser/repository/BaseEntity.d.ts +2 -1
  137. package/browser/repository/BaseEntity.js.map +1 -1
  138. package/browser/repository/Repository.d.ts +1 -1
  139. package/browser/repository/Repository.js.map +1 -1
  140. package/browser/subscriber/Broadcaster.d.ts +4 -4
  141. package/browser/subscriber/Broadcaster.js.map +1 -1
  142. package/browser/subscriber/event/QueryEvent.d.ts +2 -1
  143. package/browser/subscriber/event/QueryEvent.js.map +1 -1
  144. package/browser/util/DirectoryExportedClassesLoader.js +1 -1
  145. package/browser/util/DirectoryExportedClassesLoader.js.map +1 -1
  146. package/browser/util/ImportUtils.js +1 -1
  147. package/browser/util/ImportUtils.js.map +1 -1
  148. package/browser/util/OrmUtils.js +1 -1
  149. package/browser/util/OrmUtils.js.map +1 -1
  150. package/browser/util/PathUtils.js +1 -1
  151. package/browser/util/PathUtils.js.map +1 -1
  152. package/browser/util/RandomGenerator.d.ts +1 -10
  153. package/browser/util/RandomGenerator.js +1 -10
  154. package/browser/util/RandomGenerator.js.map +1 -1
  155. package/browser/util/StringUtils.js +9 -9
  156. package/browser/util/StringUtils.js.map +1 -1
  157. package/browser/util/escapeRegExp.js +1 -1
  158. package/browser/util/escapeRegExp.js.map +1 -1
  159. package/commands/InitCommand.d.ts +0 -3
  160. package/commands/InitCommand.js +4 -31
  161. package/commands/InitCommand.js.map +1 -1
  162. package/commands/MigrationGenerateCommand.js +3 -1
  163. package/commands/MigrationGenerateCommand.js.map +1 -1
  164. package/commands/VersionCommand.js +2 -2
  165. package/commands/VersionCommand.js.map +1 -1
  166. package/connection/ConnectionOptionsReader.js +1 -1
  167. package/connection/ConnectionOptionsReader.js.map +1 -1
  168. package/data-source/DataSource.d.ts +1 -1
  169. package/data-source/DataSource.js.map +1 -1
  170. package/decorator/options/JoinColumnOptions.js.map +1 -1
  171. package/driver/DriverUtils.d.ts +1 -0
  172. package/driver/DriverUtils.js +27 -29
  173. package/driver/DriverUtils.js.map +1 -1
  174. package/driver/aurora-mysql/AuroraMysqlDriver.js +4 -4
  175. package/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
  176. package/driver/aurora-mysql/AuroraMysqlQueryRunner.d.ts +2 -1
  177. package/driver/aurora-mysql/AuroraMysqlQueryRunner.js +9 -6
  178. package/driver/aurora-mysql/AuroraMysqlQueryRunner.js.map +1 -1
  179. package/driver/aurora-postgres/AuroraPostgresQueryRunner.d.ts +2 -1
  180. package/driver/aurora-postgres/AuroraPostgresQueryRunner.js +3 -0
  181. package/driver/aurora-postgres/AuroraPostgresQueryRunner.js.map +1 -1
  182. package/driver/better-sqlite3/BetterSqlite3QueryRunner.d.ts +2 -1
  183. package/driver/better-sqlite3/BetterSqlite3QueryRunner.js +3 -0
  184. package/driver/better-sqlite3/BetterSqlite3QueryRunner.js.map +1 -1
  185. package/driver/capacitor/CapacitorQueryRunner.d.ts +1 -1
  186. package/driver/capacitor/CapacitorQueryRunner.js +5 -1
  187. package/driver/capacitor/CapacitorQueryRunner.js.map +1 -1
  188. package/driver/cockroachdb/CockroachDriver.js +3 -3
  189. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  190. package/driver/cockroachdb/CockroachQueryRunner.d.ts +2 -1
  191. package/driver/cockroachdb/CockroachQueryRunner.js +55 -50
  192. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  193. package/driver/cordova/CordovaQueryRunner.d.ts +1 -1
  194. package/driver/cordova/CordovaQueryRunner.js +2 -0
  195. package/driver/cordova/CordovaQueryRunner.js.map +1 -1
  196. package/driver/expo/ExpoDataSourceOptions.d.ts +5 -3
  197. package/driver/expo/ExpoDataSourceOptions.js.map +1 -1
  198. package/driver/expo/ExpoDriver.d.ts +16 -1
  199. package/driver/expo/ExpoDriver.js +68 -6
  200. package/driver/expo/ExpoDriver.js.map +1 -1
  201. package/driver/expo/ExpoQueryRunner.d.ts +2 -1
  202. package/driver/expo/ExpoQueryRunner.js +3 -0
  203. package/driver/expo/ExpoQueryRunner.js.map +1 -1
  204. package/driver/mysql/MysqlDriver.js +4 -4
  205. package/driver/mysql/MysqlDriver.js.map +1 -1
  206. package/driver/mysql/MysqlQueryRunner.d.ts +2 -1
  207. package/driver/mysql/MysqlQueryRunner.js +78 -82
  208. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  209. package/driver/nativescript/NativescriptQueryRunner.d.ts +1 -1
  210. package/driver/nativescript/NativescriptQueryRunner.js +3 -0
  211. package/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
  212. package/driver/oracle/OracleDriver.js +2 -2
  213. package/driver/oracle/OracleDriver.js.map +1 -1
  214. package/driver/postgres/PostgresDriver.js +8 -8
  215. package/driver/postgres/PostgresDriver.js.map +1 -1
  216. package/driver/postgres/PostgresQueryRunner.d.ts +2 -1
  217. package/driver/postgres/PostgresQueryRunner.js +12 -8
  218. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  219. package/driver/react-native/ReactNativeDriver.js +1 -1
  220. package/driver/react-native/ReactNativeDriver.js.map +1 -1
  221. package/driver/react-native/ReactNativeQueryRunner.d.ts +1 -1
  222. package/driver/react-native/ReactNativeQueryRunner.js +3 -0
  223. package/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
  224. package/driver/sap/SapDriver.js +5 -3
  225. package/driver/sap/SapDriver.js.map +1 -1
  226. package/driver/sap/SapQueryRunner.d.ts +2 -1
  227. package/driver/sap/SapQueryRunner.js +171 -16
  228. package/driver/sap/SapQueryRunner.js.map +1 -1
  229. package/driver/spanner/SpannerDriver.d.ts +1 -1
  230. package/driver/spanner/SpannerDriver.js +6 -8
  231. package/driver/spanner/SpannerDriver.js.map +1 -1
  232. package/driver/spanner/SpannerQueryRunner.d.ts +16 -1
  233. package/driver/spanner/SpannerQueryRunner.js +75 -7
  234. package/driver/spanner/SpannerQueryRunner.js.map +1 -1
  235. package/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
  236. package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  237. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +10 -14
  238. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  239. package/driver/sqljs/SqljsQueryRunner.d.ts +2 -1
  240. package/driver/sqljs/SqljsQueryRunner.js +3 -0
  241. package/driver/sqljs/SqljsQueryRunner.js.map +1 -1
  242. package/driver/sqlserver/SqlServerDriver.js +1 -1
  243. package/driver/sqlserver/SqlServerDriver.js.map +1 -1
  244. package/driver/sqlserver/SqlServerQueryRunner.d.ts +2 -1
  245. package/driver/sqlserver/SqlServerQueryRunner.js +65 -60
  246. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  247. package/entity-manager/EntityManager.d.ts +1 -1
  248. package/entity-manager/EntityManager.js.map +1 -1
  249. package/error/NamedPlaceholdersNotSupportedError.d.ts +7 -0
  250. package/error/NamedPlaceholdersNotSupportedError.js +14 -0
  251. package/error/NamedPlaceholdersNotSupportedError.js.map +1 -0
  252. package/error/QueryFailedError.d.ts +3 -2
  253. package/error/QueryFailedError.js.map +1 -1
  254. package/error/index.d.ts +1 -0
  255. package/error/index.js +1 -0
  256. package/error/index.js.map +1 -1
  257. package/index.d.ts +0 -1
  258. package/index.js +1 -3
  259. package/index.js.map +1 -1
  260. package/index.mjs +2 -2
  261. package/logger/AbstractLogger.d.ts +5 -4
  262. package/logger/AbstractLogger.js +3 -1
  263. package/logger/AbstractLogger.js.map +1 -1
  264. package/logger/DebugLogger.js +3 -1
  265. package/logger/DebugLogger.js.map +1 -1
  266. package/logger/Logger.d.ts +5 -4
  267. package/logger/Logger.js.map +1 -1
  268. package/naming-strategy/DefaultNamingStrategy.d.ts +7 -26
  269. package/naming-strategy/DefaultNamingStrategy.js +19 -37
  270. package/naming-strategy/DefaultNamingStrategy.js.map +1 -1
  271. package/naming-strategy/NamingStrategyInterface.d.ts +9 -13
  272. package/naming-strategy/NamingStrategyInterface.js.map +1 -1
  273. package/package.json +6 -6
  274. package/persistence/EntityPersistExecutor.js +20 -8
  275. package/persistence/EntityPersistExecutor.js.map +1 -1
  276. package/persistence/SubjectDatabaseEntityLoader.js +15 -5
  277. package/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
  278. package/persistence/SubjectExecutor.js +50 -30
  279. package/persistence/SubjectExecutor.js.map +1 -1
  280. package/platform/PlatformTools.js +1 -1
  281. package/platform/PlatformTools.js.map +1 -1
  282. package/query-builder/JoinAttribute.js +3 -3
  283. package/query-builder/JoinAttribute.js.map +1 -1
  284. package/query-builder/QueryBuilder.d.ts +0 -1
  285. package/query-builder/QueryBuilder.js +3 -13
  286. package/query-builder/QueryBuilder.js.map +1 -1
  287. package/query-builder/SelectQueryBuilder.js +33 -27
  288. package/query-builder/SelectQueryBuilder.js.map +1 -1
  289. package/query-builder/SoftDeleteQueryBuilder.js +0 -2
  290. package/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
  291. package/query-builder/UpdateQueryBuilder.js +0 -2
  292. package/query-builder/UpdateQueryBuilder.js.map +1 -1
  293. package/query-builder/relation-id/RelationIdAttribute.js +4 -4
  294. package/query-builder/relation-id/RelationIdAttribute.js.map +1 -1
  295. package/query-builder/relation-id/RelationIdLoader.js +16 -9
  296. package/query-builder/relation-id/RelationIdLoader.js.map +1 -1
  297. package/query-runner/BaseQueryRunner.d.ts +44 -21
  298. package/query-runner/BaseQueryRunner.js +61 -21
  299. package/query-runner/BaseQueryRunner.js.map +1 -1
  300. package/query-runner/QueryRunner.d.ts +11 -2
  301. package/query-runner/QueryRunner.js.map +1 -1
  302. package/repository/BaseEntity.d.ts +2 -1
  303. package/repository/BaseEntity.js.map +1 -1
  304. package/repository/Repository.d.ts +1 -1
  305. package/repository/Repository.js.map +1 -1
  306. package/subscriber/Broadcaster.d.ts +4 -4
  307. package/subscriber/Broadcaster.js.map +1 -1
  308. package/subscriber/event/QueryEvent.d.ts +2 -1
  309. package/subscriber/event/QueryEvent.js.map +1 -1
  310. package/util/DirectoryExportedClassesLoader.js +1 -1
  311. package/util/DirectoryExportedClassesLoader.js.map +1 -1
  312. package/util/ImportUtils.js +1 -1
  313. package/util/ImportUtils.js.map +1 -1
  314. package/util/OrmUtils.js +1 -1
  315. package/util/OrmUtils.js.map +1 -1
  316. package/util/PathUtils.js +1 -1
  317. package/util/PathUtils.js.map +1 -1
  318. package/util/RandomGenerator.d.ts +1 -10
  319. package/util/RandomGenerator.js +1 -10
  320. package/util/RandomGenerator.js.map +1 -1
  321. package/util/StringUtils.js +9 -9
  322. package/util/StringUtils.js.map +1 -1
  323. package/util/escapeRegExp.js +1 -1
  324. package/util/escapeRegExp.js.map +1 -1
  325. package/browser/naming-strategy/LegacyOracleNamingStrategy.d.ts +0 -21
  326. package/browser/naming-strategy/LegacyOracleNamingStrategy.js +0 -49
  327. package/browser/naming-strategy/LegacyOracleNamingStrategy.js.map +0 -1
  328. package/naming-strategy/LegacyOracleNamingStrategy.d.ts +0 -21
  329. package/naming-strategy/LegacyOracleNamingStrategy.js +0 -49
  330. package/naming-strategy/LegacyOracleNamingStrategy.js.map +0 -1
@@ -25,7 +25,7 @@ export declare class SpannerDriver implements Driver {
25
25
  /**
26
26
  * Transaction isolation levels supported by this driver.
27
27
  *
28
- * @see https://cloud.google.com/spanner/docs/transactions
28
+ * @see https://cloud.google.com/spanner/docs/isolation-levels
29
29
  */
30
30
  static readonly supportedIsolationLevels: IsolationLevel[];
31
31
  /**
@@ -22,11 +22,9 @@ class SpannerDriver {
22
22
  /**
23
23
  * Transaction isolation levels supported by this driver.
24
24
  *
25
- * @see https://cloud.google.com/spanner/docs/transactions
25
+ * @see https://cloud.google.com/spanner/docs/isolation-levels
26
26
  */
27
27
  static { this.supportedIsolationLevels = [
28
- "READ UNCOMMITTED",
29
- "READ COMMITTED",
30
28
  "REPEATABLE READ",
31
29
  "SERIALIZABLE",
32
30
  ]; }
@@ -196,7 +194,7 @@ class SpannerDriver {
196
194
  if (!parameters || !Object.keys(parameters).length)
197
195
  return [sql, escapedParameters];
198
196
  const parameterIndexMap = new Map();
199
- sql = sql.replace(/:(\.\.\.)?([A-Za-z0-9_.]+)/g, (full, isArray, key) => {
197
+ sql = sql.replaceAll(/:(\.\.\.)?([A-Za-z0-9_.]+)/g, (full, isArray, key) => {
200
198
  if (!parameters.hasOwnProperty(key)) {
201
199
  return full;
202
200
  }
@@ -222,7 +220,7 @@ class SpannerDriver {
222
220
  parameterIndexMap.set(key, escapedParameters.length - 1);
223
221
  return this.createParameter(key, escapedParameters.length - 1);
224
222
  }); // todo: make replace only in value statements, otherwise problems
225
- sql = sql.replace(/([ ]+)?=([ ]+)?:(\.\.\.)?([A-Za-z0-9_.]+)/g, (full, emptySpaceBefore, emptySpaceAfter, isArray, key) => {
223
+ sql = sql.replaceAll(/([ ]+)?=([ ]+)?:(\.\.\.)?([A-Za-z0-9_.]+)/g, (full, emptySpaceBefore, emptySpaceAfter, isArray, key) => {
226
224
  if (!parameters.hasOwnProperty(key)) {
227
225
  return full;
228
226
  }
@@ -652,8 +650,8 @@ class SpannerDriver {
652
650
  typeof databaseValue === "string") {
653
651
  // we need to cut out "'" because in mysql we can understand returned value is a string or a function
654
652
  // as result compare cannot understand if default is really changed or not
655
- columnMetadataValue = columnMetadataValue.replace(/^'+|'+$/g, "");
656
- databaseValue = databaseValue.replace(/^'+|'+$/g, "");
653
+ columnMetadataValue = columnMetadataValue.replaceAll(/^'+|'+$/g, "");
654
+ databaseValue = databaseValue.replaceAll(/^'+|'+$/g, "");
657
655
  }
658
656
  return columnMetadataValue === databaseValue;
659
657
  }
@@ -688,7 +686,7 @@ class SpannerDriver {
688
686
  escapeComment(comment) {
689
687
  if (!comment)
690
688
  return comment;
691
- comment = comment.replace(/\u0000/g, ""); // Null bytes aren't allowed in comments
689
+ comment = comment.replaceAll("\u0000", ""); // Null bytes aren't allowed in comments
692
690
  return comment;
693
691
  }
694
692
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SpannerDriver.js","sourceRoot":"","sources":["../../../../src/driver/spanner/SpannerDriver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport type { DataSource } from \"../../data-source\"\nimport { DriverPackageNotInstalledError } from \"../../error/DriverPackageNotInstalledError\"\nimport type { ColumnMetadata } from \"../../metadata/ColumnMetadata\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { PlatformTools } from \"../../platform/PlatformTools\"\nimport { RdbmsSchemaBuilder } from \"../../schema-builder/RdbmsSchemaBuilder\"\nimport { Table } from \"../../schema-builder/table/Table\"\nimport type { TableColumn } from \"../../schema-builder/table/TableColumn\"\nimport { TableForeignKey } from \"../../schema-builder/table/TableForeignKey\"\nimport { View } from \"../../schema-builder/view/View\"\nimport { ApplyValueTransformers } from \"../../util/ApplyValueTransformers\"\nimport { DateUtils } from \"../../util/DateUtils\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport type { Driver } from \"../Driver\"\nimport type { ColumnType } from \"../types/ColumnTypes\"\nimport type { CteCapabilities } from \"../types/CteCapabilities\"\nimport type { DataTypeDefaults } from \"../types/DataTypeDefaults\"\nimport type { MappedColumnTypes } from \"../types/MappedColumnTypes\"\nimport type { ReplicationMode } from \"../types/ReplicationMode\"\nimport type { ReturningType } from \"../types/ReturningType\"\nimport type { IsolationLevel } from \"../types/IsolationLevel\"\nimport type { UpsertType } from \"../types/UpsertType\"\nimport type { SpannerDataSourceOptions } from \"./SpannerDataSourceOptions\"\nimport { SpannerQueryRunner } from \"./SpannerQueryRunner\"\n\n/**\n * Organizes communication with Spanner DBMS.\n */\nexport class SpannerDriver implements Driver {\n // -------------------------------------------------------------------------\n // Static Properties\n // -------------------------------------------------------------------------\n\n /**\n * Transaction isolation levels supported by this driver.\n *\n * @see https://cloud.google.com/spanner/docs/transactions\n */\n static readonly supportedIsolationLevels: IsolationLevel[] = [\n \"READ UNCOMMITTED\",\n \"READ COMMITTED\",\n \"REPEATABLE READ\",\n \"SERIALIZABLE\",\n ]\n\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * DataSource used by the driver.\n */\n dataSource: DataSource\n\n /**\n * Isolation levels supported by this driver.\n */\n supportedIsolationLevels = SpannerDriver.supportedIsolationLevels\n\n /**\n * DataSource used by the driver.\n *\n * @deprecated since 1.0.0. Use {@link dataSource} instance instead.\n */\n get connection(): DataSource {\n return this.dataSource\n }\n\n /**\n * Cloud Spanner underlying library.\n */\n spanner: any\n\n /**\n * Cloud Spanner instance.\n */\n instance: any\n\n /**\n * Cloud Spanner database.\n */\n instanceDatabase: any\n\n /**\n * Database name.\n */\n database?: string\n\n // -------------------------------------------------------------------------\n // Public Implemented Properties\n // -------------------------------------------------------------------------\n\n /**\n * DataSource options.\n */\n options: SpannerDataSourceOptions\n\n /**\n * Indicates if replication is enabled.\n */\n isReplicated: boolean = false\n\n /**\n * Indicates if tree tables are supported by this driver.\n */\n treeSupport = true\n\n /**\n * Represent transaction support by this driver\n */\n transactionSupport = \"none\" as const\n\n /**\n * Gets list of supported column data types by a driver.\n *\n * @see https://cloud.google.com/spanner/docs/reference/standard-sql/data-types\n */\n supportedDataTypes: ColumnType[] = [\n \"bool\",\n \"int64\",\n \"float64\",\n \"numeric\",\n \"string\",\n \"json\",\n \"bytes\",\n \"date\",\n \"timestamp\",\n \"array\",\n ]\n\n /**\n * Returns type of upsert supported by driver if any\n */\n supportedUpsertTypes: UpsertType[] = []\n\n /**\n * Gets list of spatial column data types.\n */\n spatialTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withLengthColumnTypes: ColumnType[] = [\"string\", \"bytes\"]\n\n /**\n * Gets list of column data types that support precision by a driver.\n */\n withPrecisionColumnTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that supports scale by a driver.\n */\n withScaleColumnTypes: ColumnType[] = []\n\n /**\n * ORM has special columns and we need to know what database column types should be for those columns.\n * Column types are driver dependant.\n */\n mappedDataTypes: MappedColumnTypes = {\n createDate: \"timestamp\",\n createDateDefault: \"\",\n updateDate: \"timestamp\",\n updateDateDefault: \"\",\n deleteDate: \"timestamp\",\n deleteDateNullable: true,\n version: \"int64\",\n treeLevel: \"int64\",\n migrationId: \"int64\",\n migrationName: \"string\",\n migrationTimestamp: \"int64\",\n cacheId: \"string\",\n cacheIdentifier: \"string\",\n cacheTime: \"int64\",\n cacheDuration: \"int64\",\n cacheQuery: \"string\",\n cacheResult: \"string\",\n metadataType: \"string\",\n metadataDatabase: \"string\",\n metadataSchema: \"string\",\n metadataTable: \"string\",\n metadataName: \"string\",\n metadataValue: \"string\",\n }\n\n /**\n * The prefix used for the parameters\n */\n parametersPrefix: string = \"@param\"\n\n /**\n * Default values of length, precision and scale depends on column data type.\n * Used in the cases when length/precision/scale is not specified by user.\n */\n dataTypeDefaults: DataTypeDefaults = {}\n\n /**\n * Max length allowed by MySQL for aliases.\n *\n * @see https://dev.mysql.com/doc/refman/5.5/en/identifiers.html\n */\n maxAliasLength = 63\n\n cteCapabilities: CteCapabilities = {\n enabled: true,\n }\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(dataSource: DataSource) {\n this.dataSource = dataSource\n this.options = dataSource.options as SpannerDataSourceOptions\n this.isReplicated = this.options.replication ? true : false\n\n // load mysql package\n this.loadDependencies()\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Performs connection to the database.\n */\n async connect(): Promise<void> {\n this.instance = this.spanner.instance(this.options.instanceId)\n this.instanceDatabase = this.instance.database(this.options.databaseId)\n }\n\n /**\n * Makes any action after connection (e.g. create extensions in Postgres driver).\n */\n afterConnect(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Closes connection with the database.\n */\n async disconnect(): Promise<void> {\n this.instanceDatabase.close()\n }\n\n /**\n * Creates a schema builder used to build and sync a schema.\n */\n createSchemaBuilder() {\n return new RdbmsSchemaBuilder(this.dataSource)\n }\n\n /**\n * Creates a query runner used to execute database queries.\n *\n * @param mode\n */\n createQueryRunner(mode: ReplicationMode) {\n return new SpannerQueryRunner(this, mode)\n }\n\n /**\n * Replaces parameters in the given sql with special escaping character\n * and an array of parameter names to be passed to a query.\n *\n * @param sql\n * @param parameters\n */\n escapeQueryWithParameters(\n sql: string,\n parameters: ObjectLiteral,\n ): [string, any[]] {\n const escapedParameters: any[] = []\n if (!parameters || !Object.keys(parameters).length)\n return [sql, escapedParameters]\n\n const parameterIndexMap = new Map<string, number>()\n sql = sql.replace(\n /:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (full, isArray: string, key: string): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n if (parameterIndexMap.has(key)) {\n return this.parametersPrefix + parameterIndexMap.get(key)\n }\n\n const value: any = parameters[key]\n\n if (value === null) {\n return full\n }\n\n if (isArray) {\n return value\n .map((v: any) => {\n escapedParameters.push(v)\n return this.createParameter(\n key,\n escapedParameters.length - 1,\n )\n })\n .join(\", \")\n }\n\n if (value instanceof Function) {\n return value()\n }\n\n escapedParameters.push(value)\n parameterIndexMap.set(key, escapedParameters.length - 1)\n return this.createParameter(key, escapedParameters.length - 1)\n },\n ) // todo: make replace only in value statements, otherwise problems\n\n sql = sql.replace(\n /([ ]+)?=([ ]+)?:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (\n full,\n emptySpaceBefore: string,\n emptySpaceAfter: string,\n isArray: string,\n key: string,\n ): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n const value: any = parameters[key]\n if (value === null) {\n return \" IS NULL\"\n }\n\n return full\n },\n )\n return [sql, escapedParameters]\n }\n\n /**\n * Escapes a column name.\n *\n * @param columnName\n */\n escape(columnName: string): string {\n return \"`\" + columnName.replaceAll(\"`\", \"``\") + \"`\"\n }\n\n /**\n * Build full table name with database name, schema name and table name.\n * E.g. myDB.mySchema.myTable\n *\n * @param tableName\n * @param schema\n * @param database\n */\n buildTableName(\n tableName: string,\n schema?: string,\n database?: string,\n ): string {\n const tablePath = [tableName]\n\n if (database) {\n tablePath.unshift(database)\n }\n\n return tablePath.join(\".\")\n }\n\n /**\n * Parse a target table name or other types and return a normalized table definition.\n *\n * @param target\n */\n parseTableName(\n target: EntityMetadata | Table | View | TableForeignKey | string,\n ): { database?: string; schema?: string; tableName: string } {\n const driverDatabase = this.database\n const driverSchema: any = undefined\n\n if (target instanceof Table || target instanceof View) {\n const parsed = this.parseTableName(target.name)\n\n return {\n database: target.database ?? parsed.database ?? driverDatabase,\n schema: target.schema ?? parsed.schema ?? driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof TableForeignKey) {\n const parsed = this.parseTableName(target.referencedTableName)\n\n return {\n database:\n target.referencedDatabase ??\n parsed.database ??\n driverDatabase,\n schema:\n target.referencedSchema ?? parsed.schema ?? driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof EntityMetadata) {\n // EntityMetadata tableName is never a path\n\n return {\n database: target.database ?? driverDatabase,\n schema: target.schema ?? driverSchema,\n tableName: target.tableName,\n }\n }\n\n const parts = target.split(\".\")\n\n return {\n database:\n (parts.length > 1 ? parts[0] : undefined) ?? driverDatabase,\n schema: driverSchema,\n tableName: parts.length > 1 ? parts[1] : parts[0],\n }\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type and metadata.\n *\n * @param value\n * @param columnMetadata\n */\n preparePersistentValue(value: any, columnMetadata: ColumnMetadata): any {\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformTo(\n columnMetadata.transformer,\n value,\n )\n\n if (value === null || value === undefined) return value\n\n if (columnMetadata.type === \"numeric\") {\n const lib = this.options.driver ?? PlatformTools.load(\"spanner\")\n return lib.Spanner.numeric(value.toString())\n } else if (columnMetadata.type === \"date\") {\n return DateUtils.mixedDateToDateString(value, {\n utc: columnMetadata.utc,\n })\n } else if (columnMetadata.type === \"json\") {\n return value\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n return DateUtils.mixedDateToDate(value)\n }\n\n return value\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type or metadata.\n *\n * @param value\n * @param columnMetadata\n */\n prepareHydratedValue(value: any, columnMetadata: ColumnMetadata): any {\n if (value === null || value === undefined)\n return columnMetadata.transformer\n ? ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n : value\n\n if (columnMetadata.type === Boolean || columnMetadata.type === \"bool\") {\n value = value ? true : false\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n value = new Date(value)\n } else if (columnMetadata.type === \"numeric\") {\n value = value.value\n } else if (columnMetadata.type === \"date\") {\n value = DateUtils.mixedDateToDateString(value, {\n utc: columnMetadata.utc,\n })\n } else if (columnMetadata.type === \"json\") {\n value = typeof value === \"string\" ? JSON.parse(value) : value\n } else if (columnMetadata.type === Number) {\n // convert to number if number\n value = !isNaN(+value) ? parseInt(value) : value\n }\n\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n\n return value\n }\n\n /**\n * Creates a database type from a given column metadata.\n *\n * @param column\n * @param column.type\n * @param column.length\n * @param column.precision\n * @param column.scale\n */\n normalizeType(column: {\n type: ColumnType\n length?: number | string\n precision?: number | null\n scale?: number\n }): string {\n if (column.type === Number) {\n return \"int64\"\n } else if (column.type === String || column.type === \"uuid\") {\n return \"string\"\n } else if (column.type === Date) {\n return \"timestamp\"\n } else if (\n typeof column.type === \"function\" &&\n column.type.prototype instanceof Uint8Array\n ) {\n return \"bytes\"\n } else if (column.type === Boolean) {\n return \"bool\"\n } else {\n return (column.type as string) || \"\"\n }\n }\n\n /**\n * Normalizes \"default\" value of the column.\n *\n * Spanner does not support default values.\n *\n * @param columnMetadata\n */\n normalizeDefault(columnMetadata: ColumnMetadata): string | undefined {\n return columnMetadata.default === \"\"\n ? `\"${columnMetadata.default}\"`\n : `${columnMetadata.default}`\n }\n\n /**\n * Normalizes \"isUnique\" value of the column.\n *\n * @param column\n */\n normalizeIsUnique(column: ColumnMetadata): boolean {\n return column.entityMetadata.indices.some(\n (idx) =>\n idx.isUnique &&\n idx.columns.length === 1 &&\n idx.columns[0] === column,\n )\n }\n\n /**\n * Returns default column lengths, which is required on column creation.\n *\n * @param column\n */\n getColumnLength(column: ColumnMetadata | TableColumn): string {\n if (column.length) return column.length.toString()\n if (column.generationStrategy === \"uuid\") return \"36\"\n\n switch (column.type) {\n case String:\n case \"string\":\n case \"bytes\":\n return \"max\"\n default:\n return \"\"\n }\n }\n\n /**\n * Creates column type definition including length, precision and scale\n *\n * @param column\n */\n createFullType(column: TableColumn): string {\n let type = column.type\n\n // used 'getColumnLength()' method, because Spanner requires column length for `string` and `bytes` data types\n if (this.getColumnLength(column)) {\n type += `(${this.getColumnLength(column)})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined &&\n column.scale !== null &&\n column.scale !== undefined\n ) {\n type += `(${column.precision},${column.scale})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined\n ) {\n type += `(${column.precision})`\n }\n\n if (column.isArray) type = `array<${type}>`\n\n return type\n }\n\n /**\n * Obtains a new database connection to a master server.\n * Used for replication.\n * If replication is not setup then returns default connection's database connection.\n */\n obtainMasterConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Obtains a new database connection to a slave server.\n * Used for replication.\n * If replication is not setup then returns master (default) connection's database connection.\n */\n obtainSlaveConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Creates generated map of values generated or returned by database after INSERT query.\n *\n * @param metadata\n * @param insertResult\n * @param entityIndex\n */\n createGeneratedMap(\n metadata: EntityMetadata,\n insertResult: any,\n entityIndex: number,\n ) {\n if (!insertResult) {\n return undefined\n }\n\n if (insertResult.insertId === undefined) {\n return Object.keys(insertResult).reduce((map, key) => {\n const column = metadata.findColumnWithDatabaseName(key)\n if (column) {\n OrmUtils.mergeDeep(\n map,\n column.createValueMap(insertResult[key]),\n )\n // OrmUtils.mergeDeep(map, column.createValueMap(this.prepareHydratedValue(insertResult[key], column))); // TODO: probably should be like there, but fails on enums, fix later\n }\n return map\n }, {} as ObjectLiteral)\n }\n\n const generatedMap = metadata.generatedColumns.reduce(\n (map, generatedColumn) => {\n let value: any\n if (\n generatedColumn.generationStrategy === \"increment\" &&\n insertResult.insertId\n ) {\n // NOTE: When multiple rows is inserted by a single INSERT statement,\n // `insertId` is the value generated for the first inserted row only.\n value = insertResult.insertId + entityIndex\n // } else if (generatedColumn.generationStrategy === \"uuid\") {\n // console.log(\"getting db value:\", generatedColumn.databaseName);\n // value = generatedColumn.getEntityValue(uuidMap);\n }\n\n return OrmUtils.mergeDeep(\n map,\n generatedColumn.createValueMap(value),\n )\n },\n {} as ObjectLiteral,\n )\n\n return Object.keys(generatedMap).length > 0 ? generatedMap : undefined\n }\n\n /**\n * Differentiate columns of this table and columns from the given column metadatas columns\n * and returns only changed.\n *\n * @param tableColumns\n * @param columnMetadatas\n */\n findChangedColumns(\n tableColumns: TableColumn[],\n columnMetadatas: ColumnMetadata[],\n ): ColumnMetadata[] {\n return columnMetadatas.filter((columnMetadata) => {\n const tableColumn = tableColumns.find(\n (c) => c.name === columnMetadata.databaseName,\n )\n if (!tableColumn) return false // we don't need new columns, we only need exist and changed\n\n const isColumnChanged =\n tableColumn.name !== columnMetadata.databaseName ||\n tableColumn.type !== this.normalizeType(columnMetadata) ||\n tableColumn.length !== this.getColumnLength(columnMetadata) ||\n tableColumn.asExpression !== columnMetadata.asExpression ||\n tableColumn.generatedType !== columnMetadata.generatedType ||\n tableColumn.isPrimary !== columnMetadata.isPrimary ||\n !this.compareNullableValues(columnMetadata, tableColumn) ||\n tableColumn.isUnique !== this.normalizeIsUnique(columnMetadata)\n\n // DEBUG SECTION\n // if (isColumnChanged) {\n // console.log(\"table:\", columnMetadata.entityMetadata.tableName)\n // console.log(\n // \"name:\",\n // tableColumn.name,\n // columnMetadata.databaseName,\n // )\n // console.log(\n // \"type:\",\n // tableColumn.type,\n // this.normalizeType(columnMetadata),\n // )\n // console.log(\n // \"length:\",\n // tableColumn.length,\n // this.getColumnLength(columnMetadata),\n // )\n // console.log(\n // \"asExpression:\",\n // tableColumn.asExpression,\n // columnMetadata.asExpression,\n // )\n // console.log(\n // \"generatedType:\",\n // tableColumn.generatedType,\n // columnMetadata.generatedType,\n // )\n // console.log(\n // \"isPrimary:\",\n // tableColumn.isPrimary,\n // columnMetadata.isPrimary,\n // )\n // console.log(\n // \"isNullable:\",\n // tableColumn.isNullable,\n // columnMetadata.isNullable,\n // )\n // console.log(\n // \"isUnique:\",\n // tableColumn.isUnique,\n // this.normalizeIsUnique(columnMetadata),\n // )\n // console.log(\"==========================================\")\n // }\n\n return isColumnChanged\n })\n }\n\n /**\n * Returns true if driver supports RETURNING / OUTPUT statement.\n *\n * @param _returningType\n */\n isReturningSqlSupported(_returningType: ReturningType): boolean {\n return true\n }\n\n /**\n * Returns true if driver supports uuid values generation on its own.\n */\n isUUIDGenerationSupported(): boolean {\n return true\n }\n\n /**\n * Returns true if driver supports fulltext indices.\n */\n isFullTextColumnTypeSupported(): boolean {\n return false\n }\n\n /**\n * Creates an escaped parameter.\n *\n * @param parameterName\n * @param index\n */\n createParameter(parameterName: string, index: number): string {\n return this.parametersPrefix + index\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads all driver dependencies.\n */\n protected loadDependencies(): void {\n try {\n const lib = this.options.driver ?? PlatformTools.load(\"spanner\")\n\n if (this.options.credentials) {\n this.spanner = new lib.Spanner({\n projectId: this.options.projectId,\n credentials: this.options.credentials,\n })\n\n return\n }\n\n this.spanner = new lib.Spanner({\n projectId: this.options.projectId,\n })\n } catch (e) {\n console.error(e)\n throw new DriverPackageNotInstalledError(\n \"Spanner\",\n \"@google-cloud/spanner\",\n )\n }\n }\n\n compareNullableValues(\n columnMetadata: ColumnMetadata,\n tableColumn: TableColumn,\n ): boolean {\n // Spanner does not support NULL/NOT NULL expressions for generated columns\n if (columnMetadata.generatedType) {\n return true\n }\n\n return columnMetadata.isNullable === tableColumn.isNullable\n }\n\n /**\n * Checks if \"DEFAULT\" values in the column metadata and in the database are equal.\n *\n * @param columnMetadataValue\n * @param databaseValue\n */\n protected compareDefaultValues(\n columnMetadataValue: string | undefined,\n databaseValue: string | undefined,\n ): boolean {\n if (\n typeof columnMetadataValue === \"string\" &&\n typeof databaseValue === \"string\"\n ) {\n // we need to cut out \"'\" because in mysql we can understand returned value is a string or a function\n // as result compare cannot understand if default is really changed or not\n columnMetadataValue = columnMetadataValue.replace(/^'+|'+$/g, \"\")\n databaseValue = databaseValue.replace(/^'+|'+$/g, \"\")\n }\n\n return columnMetadataValue === databaseValue\n }\n\n /**\n * If parameter is a datetime function, e.g. \"CURRENT_TIMESTAMP\", normalizes it.\n * Otherwise returns original input.\n *\n * @param value\n */\n protected normalizeDatetimeFunction(value?: string) {\n if (!value) return value\n\n // check if input is datetime function\n const isDatetimeFunction =\n value.toUpperCase().indexOf(\"CURRENT_TIMESTAMP\") !== -1 ||\n value.toUpperCase().indexOf(\"NOW\") !== -1\n\n if (isDatetimeFunction) {\n // extract precision, e.g. \"(3)\"\n const precision = value.match(/\\(\\d+\\)/)\n return precision\n ? `CURRENT_TIMESTAMP${precision[0]}`\n : \"CURRENT_TIMESTAMP\"\n } else {\n return value\n }\n }\n\n /**\n * Escapes a given comment.\n *\n * @param comment\n */\n protected escapeComment(comment?: string) {\n if (!comment) return comment\n\n comment = comment.replace(/\\u0000/g, \"\") // Null bytes aren't allowed in comments\n\n return comment\n }\n}\n"]}
1
+ {"version":3,"file":"SpannerDriver.js","sourceRoot":"","sources":["../../../../src/driver/spanner/SpannerDriver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport type { DataSource } from \"../../data-source\"\nimport { DriverPackageNotInstalledError } from \"../../error/DriverPackageNotInstalledError\"\nimport type { ColumnMetadata } from \"../../metadata/ColumnMetadata\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { PlatformTools } from \"../../platform/PlatformTools\"\nimport { RdbmsSchemaBuilder } from \"../../schema-builder/RdbmsSchemaBuilder\"\nimport { Table } from \"../../schema-builder/table/Table\"\nimport type { TableColumn } from \"../../schema-builder/table/TableColumn\"\nimport { TableForeignKey } from \"../../schema-builder/table/TableForeignKey\"\nimport { View } from \"../../schema-builder/view/View\"\nimport { ApplyValueTransformers } from \"../../util/ApplyValueTransformers\"\nimport { DateUtils } from \"../../util/DateUtils\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport type { Driver } from \"../Driver\"\nimport type { ColumnType } from \"../types/ColumnTypes\"\nimport type { CteCapabilities } from \"../types/CteCapabilities\"\nimport type { DataTypeDefaults } from \"../types/DataTypeDefaults\"\nimport type { MappedColumnTypes } from \"../types/MappedColumnTypes\"\nimport type { ReplicationMode } from \"../types/ReplicationMode\"\nimport type { ReturningType } from \"../types/ReturningType\"\nimport type { IsolationLevel } from \"../types/IsolationLevel\"\nimport type { UpsertType } from \"../types/UpsertType\"\nimport type { SpannerDataSourceOptions } from \"./SpannerDataSourceOptions\"\nimport { SpannerQueryRunner } from \"./SpannerQueryRunner\"\n\n/**\n * Organizes communication with Spanner DBMS.\n */\nexport class SpannerDriver implements Driver {\n // -------------------------------------------------------------------------\n // Static Properties\n // -------------------------------------------------------------------------\n\n /**\n * Transaction isolation levels supported by this driver.\n *\n * @see https://cloud.google.com/spanner/docs/isolation-levels\n */\n static readonly supportedIsolationLevels: IsolationLevel[] = [\n \"REPEATABLE READ\",\n \"SERIALIZABLE\",\n ]\n\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * DataSource used by the driver.\n */\n dataSource: DataSource\n\n /**\n * Isolation levels supported by this driver.\n */\n supportedIsolationLevels = SpannerDriver.supportedIsolationLevels\n\n /**\n * DataSource used by the driver.\n *\n * @deprecated since 1.0.0. Use {@link dataSource} instance instead.\n */\n get connection(): DataSource {\n return this.dataSource\n }\n\n /**\n * Cloud Spanner underlying library.\n */\n spanner: any\n\n /**\n * Cloud Spanner instance.\n */\n instance: any\n\n /**\n * Cloud Spanner database.\n */\n instanceDatabase: any\n\n /**\n * Database name.\n */\n database?: string\n\n // -------------------------------------------------------------------------\n // Public Implemented Properties\n // -------------------------------------------------------------------------\n\n /**\n * DataSource options.\n */\n options: SpannerDataSourceOptions\n\n /**\n * Indicates if replication is enabled.\n */\n isReplicated: boolean = false\n\n /**\n * Indicates if tree tables are supported by this driver.\n */\n treeSupport = true\n\n /**\n * Represent transaction support by this driver\n */\n transactionSupport = \"none\" as const\n\n /**\n * Gets list of supported column data types by a driver.\n *\n * @see https://cloud.google.com/spanner/docs/reference/standard-sql/data-types\n */\n supportedDataTypes: ColumnType[] = [\n \"bool\",\n \"int64\",\n \"float64\",\n \"numeric\",\n \"string\",\n \"json\",\n \"bytes\",\n \"date\",\n \"timestamp\",\n \"array\",\n ]\n\n /**\n * Returns type of upsert supported by driver if any\n */\n supportedUpsertTypes: UpsertType[] = []\n\n /**\n * Gets list of spatial column data types.\n */\n spatialTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withLengthColumnTypes: ColumnType[] = [\"string\", \"bytes\"]\n\n /**\n * Gets list of column data types that support precision by a driver.\n */\n withPrecisionColumnTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that supports scale by a driver.\n */\n withScaleColumnTypes: ColumnType[] = []\n\n /**\n * ORM has special columns and we need to know what database column types should be for those columns.\n * Column types are driver dependant.\n */\n mappedDataTypes: MappedColumnTypes = {\n createDate: \"timestamp\",\n createDateDefault: \"\",\n updateDate: \"timestamp\",\n updateDateDefault: \"\",\n deleteDate: \"timestamp\",\n deleteDateNullable: true,\n version: \"int64\",\n treeLevel: \"int64\",\n migrationId: \"int64\",\n migrationName: \"string\",\n migrationTimestamp: \"int64\",\n cacheId: \"string\",\n cacheIdentifier: \"string\",\n cacheTime: \"int64\",\n cacheDuration: \"int64\",\n cacheQuery: \"string\",\n cacheResult: \"string\",\n metadataType: \"string\",\n metadataDatabase: \"string\",\n metadataSchema: \"string\",\n metadataTable: \"string\",\n metadataName: \"string\",\n metadataValue: \"string\",\n }\n\n /**\n * The prefix used for the parameters\n */\n parametersPrefix: string = \"@param\"\n\n /**\n * Default values of length, precision and scale depends on column data type.\n * Used in the cases when length/precision/scale is not specified by user.\n */\n dataTypeDefaults: DataTypeDefaults = {}\n\n /**\n * Max length allowed by MySQL for aliases.\n *\n * @see https://dev.mysql.com/doc/refman/5.5/en/identifiers.html\n */\n maxAliasLength = 63\n\n cteCapabilities: CteCapabilities = {\n enabled: true,\n }\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(dataSource: DataSource) {\n this.dataSource = dataSource\n this.options = dataSource.options as SpannerDataSourceOptions\n this.isReplicated = this.options.replication ? true : false\n\n // load mysql package\n this.loadDependencies()\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Performs connection to the database.\n */\n async connect(): Promise<void> {\n this.instance = this.spanner.instance(this.options.instanceId)\n this.instanceDatabase = this.instance.database(this.options.databaseId)\n }\n\n /**\n * Makes any action after connection (e.g. create extensions in Postgres driver).\n */\n afterConnect(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Closes connection with the database.\n */\n async disconnect(): Promise<void> {\n this.instanceDatabase.close()\n }\n\n /**\n * Creates a schema builder used to build and sync a schema.\n */\n createSchemaBuilder() {\n return new RdbmsSchemaBuilder(this.dataSource)\n }\n\n /**\n * Creates a query runner used to execute database queries.\n *\n * @param mode\n */\n createQueryRunner(mode: ReplicationMode) {\n return new SpannerQueryRunner(this, mode)\n }\n\n /**\n * Replaces parameters in the given sql with special escaping character\n * and an array of parameter names to be passed to a query.\n *\n * @param sql\n * @param parameters\n */\n escapeQueryWithParameters(\n sql: string,\n parameters: ObjectLiteral,\n ): [string, any[]] {\n const escapedParameters: any[] = []\n if (!parameters || !Object.keys(parameters).length)\n return [sql, escapedParameters]\n\n const parameterIndexMap = new Map<string, number>()\n sql = sql.replaceAll(\n /:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (full, isArray: string, key: string): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n if (parameterIndexMap.has(key)) {\n return this.parametersPrefix + parameterIndexMap.get(key)\n }\n\n const value: any = parameters[key]\n\n if (value === null) {\n return full\n }\n\n if (isArray) {\n return value\n .map((v: any) => {\n escapedParameters.push(v)\n return this.createParameter(\n key,\n escapedParameters.length - 1,\n )\n })\n .join(\", \")\n }\n\n if (value instanceof Function) {\n return value()\n }\n\n escapedParameters.push(value)\n parameterIndexMap.set(key, escapedParameters.length - 1)\n return this.createParameter(key, escapedParameters.length - 1)\n },\n ) // todo: make replace only in value statements, otherwise problems\n\n sql = sql.replaceAll(\n /([ ]+)?=([ ]+)?:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (\n full,\n emptySpaceBefore: string,\n emptySpaceAfter: string,\n isArray: string,\n key: string,\n ): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n const value: any = parameters[key]\n if (value === null) {\n return \" IS NULL\"\n }\n\n return full\n },\n )\n return [sql, escapedParameters]\n }\n\n /**\n * Escapes a column name.\n *\n * @param columnName\n */\n escape(columnName: string): string {\n return \"`\" + columnName.replaceAll(\"`\", \"``\") + \"`\"\n }\n\n /**\n * Build full table name with database name, schema name and table name.\n * E.g. myDB.mySchema.myTable\n *\n * @param tableName\n * @param schema\n * @param database\n */\n buildTableName(\n tableName: string,\n schema?: string,\n database?: string,\n ): string {\n const tablePath = [tableName]\n\n if (database) {\n tablePath.unshift(database)\n }\n\n return tablePath.join(\".\")\n }\n\n /**\n * Parse a target table name or other types and return a normalized table definition.\n *\n * @param target\n */\n parseTableName(\n target: EntityMetadata | Table | View | TableForeignKey | string,\n ): { database?: string; schema?: string; tableName: string } {\n const driverDatabase = this.database\n const driverSchema: any = undefined\n\n if (target instanceof Table || target instanceof View) {\n const parsed = this.parseTableName(target.name)\n\n return {\n database: target.database ?? parsed.database ?? driverDatabase,\n schema: target.schema ?? parsed.schema ?? driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof TableForeignKey) {\n const parsed = this.parseTableName(target.referencedTableName)\n\n return {\n database:\n target.referencedDatabase ??\n parsed.database ??\n driverDatabase,\n schema:\n target.referencedSchema ?? parsed.schema ?? driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof EntityMetadata) {\n // EntityMetadata tableName is never a path\n\n return {\n database: target.database ?? driverDatabase,\n schema: target.schema ?? driverSchema,\n tableName: target.tableName,\n }\n }\n\n const parts = target.split(\".\")\n\n return {\n database:\n (parts.length > 1 ? parts[0] : undefined) ?? driverDatabase,\n schema: driverSchema,\n tableName: parts.length > 1 ? parts[1] : parts[0],\n }\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type and metadata.\n *\n * @param value\n * @param columnMetadata\n */\n preparePersistentValue(value: any, columnMetadata: ColumnMetadata): any {\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformTo(\n columnMetadata.transformer,\n value,\n )\n\n if (value === null || value === undefined) return value\n\n if (columnMetadata.type === \"numeric\") {\n const lib = this.options.driver ?? PlatformTools.load(\"spanner\")\n return lib.Spanner.numeric(value.toString())\n } else if (columnMetadata.type === \"date\") {\n return DateUtils.mixedDateToDateString(value, {\n utc: columnMetadata.utc,\n })\n } else if (columnMetadata.type === \"json\") {\n return value\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n return DateUtils.mixedDateToDate(value)\n }\n\n return value\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type or metadata.\n *\n * @param value\n * @param columnMetadata\n */\n prepareHydratedValue(value: any, columnMetadata: ColumnMetadata): any {\n if (value === null || value === undefined)\n return columnMetadata.transformer\n ? ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n : value\n\n if (columnMetadata.type === Boolean || columnMetadata.type === \"bool\") {\n value = value ? true : false\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n value = new Date(value)\n } else if (columnMetadata.type === \"numeric\") {\n value = value.value\n } else if (columnMetadata.type === \"date\") {\n value = DateUtils.mixedDateToDateString(value, {\n utc: columnMetadata.utc,\n })\n } else if (columnMetadata.type === \"json\") {\n value = typeof value === \"string\" ? JSON.parse(value) : value\n } else if (columnMetadata.type === Number) {\n // convert to number if number\n value = !isNaN(+value) ? parseInt(value) : value\n }\n\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n\n return value\n }\n\n /**\n * Creates a database type from a given column metadata.\n *\n * @param column\n * @param column.type\n * @param column.length\n * @param column.precision\n * @param column.scale\n */\n normalizeType(column: {\n type: ColumnType\n length?: number | string\n precision?: number | null\n scale?: number\n }): string {\n if (column.type === Number) {\n return \"int64\"\n } else if (column.type === String || column.type === \"uuid\") {\n return \"string\"\n } else if (column.type === Date) {\n return \"timestamp\"\n } else if (\n typeof column.type === \"function\" &&\n column.type.prototype instanceof Uint8Array\n ) {\n return \"bytes\"\n } else if (column.type === Boolean) {\n return \"bool\"\n } else {\n return (column.type as string) || \"\"\n }\n }\n\n /**\n * Normalizes \"default\" value of the column.\n *\n * Spanner does not support default values.\n *\n * @param columnMetadata\n */\n normalizeDefault(columnMetadata: ColumnMetadata): string | undefined {\n return columnMetadata.default === \"\"\n ? `\"${columnMetadata.default}\"`\n : `${columnMetadata.default}`\n }\n\n /**\n * Normalizes \"isUnique\" value of the column.\n *\n * @param column\n */\n normalizeIsUnique(column: ColumnMetadata): boolean {\n return column.entityMetadata.indices.some(\n (idx) =>\n idx.isUnique &&\n idx.columns.length === 1 &&\n idx.columns[0] === column,\n )\n }\n\n /**\n * Returns default column lengths, which is required on column creation.\n *\n * @param column\n */\n getColumnLength(column: ColumnMetadata | TableColumn): string {\n if (column.length) return column.length.toString()\n if (column.generationStrategy === \"uuid\") return \"36\"\n\n switch (column.type) {\n case String:\n case \"string\":\n case \"bytes\":\n return \"max\"\n default:\n return \"\"\n }\n }\n\n /**\n * Creates column type definition including length, precision and scale\n *\n * @param column\n */\n createFullType(column: TableColumn): string {\n let type = column.type\n\n // used 'getColumnLength()' method, because Spanner requires column length for `string` and `bytes` data types\n if (this.getColumnLength(column)) {\n type += `(${this.getColumnLength(column)})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined &&\n column.scale !== null &&\n column.scale !== undefined\n ) {\n type += `(${column.precision},${column.scale})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined\n ) {\n type += `(${column.precision})`\n }\n\n if (column.isArray) type = `array<${type}>`\n\n return type\n }\n\n /**\n * Obtains a new database connection to a master server.\n * Used for replication.\n * If replication is not setup then returns default connection's database connection.\n */\n obtainMasterConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Obtains a new database connection to a slave server.\n * Used for replication.\n * If replication is not setup then returns master (default) connection's database connection.\n */\n obtainSlaveConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Creates generated map of values generated or returned by database after INSERT query.\n *\n * @param metadata\n * @param insertResult\n * @param entityIndex\n */\n createGeneratedMap(\n metadata: EntityMetadata,\n insertResult: any,\n entityIndex: number,\n ) {\n if (!insertResult) {\n return undefined\n }\n\n if (insertResult.insertId === undefined) {\n return Object.keys(insertResult).reduce((map, key) => {\n const column = metadata.findColumnWithDatabaseName(key)\n if (column) {\n OrmUtils.mergeDeep(\n map,\n column.createValueMap(insertResult[key]),\n )\n // OrmUtils.mergeDeep(map, column.createValueMap(this.prepareHydratedValue(insertResult[key], column))); // TODO: probably should be like there, but fails on enums, fix later\n }\n return map\n }, {} as ObjectLiteral)\n }\n\n const generatedMap = metadata.generatedColumns.reduce(\n (map, generatedColumn) => {\n let value: any\n if (\n generatedColumn.generationStrategy === \"increment\" &&\n insertResult.insertId\n ) {\n // NOTE: When multiple rows is inserted by a single INSERT statement,\n // `insertId` is the value generated for the first inserted row only.\n value = insertResult.insertId + entityIndex\n // } else if (generatedColumn.generationStrategy === \"uuid\") {\n // console.log(\"getting db value:\", generatedColumn.databaseName);\n // value = generatedColumn.getEntityValue(uuidMap);\n }\n\n return OrmUtils.mergeDeep(\n map,\n generatedColumn.createValueMap(value),\n )\n },\n {} as ObjectLiteral,\n )\n\n return Object.keys(generatedMap).length > 0 ? generatedMap : undefined\n }\n\n /**\n * Differentiate columns of this table and columns from the given column metadatas columns\n * and returns only changed.\n *\n * @param tableColumns\n * @param columnMetadatas\n */\n findChangedColumns(\n tableColumns: TableColumn[],\n columnMetadatas: ColumnMetadata[],\n ): ColumnMetadata[] {\n return columnMetadatas.filter((columnMetadata) => {\n const tableColumn = tableColumns.find(\n (c) => c.name === columnMetadata.databaseName,\n )\n if (!tableColumn) return false // we don't need new columns, we only need exist and changed\n\n const isColumnChanged =\n tableColumn.name !== columnMetadata.databaseName ||\n tableColumn.type !== this.normalizeType(columnMetadata) ||\n tableColumn.length !== this.getColumnLength(columnMetadata) ||\n tableColumn.asExpression !== columnMetadata.asExpression ||\n tableColumn.generatedType !== columnMetadata.generatedType ||\n tableColumn.isPrimary !== columnMetadata.isPrimary ||\n !this.compareNullableValues(columnMetadata, tableColumn) ||\n tableColumn.isUnique !== this.normalizeIsUnique(columnMetadata)\n\n // DEBUG SECTION\n // if (isColumnChanged) {\n // console.log(\"table:\", columnMetadata.entityMetadata.tableName)\n // console.log(\n // \"name:\",\n // tableColumn.name,\n // columnMetadata.databaseName,\n // )\n // console.log(\n // \"type:\",\n // tableColumn.type,\n // this.normalizeType(columnMetadata),\n // )\n // console.log(\n // \"length:\",\n // tableColumn.length,\n // this.getColumnLength(columnMetadata),\n // )\n // console.log(\n // \"asExpression:\",\n // tableColumn.asExpression,\n // columnMetadata.asExpression,\n // )\n // console.log(\n // \"generatedType:\",\n // tableColumn.generatedType,\n // columnMetadata.generatedType,\n // )\n // console.log(\n // \"isPrimary:\",\n // tableColumn.isPrimary,\n // columnMetadata.isPrimary,\n // )\n // console.log(\n // \"isNullable:\",\n // tableColumn.isNullable,\n // columnMetadata.isNullable,\n // )\n // console.log(\n // \"isUnique:\",\n // tableColumn.isUnique,\n // this.normalizeIsUnique(columnMetadata),\n // )\n // console.log(\"==========================================\")\n // }\n\n return isColumnChanged\n })\n }\n\n /**\n * Returns true if driver supports RETURNING / OUTPUT statement.\n *\n * @param _returningType\n */\n isReturningSqlSupported(_returningType: ReturningType): boolean {\n return true\n }\n\n /**\n * Returns true if driver supports uuid values generation on its own.\n */\n isUUIDGenerationSupported(): boolean {\n return true\n }\n\n /**\n * Returns true if driver supports fulltext indices.\n */\n isFullTextColumnTypeSupported(): boolean {\n return false\n }\n\n /**\n * Creates an escaped parameter.\n *\n * @param parameterName\n * @param index\n */\n createParameter(parameterName: string, index: number): string {\n return this.parametersPrefix + index\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads all driver dependencies.\n */\n protected loadDependencies(): void {\n try {\n const lib = this.options.driver ?? PlatformTools.load(\"spanner\")\n\n if (this.options.credentials) {\n this.spanner = new lib.Spanner({\n projectId: this.options.projectId,\n credentials: this.options.credentials,\n })\n\n return\n }\n\n this.spanner = new lib.Spanner({\n projectId: this.options.projectId,\n })\n } catch (e) {\n console.error(e)\n throw new DriverPackageNotInstalledError(\n \"Spanner\",\n \"@google-cloud/spanner\",\n )\n }\n }\n\n compareNullableValues(\n columnMetadata: ColumnMetadata,\n tableColumn: TableColumn,\n ): boolean {\n // Spanner does not support NULL/NOT NULL expressions for generated columns\n if (columnMetadata.generatedType) {\n return true\n }\n\n return columnMetadata.isNullable === tableColumn.isNullable\n }\n\n /**\n * Checks if \"DEFAULT\" values in the column metadata and in the database are equal.\n *\n * @param columnMetadataValue\n * @param databaseValue\n */\n protected compareDefaultValues(\n columnMetadataValue: string | undefined,\n databaseValue: string | undefined,\n ): boolean {\n if (\n typeof columnMetadataValue === \"string\" &&\n typeof databaseValue === \"string\"\n ) {\n // we need to cut out \"'\" because in mysql we can understand returned value is a string or a function\n // as result compare cannot understand if default is really changed or not\n columnMetadataValue = columnMetadataValue.replaceAll(/^'+|'+$/g, \"\")\n databaseValue = databaseValue.replaceAll(/^'+|'+$/g, \"\")\n }\n\n return columnMetadataValue === databaseValue\n }\n\n /**\n * If parameter is a datetime function, e.g. \"CURRENT_TIMESTAMP\", normalizes it.\n * Otherwise returns original input.\n *\n * @param value\n */\n protected normalizeDatetimeFunction(value?: string) {\n if (!value) return value\n\n // check if input is datetime function\n const isDatetimeFunction =\n value.toUpperCase().indexOf(\"CURRENT_TIMESTAMP\") !== -1 ||\n value.toUpperCase().indexOf(\"NOW\") !== -1\n\n if (isDatetimeFunction) {\n // extract precision, e.g. \"(3)\"\n const precision = value.match(/\\(\\d+\\)/)\n return precision\n ? `CURRENT_TIMESTAMP${precision[0]}`\n : \"CURRENT_TIMESTAMP\"\n } else {\n return value\n }\n }\n\n /**\n * Escapes a given comment.\n *\n * @param comment\n */\n protected escapeComment(comment?: string) {\n if (!comment) return comment\n\n comment = comment.replaceAll(\"\\u0000\", \"\") // Null bytes aren't allowed in comments\n\n return comment\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { ObjectLiteral } from "../../common/ObjectLiteral";
1
2
  import type { ReadStream } from "../../platform/PlatformTools";
2
3
  import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner";
3
4
  import type { QueryRunner } from "../../query-runner/QueryRunner";
@@ -56,6 +57,20 @@ export declare class SpannerQueryRunner extends BaseQueryRunner implements Query
56
57
  * Error will be thrown if transaction was not started.
57
58
  */
58
59
  rollbackTransaction(): Promise<void>;
60
+ /**
61
+ * Replaces the cached session transaction with a fresh one so that options
62
+ * (e.g. isolation level) do not bleed into the next transaction. Failures
63
+ * are tolerated: the stale reference is cleared and connect() will lazily
64
+ * create a fresh one on next use.
65
+ */
66
+ protected resetSessionTransaction(): Promise<void>;
67
+ /**
68
+ * Maps a TypeORM isolation level to the Spanner protobuf enum key.
69
+ *
70
+ * @param level
71
+ * @see https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#google.spanner.v1.TransactionOptions.IsolationLevel
72
+ */
73
+ protected mapSpannerIsolationLevel(level: IsolationLevel): "SERIALIZABLE" | "REPEATABLE_READ";
59
74
  /**
60
75
  * Executes a given SQL query.
61
76
  *
@@ -63,7 +78,7 @@ export declare class SpannerQueryRunner extends BaseQueryRunner implements Query
63
78
  * @param parameters
64
79
  * @param useStructuredResult
65
80
  */
66
- query(query: string, parameters?: any[], useStructuredResult?: boolean): Promise<any>;
81
+ query(query: string, parameters?: any[] | ObjectLiteral, useStructuredResult?: boolean): Promise<any>;
67
82
  /**
68
83
  * Update database schema.
69
84
  * Used for creating/altering/dropping tables, columns, indexes, etc.
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SpannerQueryRunner = void 0;
4
4
  const error_1 = require("../../error");
5
+ const NamedPlaceholdersNotSupportedError_1 = require("../../error/NamedPlaceholdersNotSupportedError");
5
6
  const QueryFailedError_1 = require("../../error/QueryFailedError");
6
7
  const QueryRunnerAlreadyReleasedError_1 = require("../../error/QueryRunnerAlreadyReleasedError");
7
8
  const TransactionNotStartedError_1 = require("../../error/TransactionNotStartedError");
@@ -43,7 +44,8 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
43
44
  */
44
45
  async connect() {
45
46
  if (this.session) {
46
- return Promise.resolve(this.session);
47
+ this.sessionTransaction ??= await this.session.transaction();
48
+ return this.session;
47
49
  }
48
50
  const [session] = await this.driver.instanceDatabase.createSession({});
49
51
  this.session = session;
@@ -78,8 +80,20 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
78
80
  this.isTransactionActive = false;
79
81
  throw err;
80
82
  }
81
- await this.connect();
82
- await this.sessionTransaction.begin();
83
+ try {
84
+ await this.connect();
85
+ if (isolationLevel) {
86
+ this.sessionTransaction.setReadWriteTransactionOptions({
87
+ isolationLevel: this.mapSpannerIsolationLevel(isolationLevel),
88
+ });
89
+ }
90
+ await this.sessionTransaction.begin();
91
+ }
92
+ catch (err) {
93
+ this.isTransactionActive = false;
94
+ await this.resetSessionTransaction();
95
+ throw err;
96
+ }
83
97
  this.dataSource.logger.logQuery("START TRANSACTION");
84
98
  await this.broadcaster.broadcast("AfterTransactionStart");
85
99
  }
@@ -94,6 +108,11 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
94
108
  await this.sessionTransaction.commit();
95
109
  this.dataSource.logger.logQuery("COMMIT");
96
110
  this.isTransactionActive = false;
111
+ // Spanner transaction options (e.g. isolation level) persist on the
112
+ // object across commit, so replace it with a fresh one before reuse.
113
+ // If the recreate fails, clear it and let connect() recreate lazily —
114
+ // the commit itself already succeeded, so we must not fail the caller.
115
+ await this.resetSessionTransaction();
97
116
  await this.broadcaster.broadcast("AfterTransactionCommit");
98
117
  }
99
118
  /**
@@ -107,8 +126,45 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
107
126
  await this.sessionTransaction.rollback();
108
127
  this.dataSource.logger.logQuery("ROLLBACK");
109
128
  this.isTransactionActive = false;
129
+ // Spanner transaction options (e.g. isolation level) persist on the
130
+ // object across rollback, so replace it with a fresh one before reuse.
131
+ // If the recreate fails, clear it and let connect() recreate lazily —
132
+ // the rollback itself already succeeded, so we must not fail the caller.
133
+ await this.resetSessionTransaction();
110
134
  await this.broadcaster.broadcast("AfterTransactionRollback");
111
135
  }
136
+ /**
137
+ * Replaces the cached session transaction with a fresh one so that options
138
+ * (e.g. isolation level) do not bleed into the next transaction. Failures
139
+ * are tolerated: the stale reference is cleared and connect() will lazily
140
+ * create a fresh one on next use.
141
+ */
142
+ async resetSessionTransaction() {
143
+ if (!this.session)
144
+ return;
145
+ try {
146
+ this.sessionTransaction = await this.session.transaction();
147
+ }
148
+ catch {
149
+ this.sessionTransaction = undefined;
150
+ }
151
+ }
152
+ /**
153
+ * Maps a TypeORM isolation level to the Spanner protobuf enum key.
154
+ *
155
+ * @param level
156
+ * @see https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#google.spanner.v1.TransactionOptions.IsolationLevel
157
+ */
158
+ mapSpannerIsolationLevel(level) {
159
+ switch (level) {
160
+ case "SERIALIZABLE":
161
+ return "SERIALIZABLE";
162
+ case "REPEATABLE READ":
163
+ return "REPEATABLE_READ";
164
+ default:
165
+ throw new error_1.TypeORMError(`Spanner driver does not support isolation level "${level}"`);
166
+ }
167
+ }
112
168
  /**
113
169
  * Executes a given SQL query.
114
170
  *
@@ -119,6 +175,8 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
119
175
  async query(query, parameters, useStructuredResult = false) {
120
176
  if (this.isReleased)
121
177
  throw new QueryRunnerAlreadyReleasedError_1.QueryRunnerAlreadyReleasedError();
178
+ if (parameters && !Array.isArray(parameters))
179
+ throw new NamedPlaceholdersNotSupportedError_1.NamedPlaceholdersNotSupportedError();
122
180
  await this.connect();
123
181
  this.driver.dataSource.logger.logQuery(query, parameters, this);
124
182
  await this.broadcaster.broadcast("BeforeQuery", query, parameters);
@@ -131,6 +189,13 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
131
189
  ? this.driver.instanceDatabase
132
190
  : this.sessionTransaction;
133
191
  if (!this.isTransactionActive && !isSelect) {
192
+ const defaultIsolationLevel = this.dataSource.options.isolationLevel;
193
+ if (defaultIsolationLevel &&
194
+ this.driver.supportedIsolationLevels.includes(defaultIsolationLevel)) {
195
+ this.sessionTransaction.setReadWriteTransactionOptions({
196
+ isolationLevel: this.mapSpannerIsolationLevel(defaultIsolationLevel),
197
+ });
198
+ }
134
199
  await this.sessionTransaction.begin();
135
200
  }
136
201
  try {
@@ -146,13 +211,16 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
146
211
  });
147
212
  if (!this.isTransactionActive && !isSelect) {
148
213
  await this.sessionTransaction.commit();
214
+ await this.resetSessionTransaction();
149
215
  }
150
216
  }
151
217
  catch (error) {
152
218
  try {
153
219
  // we throw original error even if rollback thrown an error
154
- if (!this.isTransactionActive && !isSelect)
220
+ if (!this.isTransactionActive && !isSelect) {
155
221
  await this.sessionTransaction.rollback();
222
+ await this.resetSessionTransaction();
223
+ }
156
224
  }
157
225
  catch (rollbackError) { }
158
226
  throw error;
@@ -1327,16 +1395,16 @@ class SpannerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1327
1395
  let fullType = dbColumn["SPANNER_TYPE"].toLowerCase();
1328
1396
  if (fullType.indexOf("array") !== -1) {
1329
1397
  tableColumn.isArray = true;
1330
- fullType = fullType.substring(fullType.indexOf("<") + 1, fullType.indexOf(">"));
1398
+ fullType = fullType.slice(fullType.indexOf("<") + 1, fullType.indexOf(">"));
1331
1399
  }
1332
1400
  if (fullType.indexOf("(") !== -1) {
1333
- tableColumn.type = fullType.substring(0, fullType.indexOf("("));
1401
+ tableColumn.type = fullType.slice(0, fullType.indexOf("("));
1334
1402
  }
1335
1403
  else {
1336
1404
  tableColumn.type = fullType;
1337
1405
  }
1338
1406
  if (this.driver.withLengthColumnTypes.indexOf(tableColumn.type) !== -1) {
1339
- tableColumn.length = fullType.substring(fullType.indexOf("(") + 1, fullType.indexOf(")"));
1407
+ tableColumn.length = fullType.slice(fullType.indexOf("(") + 1, fullType.indexOf(")"));
1340
1408
  }
1341
1409
  if (dbColumn["IS_GENERATED"] === "ALWAYS") {
1342
1410
  tableColumn.asExpression =