execsql2 2.12.0__py3-none-any.whl → 2.12.2__py3-none-any.whl

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 (26) hide show
  1. execsql/db/base.py +37 -23
  2. execsql/exceptions.py +2 -0
  3. execsql/metacommands/control.py +1 -1
  4. execsql/script/engine.py +13 -4
  5. execsql/script/variables.py +2 -25
  6. {execsql2-2.12.0.dist-info → execsql2-2.12.2.dist-info}/METADATA +2 -1
  7. {execsql2-2.12.0.dist-info → execsql2-2.12.2.dist-info}/RECORD +26 -26
  8. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/README.md +0 -0
  9. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/config_settings.sqlite +0 -0
  10. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/example_config_prompt.sql +0 -0
  11. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/execsql.conf +0 -0
  12. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/make_config_db.sql +0 -0
  13. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/md_compare.sql +0 -0
  14. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/md_glossary.sql +0 -0
  15. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/md_upsert.sql +0 -0
  16. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/pg_compare.sql +0 -0
  17. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/pg_glossary.sql +0 -0
  18. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/pg_upsert.sql +0 -0
  19. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/script_template.sql +0 -0
  20. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/ss_compare.sql +0 -0
  21. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/ss_glossary.sql +0 -0
  22. {execsql2-2.12.0.data → execsql2-2.12.2.data}/data/execsql2_extras/ss_upsert.sql +0 -0
  23. {execsql2-2.12.0.dist-info → execsql2-2.12.2.dist-info}/WHEEL +0 -0
  24. {execsql2-2.12.0.dist-info → execsql2-2.12.2.dist-info}/entry_points.txt +0 -0
  25. {execsql2-2.12.0.dist-info → execsql2-2.12.2.dist-info}/licenses/LICENSE.txt +0 -0
  26. {execsql2-2.12.0.dist-info → execsql2-2.12.2.dist-info}/licenses/NOTICE +0 -0
execsql/db/base.py CHANGED
@@ -234,18 +234,22 @@ class Database(ABC):
234
234
  pass # Non-critical: some drivers lack rowcount support.
235
235
 
236
236
  def decode_row() -> Generator:
237
- while True:
238
- rows = curs.fetchmany()
239
- if not rows:
240
- break
241
- else:
242
- for row in rows:
243
- if self.encoding:
244
- yield [
245
- c.decode(self.encoding, "backslashreplace") if isinstance(c, bytes) else c for c in row
246
- ]
247
- else:
248
- yield row
237
+ try:
238
+ while True:
239
+ rows = curs.fetchmany()
240
+ if not rows:
241
+ break
242
+ else:
243
+ for row in rows:
244
+ if self.encoding:
245
+ yield [
246
+ c.decode(self.encoding, "backslashreplace") if isinstance(c, bytes) else c
247
+ for c in row
248
+ ]
249
+ else:
250
+ yield row
251
+ finally:
252
+ curs.close()
249
253
 
250
254
  return [d[0] for d in curs.description], decode_row()
251
255
 
@@ -253,6 +257,10 @@ class Database(ABC):
253
257
  """Execute *sql* and return ``(column_names, row_iterator)`` where each row is a ``dict``."""
254
258
  # Return an iterable that yields dictionaries of row data
255
259
  curs = self.cursor()
260
+ try:
261
+ curs.arraysize = _state.conf.export_row_buffer
262
+ except Exception:
263
+ pass # Non-critical: not all drivers support arraysize.
256
264
  try:
257
265
  curs.execute(sql)
258
266
  except Exception:
@@ -264,18 +272,24 @@ class Database(ABC):
264
272
  pass # Non-critical: some drivers lack rowcount support.
265
273
  hdrs = [d[0] for d in curs.description]
266
274
 
267
- def dict_row() -> dict | None:
268
- row = curs.fetchone()
269
- if row:
270
- if self.encoding:
271
- r = [c.decode(self.encoding, "backslashreplace") if isinstance(c, bytes) else c for c in row]
272
- else:
273
- r = row
274
- return dict(zip(hdrs, r))
275
- else:
276
- return None
275
+ def dict_rows() -> Generator:
276
+ try:
277
+ while True:
278
+ rows = curs.fetchmany()
279
+ if not rows:
280
+ break
281
+ for row in rows:
282
+ if self.encoding:
283
+ r = [
284
+ c.decode(self.encoding, "backslashreplace") if isinstance(c, bytes) else c for c in row
285
+ ]
286
+ else:
287
+ r = row
288
+ yield dict(zip(hdrs, r))
289
+ finally:
290
+ curs.close()
277
291
 
278
- return hdrs, iter(dict_row, None)
292
+ return hdrs, dict_rows()
279
293
 
280
294
  def schema_exists(self, schema_name: str) -> bool:
281
295
  """Return ``True`` if *schema_name* exists in this database."""
execsql/exceptions.py CHANGED
@@ -132,6 +132,8 @@ class ErrInfo(ExecSqlError):
132
132
 
133
133
  if self.type == "db":
134
134
  self.error_message = "**** Error in SQL statement."
135
+ elif self.type == "assert":
136
+ self.error_message = "**** Assertion failed."
135
137
  elif self.type == "cmd":
136
138
  self.error_message = "**** Error in metacommand."
137
139
  elif self.type == "log":
@@ -66,7 +66,7 @@ def x_assert(**kwargs: Any) -> None:
66
66
  if _state.exec_log is not None:
67
67
  _state.exec_log.log_user_msg(f"ASSERT passed: {condition}")
68
68
  else:
69
- raise ErrInfo(type="cmd", other_msg=message)
69
+ raise ErrInfo(type="assert", other_msg=message)
70
70
 
71
71
 
72
72
  def x_if(**kwargs: Any) -> None:
execsql/script/engine.py CHANGED
@@ -397,6 +397,15 @@ class ScriptCmd:
397
397
  self.line_no = command_line_no
398
398
  self.command_type = command_type
399
399
  self.command = script_command
400
+ # MIGRATION NOTE: differs from monolith (execsql.py) — source_dir and source_name are
401
+ # resolved once at construction rather than on every statement execution. For absolute
402
+ # paths (the common case) the result is identical. For relative paths the value is
403
+ # anchored to the CWD at script-load time rather than at each statement's execution time;
404
+ # the original per-statement resolve could yield inconsistent values across statements of
405
+ # the same script if a CD metacommand ran between them.
406
+ _p = Path(command_source_name)
407
+ self.source_dir: str = str(_p.resolve().parent) + os.sep
408
+ self.source_name: str = _p.name
400
409
 
401
410
  def __repr__(self) -> str:
402
411
  return f"ScriptCmd({self.source!r}, {self.line_no!r}, {self.command_type!r}, {repr(self.command)!r})"
@@ -498,9 +507,9 @@ class CommandList:
498
507
  _state.subvars.add_substitution("$CURRENT_SCRIPT", cmditem.source)
499
508
  _state.subvars.add_substitution(
500
509
  "$CURRENT_SCRIPT_PATH",
501
- str(Path(cmditem.source).resolve().parent) + os.sep,
510
+ cmditem.source_dir,
502
511
  )
503
- _state.subvars.add_substitution("$CURRENT_SCRIPT_NAME", Path(cmditem.source).name)
512
+ _state.subvars.add_substitution("$CURRENT_SCRIPT_NAME", cmditem.source_name)
504
513
  _state.subvars.add_substitution("$CURRENT_SCRIPT_LINE", str(cmditem.line_no))
505
514
  _state.subvars.add_substitution("$SCRIPT_LINE", str(cmditem.line_no))
506
515
  if _state.step_mode:
@@ -709,7 +718,7 @@ def set_system_vars() -> None:
709
718
  "ON" if _state.conf.gui_wait_on_error_halt else "OFF",
710
719
  )
711
720
  _state.subvars.add_substitution("$CONSOLE_WAIT_WHEN_DONE_STATE", "ON" if _state.conf.gui_wait_on_exit else "OFF")
712
- _state.subvars.add_substitution("$CURRENT_TIME", datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))
721
+ # $CURRENT_TIME is set per-statement in run_and_increment() for accuracy.
713
722
  _state.subvars.add_substitution("$CURRENT_DIR", str(Path(".").resolve()))
714
723
  _state.subvars.add_substitution("$CURRENT_PATH", str(Path(".").resolve()) + os.sep)
715
724
  _state.subvars.add_substitution("$CURRENT_ALIAS", _state.dbs.current_alias())
@@ -742,7 +751,7 @@ def substitute_vars(command_str: str, localvars: SubVarSet | None = None) -> str
742
751
  subs = _state.subvars.merge(localvars)
743
752
  else:
744
753
  subs = _state.subvars
745
- cmdstr = copy.copy(command_str)
754
+ cmdstr = command_str
746
755
  subs_made = True
747
756
  iterations = 0
748
757
  while subs_made:
@@ -89,7 +89,6 @@ class SubVarSet:
89
89
  # compatibility with external code.
90
90
  def __init__(self) -> None:
91
91
  self._subs_dict: dict[str, Any] = {}
92
- self._compiled_patterns: dict[str, tuple] = {}
93
92
  self.prefix_list: list[str] = ["$", "&", "@"]
94
93
  # Don't construct/compile on init because deepcopy() can't handle compiled regexes.
95
94
  self.var_rx = None
@@ -106,21 +105,6 @@ class SubVarSet:
106
105
  self._subs_dict = dict(value)
107
106
  else:
108
107
  self._subs_dict = dict(value)
109
- self._rebuild_all_patterns()
110
-
111
- def _compile_patterns_for(self, varname: str) -> tuple:
112
- """Compile and return the three regex patterns (plain, single-quoted, double-quoted) for *varname*."""
113
- match_escaped = "\\" + varname if varname[0] == "$" else varname
114
- pat = re.compile(f"!!{match_escaped}!!", re.I)
115
- patq = re.compile(f"!'!{match_escaped}!'!", re.I)
116
- patdq = re.compile(f'!"!{match_escaped}!"!', re.I)
117
- return (pat, patq, patdq)
118
-
119
- def _rebuild_all_patterns(self) -> None:
120
- """Rebuild compiled patterns for every variable currently stored."""
121
- self._compiled_patterns = {}
122
- for varname in self._subs_dict:
123
- self._compiled_patterns[varname] = self._compile_patterns_for(varname)
124
108
 
125
109
  def compile_var_rx(self) -> None:
126
110
  """Compile the variable-name validation regex from the current prefix list."""
@@ -141,14 +125,12 @@ class SubVarSet:
141
125
  self.check_var_name(template_str)
142
126
  old_sub = template_str.lower()
143
127
  self._subs_dict.pop(old_sub, None)
144
- self._compiled_patterns.pop(old_sub, None)
145
128
 
146
129
  def add_substitution(self, varname: str, repl_str: Any) -> None:
147
- """Add or overwrite a substitution variable, compiling its match patterns."""
130
+ """Add or overwrite a substitution variable."""
148
131
  self.check_var_name(varname)
149
132
  varname = varname.lower()
150
133
  self._subs_dict[varname] = repl_str
151
- self._compiled_patterns[varname] = self._compile_patterns_for(varname)
152
134
 
153
135
  def append_substitution(self, varname: str, repl_str: str) -> None:
154
136
  self.check_var_name(varname)
@@ -186,15 +168,10 @@ class SubVarSet:
186
168
  return template_str.lower() in self._subs_dict
187
169
 
188
170
  def merge(self, other_subvars: SubVarSet | None) -> SubVarSet:
189
- """Return a new SubVarSet with this object's variables merged with other_subvars.
190
-
191
- Copies dictionaries and pre-compiled patterns directly instead of
192
- re-adding variables one at a time, avoiding O(V) regex recompilation.
193
- """
171
+ """Return a new SubVarSet with this object's variables merged with other_subvars."""
194
172
  if other_subvars is not None:
195
173
  newsubs = SubVarSet()
196
174
  newsubs._subs_dict = {**self._subs_dict, **other_subvars._subs_dict}
197
- newsubs._compiled_patterns = {**self._compiled_patterns, **other_subvars._compiled_patterns}
198
175
  newsubs.prefix_list = list(set(self.prefix_list + other_subvars.prefix_list))
199
176
  newsubs.compile_var_rx()
200
177
  return newsubs
@@ -1,7 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: execsql2
3
- Version: 2.12.0
3
+ Version: 2.12.2
4
4
  Summary: Runs a SQL script against a PostgreSQL, SQLite, MariaDB/MySQL, DuckDB, Firebird, MS-Access, MS-SQL-Server, or Oracle database, or an ODBC DSN. Provides metacommands to import and export data, copy data between databases, conditionally execute SQL and metacommands, and dynamically alter SQL and metacommands with substitution variables.
5
+ Project-URL: Homepage, https://execsql2.readthedocs.io
5
6
  Project-URL: Repository, https://github.com/geocoug/execsql
6
7
  Project-URL: Issues, https://github.com/geocoug/execsql/issues
7
8
  Author-email: Dreas Nielsen <cortice@tutanota.com>
@@ -2,7 +2,7 @@ execsql/__init__.py,sha256=BIny4bL8uHuSl3gXPqEkIB2FtcexlARjR7IYPwtD9bM,486
2
2
  execsql/__main__.py,sha256=HdbK-SAhyUmfB6xINY5AzxdMSxGzWSGEG_2dv42Jn64,315
3
3
  execsql/config.py,sha256=ipOrF8frgtN9CDg5b9J3cQB0b5RiwzoH_znNN1GrkR8,36390
4
4
  execsql/constants.py,sha256=bns8_sN36Pe4R4vTQZb3dRXDHZhe4N34wZZboe1jBdM,12792
5
- execsql/exceptions.py,sha256=UE38-7HhQiwXzwKz9DgE4coTD2j6Jlam3jEB6-U-hNg,8383
5
+ execsql/exceptions.py,sha256=dpOjpD67nWQlKJIz4M2emDv5RbUbCo6-QuvnQ5M39p8,8477
6
6
  execsql/format.py,sha256=-6iknDddqbkapMo4NKmT5LAynDLqMW5kHgDWRg0KSws,11990
7
7
  execsql/models.py,sha256=DxkGp9iWbuZDWPGmnxZp9mvEeyOwxEJNx94fxQQiLfQ,13538
8
8
  execsql/parser.py,sha256=mbNSMiAMR1NvNvFtQAZq6nxBOupMGJZXSimLWLtZeNs,15537
@@ -16,7 +16,7 @@ execsql/cli/lint.py,sha256=XWuVcEsheZ8ql48VFWqICWEkAUezB2nIePX6SUiKSg8,16109
16
16
  execsql/cli/run.py,sha256=JGfndnBnJMkEqbz26pflhEdXDScZNIdGu6b6jTRLYl8,30681
17
17
  execsql/db/__init__.py,sha256=jTbuafuKOqYtXFR1wvCOoKK5Lr3l1uErfaIbIr6UywI,1063
18
18
  execsql/db/access.py,sha256=L79gUnAnnM9EJ_f4k42jr7DI0qGcKtLOnJTlBC7uPm0,17879
19
- execsql/db/base.py,sha256=hfMFj8fXY0T1aXLvWJHqb0aU4EQUDFOc-YrS29HH8U4,30405
19
+ execsql/db/base.py,sha256=CPoWu8qrxCOcQ6nh2oLyoqaPfC0yDU8bTECW_lZV9Dc,30953
20
20
  execsql/db/dsn.py,sha256=TgQUedVCxnEYA3vae7JETyhb8kK23qkNbPxsMQrNUN8,5368
21
21
  execsql/db/duckdb.py,sha256=cKeMwiSlYPyPDn1VLaJgbUD6_IEEaNqtUToLcmq7QaE,3189
22
22
  execsql/db/factory.py,sha256=YR1m_c2Hhj_GXVGGkWoSEPZBpgNu_c4FxRnbp-xV3rs,5230
@@ -64,7 +64,7 @@ execsql/importers/xls.py,sha256=e0Zfe47ZiCpA1Ae3XDJ1ko3sCiH3-8U6XLKi6NvD0jQ,3683
64
64
  execsql/metacommands/__init__.py,sha256=EmYUZZq1oaubbSQ26-8F9jJI_JnOJ2R697NeossXF1Q,11202
65
65
  execsql/metacommands/conditions.py,sha256=Fzrk83-pWbFOoKahYdQW7CZjQeh3zByDUbfgpTM_bjQ,29259
66
66
  execsql/metacommands/connect.py,sha256=Nsm0D91i3RX-R2rzQQ-Br-gULaI6Uvdn9fqb7DOAVfE,14804
67
- execsql/metacommands/control.py,sha256=xNHyTrYUM042OgDarNq7HxslY7JuQs-KOKcb-fHUngM,8510
67
+ execsql/metacommands/control.py,sha256=PAZFK1ck5SDSm5QdFV1ctif3KpEiyYWIXdDceRWgQ6k,8513
68
68
  execsql/metacommands/data.py,sha256=tRQBGTAuW-eJ2tBNWaoZI9OjTyNNyHJISo7gOdL-sm8,11370
69
69
  execsql/metacommands/debug.py,sha256=pnT24dfvfOx8xFu86mO5czfVCGKbcvgBLyXnqaMWO4w,8184
70
70
  execsql/metacommands/dispatch.py,sha256=OQwLOo9XT3N9C96wsRt0zmu1Nn4HL-7cSBOsGCfp5V4,84041
@@ -78,8 +78,8 @@ execsql/metacommands/script_ext.py,sha256=TUgAldB2LSJAwZrCvDDi804hQ1d9BDQD2GDqHN
78
78
  execsql/metacommands/system.py,sha256=sUR5kLL7idTVg8WXIMdd-Kv7nkERIiaeL0beWsz8NyY,7293
79
79
  execsql/script/__init__.py,sha256=pIo0EJ7-vg67rSMbOvbri_BOUgLoGoSEUfJgxUN7ZS0,3380
80
80
  execsql/script/control.py,sha256=s-1eZdGARM6H1FwZ6VDdO_f50j7bvvRtTHesfUm9tbc,6144
81
- execsql/script/engine.py,sha256=NJk4Is7Lp2Ov6zO8NNOOU8ACfmIFs2dD7PdhvJn6nNQ,41083
82
- execsql/script/variables.py,sha256=MOT9XEHucpuuuHQZM5bklxGMBQcwHzwTBxd0q3aO0XY,11641
81
+ execsql/script/engine.py,sha256=1qcWGfXPRqDd48PQwEbHmCO1eN4YYrQrS-0QUQb270g,41694
82
+ execsql/script/variables.py,sha256=mklG20WPhfv1mmqSVoRQHrzZvGN7ne_bqvRd0PMx5ss,10388
83
83
  execsql/utils/__init__.py,sha256=0uR6JwVJQRX3vceByNBduCAf5dd5assKjeqJUWvpZoA,278
84
84
  execsql/utils/auth.py,sha256=onXzNkNZQZxGC5w7eey06sjvAIAX_Lf9g7nUJtcsel0,7009
85
85
  execsql/utils/crypto.py,sha256=2OnBWwn9bCBGc1ZkyRv16TvhottoCNYtXqgbE3mG3Sg,2960
@@ -92,24 +92,24 @@ execsql/utils/numeric.py,sha256=xh02ANSRk3nUpQ-rtm66ILoMqoi7HtzCoRMIOT9U8QI,1570
92
92
  execsql/utils/regex.py,sha256=diEzTZqU_HHwVMadPAvN1Vgzhl7I03eVaEFGCXyGGL8,3770
93
93
  execsql/utils/strings.py,sha256=5Dvzrk-9SIw2lpxXZQkiJbNyo1sy7iXXAtSULlZ0KG8,8488
94
94
  execsql/utils/timer.py,sha256=eDYf5VzCNFk7oo90InJucUm3XcBdhYMogjZMqeg9xzc,1899
95
- execsql2-2.12.0.data/data/execsql2_extras/README.md,sha256=sxwVyU0ZahCfANv56LahkyuM505kFjrMhe-1SvWE69E,4845
96
- execsql2-2.12.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
97
- execsql2-2.12.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=SY3Jxn1qcVm4kPW9xmmTfknHfvURXmeEYTbRjYrjGSw,7487
98
- execsql2-2.12.0.data/data/execsql2_extras/execsql.conf,sha256=_45iJ-KWZnB8uMW_gEg067MM5pmGJ-dVl7VbAZMunAE,9530
99
- execsql2-2.12.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
100
- execsql2-2.12.0.data/data/execsql2_extras/md_compare.sql,sha256=B8Wd7LZ0vnMY2qvA139JIEBkPObgRH2i5xj6PejTQt8,24092
101
- execsql2-2.12.0.data/data/execsql2_extras/md_glossary.sql,sha256=DJRHcU5NbFpxTTX-IwH3yRlsboj1q6BBGrUAHKn4Cuo,10796
102
- execsql2-2.12.0.data/data/execsql2_extras/md_upsert.sql,sha256=v_7GbWh_N1mBTmw3gvTrkagOVp2q0KmXvM8hE-DlFxY,112524
103
- execsql2-2.12.0.data/data/execsql2_extras/pg_compare.sql,sha256=9dWa8hnfy5dVJI-z2iGpd9JzQmI4j2ziMlEdpnr66ro,24352
104
- execsql2-2.12.0.data/data/execsql2_extras/pg_glossary.sql,sha256=pKjIIDsROAgJq2H-1qNEcRMAWManivcZ_AEVHzUUlic,9908
105
- execsql2-2.12.0.data/data/execsql2_extras/pg_upsert.sql,sha256=k7AFiGTLBy3nf-qO5QIaZrEYTAKvdxxU3JDLx9jqkzs,108315
106
- execsql2-2.12.0.data/data/execsql2_extras/script_template.sql,sha256=1Estacb_vm1FgK41k_G9nuduP1yiA-fQ1Kn4Z4mv5Ao,11153
107
- execsql2-2.12.0.data/data/execsql2_extras/ss_compare.sql,sha256=TsVxWm3cEpR5-EiMYXNhtaY0arSNeKZhsJdHdLA7xeI,24833
108
- execsql2-2.12.0.data/data/execsql2_extras/ss_glossary.sql,sha256=cLM7nN8JOIu9ZVP9oY9qdSK3hrnWJiDcX6nZmQQbQWI,13065
109
- execsql2-2.12.0.data/data/execsql2_extras/ss_upsert.sql,sha256=BCqmBykXBF-BpCgOFeG1qhf2XfScKsxPD17wd1hYfHw,120647
110
- execsql2-2.12.0.dist-info/METADATA,sha256=l6mKQU4tPA9vkX6ZlUWNFRbou5rw5KPLML8V3urrV10,17381
111
- execsql2-2.12.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
112
- execsql2-2.12.0.dist-info/entry_points.txt,sha256=sUOxkM-dN1eBGGpSpDLsAaE0yNXYQKWZAfxPOlMkQyk,90
113
- execsql2-2.12.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
114
- execsql2-2.12.0.dist-info/licenses/NOTICE,sha256=sqVrM73Ys9zfvWC_P797lHfTnoPW_ETeBSrUTFaob0A,339
115
- execsql2-2.12.0.dist-info/RECORD,,
95
+ execsql2-2.12.2.data/data/execsql2_extras/README.md,sha256=sxwVyU0ZahCfANv56LahkyuM505kFjrMhe-1SvWE69E,4845
96
+ execsql2-2.12.2.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
97
+ execsql2-2.12.2.data/data/execsql2_extras/example_config_prompt.sql,sha256=SY3Jxn1qcVm4kPW9xmmTfknHfvURXmeEYTbRjYrjGSw,7487
98
+ execsql2-2.12.2.data/data/execsql2_extras/execsql.conf,sha256=_45iJ-KWZnB8uMW_gEg067MM5pmGJ-dVl7VbAZMunAE,9530
99
+ execsql2-2.12.2.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
100
+ execsql2-2.12.2.data/data/execsql2_extras/md_compare.sql,sha256=B8Wd7LZ0vnMY2qvA139JIEBkPObgRH2i5xj6PejTQt8,24092
101
+ execsql2-2.12.2.data/data/execsql2_extras/md_glossary.sql,sha256=DJRHcU5NbFpxTTX-IwH3yRlsboj1q6BBGrUAHKn4Cuo,10796
102
+ execsql2-2.12.2.data/data/execsql2_extras/md_upsert.sql,sha256=v_7GbWh_N1mBTmw3gvTrkagOVp2q0KmXvM8hE-DlFxY,112524
103
+ execsql2-2.12.2.data/data/execsql2_extras/pg_compare.sql,sha256=9dWa8hnfy5dVJI-z2iGpd9JzQmI4j2ziMlEdpnr66ro,24352
104
+ execsql2-2.12.2.data/data/execsql2_extras/pg_glossary.sql,sha256=pKjIIDsROAgJq2H-1qNEcRMAWManivcZ_AEVHzUUlic,9908
105
+ execsql2-2.12.2.data/data/execsql2_extras/pg_upsert.sql,sha256=k7AFiGTLBy3nf-qO5QIaZrEYTAKvdxxU3JDLx9jqkzs,108315
106
+ execsql2-2.12.2.data/data/execsql2_extras/script_template.sql,sha256=1Estacb_vm1FgK41k_G9nuduP1yiA-fQ1Kn4Z4mv5Ao,11153
107
+ execsql2-2.12.2.data/data/execsql2_extras/ss_compare.sql,sha256=TsVxWm3cEpR5-EiMYXNhtaY0arSNeKZhsJdHdLA7xeI,24833
108
+ execsql2-2.12.2.data/data/execsql2_extras/ss_glossary.sql,sha256=cLM7nN8JOIu9ZVP9oY9qdSK3hrnWJiDcX6nZmQQbQWI,13065
109
+ execsql2-2.12.2.data/data/execsql2_extras/ss_upsert.sql,sha256=BCqmBykXBF-BpCgOFeG1qhf2XfScKsxPD17wd1hYfHw,120647
110
+ execsql2-2.12.2.dist-info/METADATA,sha256=ur8GMD9rCXKMfNHGYTpA5ZYqLM52FrZCObAhaDqvSv4,17436
111
+ execsql2-2.12.2.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
112
+ execsql2-2.12.2.dist-info/entry_points.txt,sha256=sUOxkM-dN1eBGGpSpDLsAaE0yNXYQKWZAfxPOlMkQyk,90
113
+ execsql2-2.12.2.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
114
+ execsql2-2.12.2.dist-info/licenses/NOTICE,sha256=sqVrM73Ys9zfvWC_P797lHfTnoPW_ETeBSrUTFaob0A,339
115
+ execsql2-2.12.2.dist-info/RECORD,,