execsql2 2.24.0__py3-none-any.whl → 2.25.0__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 (72) hide show
  1. execsql/api.py +169 -160
  2. execsql/cli/__init__.py +2 -0
  3. execsql/cli/commands/lint.py +2 -10
  4. execsql/cli/commands/run.py +35 -27
  5. execsql/cli/dsn.py +11 -4
  6. execsql/cli/lint.py +271 -28
  7. execsql/cli/options.py +1 -1
  8. execsql/cli/run.py +56 -19
  9. execsql/config.py +5 -19
  10. execsql/data/execsql.conf.template +14 -4
  11. execsql/db/access.py +29 -8
  12. execsql/db/base.py +40 -8
  13. execsql/db/dsn.py +13 -4
  14. execsql/db/duckdb.py +3 -1
  15. execsql/db/factory.py +11 -2
  16. execsql/db/firebird.py +21 -7
  17. execsql/db/mysql.py +37 -16
  18. execsql/db/oracle.py +49 -16
  19. execsql/db/postgres.py +30 -6
  20. execsql/db/sqlite.py +7 -9
  21. execsql/db/sqlserver.py +25 -8
  22. execsql/exporters/delimited.py +87 -28
  23. execsql/exporters/xlsx.py +24 -9
  24. execsql/exporters/zip.py +1 -2
  25. execsql/format.py +29 -2
  26. execsql/gui/desktop.py +1 -3
  27. execsql/gui/tui.py +2 -2
  28. execsql/importers/base.py +35 -1
  29. execsql/importers/csv.py +3 -1
  30. execsql/manifest.py +33 -22
  31. execsql/metacommands/conditions.py +6 -7
  32. execsql/metacommands/data.py +4 -1
  33. execsql/metacommands/debug.py +2 -4
  34. execsql/metacommands/io_fileops.py +62 -37
  35. execsql/metacommands/io_import.py +0 -1
  36. execsql/metacommands/prompt.py +2 -0
  37. execsql/metacommands/upsert.py +5 -2
  38. execsql/models.py +3 -2
  39. execsql/parser.py +14 -5
  40. execsql/plugins.py +24 -0
  41. execsql/script/engine.py +40 -11
  42. execsql/script/executor.py +9 -5
  43. execsql/script/parser.py +167 -118
  44. execsql/state.py +23 -9
  45. execsql/state.pyi +8 -0
  46. execsql/types.py +22 -13
  47. execsql/utils/auth.py +169 -24
  48. execsql/utils/datetime.py +55 -17
  49. execsql/utils/errors.py +71 -9
  50. execsql/utils/fileio.py +404 -117
  51. execsql/utils/gui.py +3 -0
  52. execsql/utils/mail.py +37 -12
  53. {execsql2-2.24.0.dist-info → execsql2-2.25.0.dist-info}/METADATA +18 -12
  54. {execsql2-2.24.0.dist-info → execsql2-2.25.0.dist-info}/RECORD +72 -72
  55. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/README.md +0 -0
  56. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/config_settings.sqlite +0 -0
  57. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/example_config_prompt.sql +0 -0
  58. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/make_config_db.sql +0 -0
  59. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/md_compare.sql +0 -0
  60. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/md_glossary.sql +0 -0
  61. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/md_upsert.sql +0 -0
  62. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/pg_compare.sql +0 -0
  63. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/pg_glossary.sql +0 -0
  64. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/pg_upsert.sql +0 -0
  65. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/script_template.sql +0 -0
  66. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/ss_compare.sql +0 -0
  67. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/ss_glossary.sql +0 -0
  68. {execsql2-2.24.0.data → execsql2-2.25.0.data}/data/execsql2_extras/ss_upsert.sql +0 -0
  69. {execsql2-2.24.0.dist-info → execsql2-2.25.0.dist-info}/WHEEL +0 -0
  70. {execsql2-2.24.0.dist-info → execsql2-2.25.0.dist-info}/entry_points.txt +0 -0
  71. {execsql2-2.24.0.dist-info → execsql2-2.25.0.dist-info}/licenses/LICENSE.txt +0 -0
  72. {execsql2-2.24.0.dist-info → execsql2-2.25.0.dist-info}/licenses/NOTICE +0 -0
execsql/utils/gui.py CHANGED
@@ -533,6 +533,9 @@ def gui_credentials(
533
533
  _state.subvars.add_substitution(username, uname)
534
534
  if pwtext:
535
535
  _state.subvars.add_substitution(pwtext, passwd)
536
+ from execsql.utils.fileio import register_secret
537
+
538
+ register_secret(passwd)
536
539
 
537
540
 
538
541
  # ---------------------------------------------------------------------------
execsql/utils/mail.py CHANGED
@@ -12,6 +12,7 @@ metacommand and the halt/cancel email-notification hooks.
12
12
 
13
13
  import re
14
14
  import smtplib
15
+ import ssl
15
16
  from email import encoders
16
17
  from email.mime.base import MIMEBase
17
18
  from email.mime.multipart import MIMEMultipart
@@ -25,6 +26,20 @@ from execsql.exceptions import ErrInfo
25
26
  __all__ = ["MailSpec", "Mailer"]
26
27
 
27
28
 
29
+ def _tls_context(conf: object) -> ssl.SSLContext:
30
+ """The TLS context for the SMTP connection: verifying, unless ``[email] verify_certificate`` is off.
31
+
32
+ ``smtplib`` given no context uses an unverified one, which accepts any
33
+ certificate and hands the SMTP password to whoever answers.
34
+ """
35
+ if not getattr(conf, "smtp_verify_certificate", True):
36
+ ctx = ssl.create_default_context()
37
+ ctx.check_hostname = False
38
+ ctx.verify_mode = ssl.CERT_NONE
39
+ return ctx
40
+ return ssl.create_default_context(cafile=getattr(conf, "smtp_ca_file", None))
41
+
42
+
28
43
  class Mailer:
29
44
  def __repr__(self) -> str:
30
45
  return "Mailer()"
@@ -56,20 +71,30 @@ class Mailer:
56
71
  # 30 s connect/read timeout matches the DB-adapter default so a
57
72
  # silently-dropped SMTP peer can't hang a script (or a CI run).
58
73
  smtp_timeout = 30
59
- if conf.smtp_port is None:
74
+ port = conf.smtp_port or 0
75
+ try:
60
76
  if conf.smtp_ssl:
61
- self.smtpconn = smtplib.SMTP_SSL(conf.smtp_host, timeout=smtp_timeout)
62
- else:
63
- self.smtpconn = smtplib.SMTP(conf.smtp_host, timeout=smtp_timeout)
64
- else:
65
- if conf.smtp_ssl:
66
- self.smtpconn = smtplib.SMTP_SSL(conf.smtp_host, conf.smtp_port, timeout=smtp_timeout)
77
+ self.smtpconn = smtplib.SMTP_SSL(
78
+ conf.smtp_host,
79
+ port,
80
+ timeout=smtp_timeout,
81
+ context=_tls_context(conf),
82
+ )
67
83
  else:
68
- self.smtpconn = smtplib.SMTP(conf.smtp_host, conf.smtp_port, timeout=smtp_timeout)
69
- self.smtpconn.ehlo_or_helo_if_needed()
70
- if conf.smtp_tls:
71
- self.smtpconn.starttls()
72
- self.smtpconn.ehlo(conf.smtp_host)
84
+ self.smtpconn = smtplib.SMTP(conf.smtp_host, port, timeout=smtp_timeout)
85
+ self.smtpconn.ehlo_or_helo_if_needed()
86
+ if conf.smtp_tls:
87
+ self.smtpconn.starttls(context=_tls_context(conf))
88
+ self.smtpconn.ehlo(conf.smtp_host)
89
+ except ssl.SSLCertVerificationError as exc:
90
+ raise ErrInfo(
91
+ type="error",
92
+ other_msg=(
93
+ f"Can't send email; the certificate of SMTP server {conf.smtp_host} could not be verified "
94
+ f"({exc.verify_message}). For a server with an internal or self-signed certificate, set "
95
+ "[email] ca_file to its CA certificate, or set verify_certificate = No."
96
+ ),
97
+ ) from exc
73
98
  if conf.smtp_username:
74
99
  if not conf.smtp_password:
75
100
  # smtplib.login() requires a password; calling it with only a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: execsql2
3
- Version: 2.24.0
3
+ Version: 2.25.0
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
5
  Project-URL: Homepage, https://execsql2.readthedocs.io
6
6
  Project-URL: Repository, https://github.com/geocoug/execsql
@@ -161,7 +161,7 @@ Scripts are ordinary SQL plus metacommands embedded in comments (`-- !x!`), whic
161
161
  | Command | What it does | Needs a database? |
162
162
  | ------------------------------------------ | ----------------------------------------------------------------------- | ----------------- |
163
163
  | `execsql format` | Normalize keywords, indentation, and SQL layout | No |
164
- | `execsql lint` | Static analysis: structure, undefined variables, bad targets | No |
164
+ | `execsql lint` | Static analysis: structure, unknown metacommands, variables, targets | No |
165
165
  | `execsql run` | Run the script against PostgreSQL, MySQL, SQLite, DuckDB, … | Yes |
166
166
  | `execsql config` | Show every config option, its value, and the file that set it | No |
167
167
  | `execsql list` | Metacommands, encodings, plugins, or the keyword vocabulary | No |
@@ -180,14 +180,14 @@ Scripts are ordinary SQL plus metacommands embedded in comments (`-- !x!`), whic
180
180
  `format` and `lint` work on a bare `.sql` file, with no server and no config. Try them first:
181
181
 
182
182
  ```bash
183
- pip install execsql2[formatter]
183
+ uv tool install "execsql2[formatter]" # or: pipx install "execsql2[formatter]"
184
184
 
185
185
  execsql format --check scripts/ # is it formatted?
186
186
  execsql format -i scripts/ # format it
187
187
  execsql lint scripts/ # find problems before they cost you a run
188
188
  ```
189
189
 
190
- `lint` reports unmatched blocks, undefined and unused substitution variables, unreachable branches, and `INCLUDE`/`SCRIPT` targets that do not exist: the failures that otherwise surface halfway through a run against a live database:
190
+ `lint` reports unmatched blocks, misspelled or malformed metacommands and conditions, undefined and unused substitution variables, unreachable branches, and `INCLUDE`/`SCRIPT` targets that do not exist: the failures that otherwise surface halfway through a run against a live database:
191
191
 
192
192
  ```text
193
193
  $ execsql lint load_data.sql
@@ -244,11 +244,16 @@ The `PROMPT` metacommand produces a GUI display of the data:
244
244
  ## Installation
245
245
 
246
246
  ```bash
247
- pip install execsql2 # core: SQLite works with no extras
248
- pip install "execsql2[postgres]" # add a driver: postgres, mysql, mssql, duckdb, firebird, oracle, odbc
249
- pip install "execsql2[all]" # everything: all drivers plus all feature extras
247
+ uv tool install execsql2 # core: SQLite works with no extras
248
+ uv tool install "execsql2[postgres]" # with a driver: postgres, mysql, mssql, duckdb, firebird, oracle, odbc
249
+ uv tool install "execsql2[all]" # everything: all drivers plus all feature extras
250
250
  ```
251
251
 
252
+ `pipx install` takes the same arguments. Quote the name when it has extras
253
+ (zsh reports `no matches found` otherwise). To call execsql from Python code,
254
+ add it to that project instead: `uv add "execsql2[postgres]"` or
255
+ `pip install "execsql2[postgres]"` in its virtual environment.
256
+
252
257
  Feature extras cover spreadsheet and Parquet/Feather formats, keyring authentication, PostgreSQL upsert, and more. See the [installation guide](https://execsql2.readthedocs.io/en/latest/getting-started/installation/) for the full list.
253
258
 
254
259
  ## Usage
@@ -309,7 +314,7 @@ silences.
309
314
  | `-c SCRIPT` | Execute inline SQL or metacommand string |
310
315
  | `-a VALUE` | Set substitution variable `$ARG_x` |
311
316
  | `--var NAME=VALUE` | Set the substitution variable `!!NAME!!` |
312
- | `-v {0,1,2,3}` | GUI level (0=none, 1=password, 2=selection, 3=full) |
317
+ | `-v {0,1,2,3}` | GUI level (0=none, 1=password/PAUSE, 2=+HALT and DB selection, 3=console) |
313
318
  | `--config FILE` | Load an explicit config file |
314
319
  | `--dry-run` | Parse the script and report commands without executing |
315
320
  | `--manifest FILE` | Write a JSON record of the run: files read and written, statements, errors |
@@ -360,7 +365,8 @@ result = run(
360
365
  new_db=True,
361
366
  )
362
367
 
363
- # With substitution variables
368
+ # With substitution variables: each key becomes a $ variable,
369
+ # so the script refers to these as !!$SCHEMA!! and !!$DATE!!
364
370
  result = run(
365
371
  script="etl.sql",
366
372
  dsn="sqlite:///data.db",
@@ -371,7 +377,7 @@ result = run(
371
377
  print(result.success) # True
372
378
  print(result.commands_run) # 2
373
379
  print(result.elapsed) # 0.003 (seconds)
374
- print(result.variables) # {"SCHEMA": "public", ...}
380
+ print(result.variables) # {"schema": "public", ...} (names lower-cased, no $)
375
381
  ```
376
382
 
377
383
  Error handling:
@@ -428,7 +434,7 @@ The `execsql format` command normalizes execsql script files: it uppercases meta
428
434
 
429
435
  ```bash
430
436
  # Install with the SQL-reformatting extra
431
- pip install execsql2[formatter]
437
+ uv tool install "execsql2[formatter]"
432
438
 
433
439
  # Format files in place
434
440
  execsql format --in-place scripts/
@@ -445,7 +451,7 @@ execsql format --no-sql --in-place scripts/
445
451
  ```yaml
446
452
  repos:
447
453
  - repo: https://github.com/geocoug/execsql
448
- rev: v2.24.0
454
+ rev: v2.25.0
449
455
  hooks:
450
456
  - id: execsql-format
451
457
  - id: execsql-lint
@@ -1,55 +1,55 @@
1
1
  execsql/__init__.py,sha256=ZeVnpEWu8M2bn3qLmVM72NhWRueUGNbsX8UAPTermo0,901
2
2
  execsql/__main__.py,sha256=HdbK-SAhyUmfB6xINY5AzxdMSxGzWSGEG_2dv42Jn64,315
3
- execsql/api.py,sha256=gBNEINlQSncfhO1tvc-qD1MBXTuhDVIP16LhiqfnzQI,25334
4
- execsql/config.py,sha256=Pj6wPOrZbCntI0UkYQoSGTH1dhatQ8z5PdVjw7eY5HY,38531
3
+ execsql/api.py,sha256=UJJSlFHySuINeoExaMXqhl00hVSPH1s7G4m8T0NX_xI,26484
4
+ execsql/config.py,sha256=f9UMX5LECVL6KnvvTmIIAMrqOfYe_elQxjW1TOSt4fA,38040
5
5
  execsql/config_validation.py,sha256=a4ZszyJFGTNgs1jkvXE3yMCaYFtF1Uqih2ojMDVh1v8,10556
6
6
  execsql/exceptions.py,sha256=aHavdblmP7m5ZLxyyKKmPSwwbdmP962j4ShP1Gd9r64,9651
7
- execsql/format.py,sha256=RCnHI-L2T0F7zJeswYA4EWO99v88rpf6x8qPp4eILM0,53159
7
+ execsql/format.py,sha256=rpe-eB7V9J2z7Itr_MFtdUeU2-sR8F6B7a3vYmHXKd0,54253
8
8
  execsql/interactive.py,sha256=7vm7NAlcarBJJOIffcLOcJqH9ZCInvHB_CmC2sQsXf8,8241
9
- execsql/manifest.py,sha256=1kpzKIJXRC11ff-NOlppGdc4KYyZrAwg6OwTPbM774U,7698
10
- execsql/models.py,sha256=-DWTVrPNwM-n1h3e3rXMoBv9-wpWVdZahyy4RB7fRRE,15502
11
- execsql/parser.py,sha256=aOxZ7Mzgvk7G4-nvy9Bgz7xlaZm6oo81cffDeBk_LCk,15597
12
- execsql/plugins.py,sha256=l82VWa5NpvOQWD6vcO-WKP-vtn0wp9__wWDFAbwxZg0,12838
9
+ execsql/manifest.py,sha256=ibceEZtH2FqsUiujbTGy5D3W0WgO4tFCs7bjIHVdep4,8062
10
+ execsql/models.py,sha256=yXR9FMCSCRonfyiuWlYwqLBMLzWQcvFQOjGHogM8Veg,15556
11
+ execsql/parser.py,sha256=bw26e1lD-PZscV11VtBdqSLkjpcYfNLQC2EYfYD5UwU,16012
12
+ execsql/plugins.py,sha256=RykMlIjTyWcnQc9ygjLErS3wdcsZSsG9QTIvg4DwfAI,13626
13
13
  execsql/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- execsql/state.py,sha256=SXJqTsveOgBRzmP08aXwZBdvRcmi-cOKIooA5X5xRAY,22730
15
- execsql/state.pyi,sha256=yahCOVaKt07Tyt6u7TDd_KewKU2z9i21AtzanlgXQ_Y,4028
16
- execsql/types.py,sha256=8rAoRaWwgBnR-ZhNEfahTTbZ_D4fB4vBuGeMEUnu7vE,32454
17
- execsql/cli/__init__.py,sha256=Yx_WZys7_5V_K6ijeA_AmbUEny5QbUU-_n2eyTnEPMY,3123
14
+ execsql/state.py,sha256=NDAtv38b2cmknz-jEgOaOeqZCc6GdxN6mz-KCqb9pqg,23263
15
+ execsql/state.pyi,sha256=pEuTT4G6VNiwy4Ii7OUXc1RvzcQvjFkeFazSGEOprs0,4300
16
+ execsql/types.py,sha256=qUJ5kVKz_Crc9hti5u9_VnVzLBQ2n5Jtbje5hSwxGzE,32809
17
+ execsql/cli/__init__.py,sha256=8wDwIAFq7AI9iSGuw-Xfky-izN_7oHjUegr_brEBot0,3197
18
18
  execsql/cli/application.py,sha256=qKjkhDMWB7fEjEbqOLZ3pNFw80piBnRSeW_DfZg-9MA,12448
19
19
  execsql/cli/dispatch.py,sha256=ew10mZNXsFHwiNd_etvpSQYD3T8CiexXkjC3Ja94C4w,2697
20
- execsql/cli/dsn.py,sha256=svaZtrUXFRL2W5G6FRRiKtR6kehOp7urrVhIx_642Z8,2820
20
+ execsql/cli/dsn.py,sha256=uBspf8DXCn2pXmT1Ug1c4IG7IgR5IFGKp9138puaubo,3289
21
21
  execsql/cli/help.py,sha256=Edr3d2ahKv387a6WGgyJi5vKIFe39tGPgTv1GKp3itE,10848
22
- execsql/cli/lint.py,sha256=fmWU93Bss2ClaPTVv0GXweFluFgGCZvjh6BUp7SZvLM,33038
23
- execsql/cli/options.py,sha256=DwforvpFZ3eqL_J5ODcmrp3NQjoNioYcf8wQTzt4nfc,2883
24
- execsql/cli/run.py,sha256=gYIyikNEuvVCL_labPm_NGuPgQof4VVWo6-_ee7fjYk,40457
22
+ execsql/cli/lint.py,sha256=7t4HXMqPCxHR6PoRxna0X3myu9hlxuK1rbPn5h2tX1Y,43390
23
+ execsql/cli/options.py,sha256=Srhf1gEOB5yy_7PxkTKBv07xK8Qzw8H-z7PUUnItpwE,2916
24
+ execsql/cli/run.py,sha256=5f0SX6QyNl8Ur2MwuW2GaN1OqVpWbEI8CQV3k-hBwH8,41987
25
25
  execsql/cli/commands/__init__.py,sha256=wN5sbhKs11S8EZOTBd_GPP6TPjhYfiQkrI48Sy8n6U0,521
26
26
  execsql/cli/commands/config.py,sha256=V7CGGkhSCqeJIlAXxAYyG_xNhnsORiwqth2XWEVPzss,8213
27
27
  execsql/cli/commands/format.py,sha256=2pftY7nl8FexJ5tnvncxRG-7UjQ_NO0mHxmqAOKd-Nw,3948
28
28
  execsql/cli/commands/init.py,sha256=kmuFgGz8sv_1KfiNh190E3A23evqkgYZeBRTU6vdjbs,5465
29
- execsql/cli/commands/lint.py,sha256=Q9icZcfnmkqfq3Ol5b_xYtjQ13R2EhWQsvPlRkgwiNI,8480
29
+ execsql/cli/commands/lint.py,sha256=Lba5IDsXtiUbQ6DkhC9fdLnoSpfoaewoAWF-ei3h59s,8189
30
30
  execsql/cli/commands/listing.py,sha256=gWnjkgcw7uF-DJw3cMZbttOKdplDwAMlhmaBoI5drVw,2511
31
- execsql/cli/commands/run.py,sha256=w-rjLYSDDTLCh8xuuKjxeqZqdGgJGaydKQBOaL8NYLs,15994
31
+ execsql/cli/commands/run.py,sha256=sGFDku66CazJrorr0mmrhUI3QDvQVSMEYlU8G1Pd5fQ,16492
32
32
  execsql/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- execsql/data/execsql.conf.template,sha256=9eJbFP1EitNokmRg2V-OrkStduF-pOmYR9R5LWRN_wM,11887
33
+ execsql/data/execsql.conf.template,sha256=fTxA6Y01D-7BFABPgnJbEfPD5SSQ-l1xnaptMEBXuzc,12326
34
34
  execsql/data/script_header.sql,sha256=a7WKScekNgJoxVEmMRTkWv8NsAzW1jJ4vJfGy9HVy0g,349
35
35
  execsql/db/__init__.py,sha256=jTbuafuKOqYtXFR1wvCOoKK5Lr3l1uErfaIbIr6UywI,1063
36
- execsql/db/access.py,sha256=2VlfEDXvV8xoi1t_hKzEaIidCJ1XGerYFPFvW5FqVBI,20489
37
- execsql/db/base.py,sha256=2bK1TBU9IAHnQQcdgJ-wEwm5TzrhnwO6j6BGjR9VAHg,40656
38
- execsql/db/dsn.py,sha256=hC_oWrBz2NSGyAOjZsROxGHs9eI_CSpnnken12wH1hU,6663
39
- execsql/db/duckdb.py,sha256=h8fh_5Ps1UcXvfyG9UlSyP32Yoa0W8sn246RlQ4xOMU,6970
40
- execsql/db/factory.py,sha256=lkyy9_aK-RY6_VvhwyVb3F61PZXLe4RVY6zC6h6ZNzY,5441
41
- execsql/db/firebird.py,sha256=fbzlGB6DeR-S9RFLUD4tJYPN-_76tyRLBkQl5LRJTDo,9640
42
- execsql/db/mysql.py,sha256=vG_5NPoe82FLvdfY4e7ZnjX0-mgts4D3S40LwZKb7U8,20489
43
- execsql/db/oracle.py,sha256=jjXwhk_og1qHqdAB16i_dZYXY0Ze7Bg5EvKdCKwjQtE,12667
44
- execsql/db/postgres.py,sha256=HfrWuJ5-K5le1sY9iGv_E51JHciPIdA0UvyLsTKlnO4,22568
45
- execsql/db/sqlite.py,sha256=zfe-KNAuTIHDh_qk3yzCo6fMerlmtt7UFmg-lbdZFm4,12167
46
- execsql/db/sqlserver.py,sha256=O4E9OD3V3Xowsjl3KMdYHNCBeETlkJS9HUzNKEKuA9A,8943
36
+ execsql/db/access.py,sha256=O19alGOCjhBtVFaCnGN8zwVZ2wR57h1spizAF5dhUOg,21207
37
+ execsql/db/base.py,sha256=K_NJ5Tpn68qUyc5epnT3V3jUxkv1lCAXF0rGul-8otc,42264
38
+ execsql/db/dsn.py,sha256=a3_q7oucR37CMCKNO9S5ShsB_JDwmZY4d8QI1aqeFSU,6893
39
+ execsql/db/duckdb.py,sha256=h62nEuwNl8Bz8ZcJJNIAfFK1o91KXxAeh8unlwTivKc,7047
40
+ execsql/db/factory.py,sha256=cMptU3BL1Nsilo7LKLAI5RR-LiC9RTH-3UC9rHT2JLQ,5519
41
+ execsql/db/firebird.py,sha256=sU2XqYV0U6hTgUuetFfMdlZwlBlXgPVXXn_wi1XCy1U,10196
42
+ execsql/db/mysql.py,sha256=ooH4uNomr_VatEldJ70ynsOth4_STa8-761O33NfndY,21496
43
+ execsql/db/oracle.py,sha256=-n8CgbZd9zaGnbfQQmWAdFgPA_B-HkLNC6yvENbzqyc,13720
44
+ execsql/db/postgres.py,sha256=QXL34lyg6w7zj2S-1AAlyswPGjbXZz7GZS2qFB4pANY,23604
45
+ execsql/db/sqlite.py,sha256=fEpNPkfJGnqm1Wx_rZK5SEqaWsBqLy85Jxk_5NsnqgM,12109
46
+ execsql/db/sqlserver.py,sha256=e4UP2Ps0EXjVjX4TOYNslsviBF2dorx8TEvPhxb9rrY,9503
47
47
  execsql/db/tiers.py,sha256=PH2sUYwlYqcANGVKXprWQKVIlM6fpWU9q74djn8oFwc,2924
48
48
  execsql/debug/__init__.py,sha256=j6EGUR0dHzUhWN1mHHtf1-Lhjq3Sb1V-vmnq2Ztgj1M,178
49
49
  execsql/debug/repl.py,sha256=jnwrqRac4krc1pES7Ni-j1Dyw3mJIcWl5LQQIX1GkRw,20753
50
50
  execsql/exporters/__init__.py,sha256=-Cnji-OgodJV8ftcDcOyTof0kQMy9J5kKVC8GVFpc3o,670
51
51
  execsql/exporters/base.py,sha256=_GoO0YqwlTxrjogxHI3CxxRR64sMgIEjRogt0KCqzoY,6402
52
- execsql/exporters/delimited.py,sha256=v47Js8ZrQfTqx0aTDAD-9nkOx4ilAPnk_dZT3vAoCTw,33632
52
+ execsql/exporters/delimited.py,sha256=N0cP_CNlb_LLCUqbHmTQsOGufWnD_ddGdeFnXPE8Erc,35606
53
53
  execsql/exporters/duckdb.py,sha256=912TMdYaSVD-kb-_oebTBHQp8FvYMbWTDEDD80w5Z50,3455
54
54
  execsql/exporters/feather.py,sha256=tah48aep0cQRikZcmADXUPTzFddgDUT78Ndw_l0Hsj4,4178
55
55
  execsql/exporters/html.py,sha256=hwf9UHs7EZ7xiP3p9ilBIsAukXcDu-KO2dcQHVh2z30,10111
@@ -65,76 +65,76 @@ execsql/exporters/sqlite.py,sha256=QjP_W90S-hecNqp2A-Vy58DD8MZitME1sTq4lqIS43w,3
65
65
  execsql/exporters/templates.py,sha256=nRFurwTb5nxoyHpx609FGIp3MDbX_mYQ3IvgswaEbyA,7054
66
66
  execsql/exporters/values.py,sha256=UPxN5IprasBZLqM5jfUXQihjdTeBFTxbJslOEtmGOcY,3384
67
67
  execsql/exporters/xls.py,sha256=iZ_N7hneyfaDKbO1XdYv6doJCFPqJWEJql5rduoNyRU,11197
68
- execsql/exporters/xlsx.py,sha256=5pTN8OsygLjk3MADJf8O7t3bdzSul7rrVO7SVSR581c,12223
68
+ execsql/exporters/xlsx.py,sha256=hmL0i-2HweXFenl5uXjM3-w2DW2Ky8DeYTcZnFzmeOU,12708
69
69
  execsql/exporters/xml.py,sha256=t1PSr3i8xvTCWzd9jaxxAy5NcRpl6sqjnZALafKCqpM,2575
70
70
  execsql/exporters/yaml.py,sha256=R61Rs_0rd5G3bg344L4hC84GM79IfYXaDO2tkF-BluY,3121
71
- execsql/exporters/zip.py,sha256=341z4Z4MPtEkXJEtfiMSiuJigERh5_f8RDbNMBbt8KM,5078
71
+ execsql/exporters/zip.py,sha256=0vDkXB19WzLzgCACBVNnGJYxacgBwEehQDL7Inl-rgw,5002
72
72
  execsql/gui/__init__.py,sha256=oCb-cyhLZzVpWJ4WU5HbqEDBrV-lm0ytEwxemrOZyqs,2048
73
73
  execsql/gui/base.py,sha256=DMTqHLlpZlGCsNKyrLlJPbaxvukC0n1YmR4aHEN3jPY,14983
74
74
  execsql/gui/console.py,sha256=dzdSl4NJNvRd9VvlwRCXHvfnXjQPimyTx7NcibcUZC8,18305
75
- execsql/gui/desktop.py,sha256=922OdzjV4OGNDIesOxKOmlsrNp1aJ8St8cVwED0H2sE,59521
76
- execsql/gui/tui.py,sha256=jlCoP1lsEJgFsFikKVqF4B3s3KyKRs6JbWfwtlFHyDc,66800
75
+ execsql/gui/desktop.py,sha256=y-T317NzSs9kcA4-NZW-Dx2cZ4Bv1mPoCr7hwQCJYoo,59467
76
+ execsql/gui/tui.py,sha256=VoUtjSMopYtbtc8_-qV7YQAFvc-bS7zrZ5J2hl1cPxM,66853
77
77
  execsql/importers/__init__.py,sha256=zZwdQxMaValCNqUrVdvaA7XPU3J8NmqVJ4uolNWY2iU,299
78
- execsql/importers/base.py,sha256=3Iq_Sr4cCXKHpjjJYkhZX6uhsIIRAdmvAvTdC4mFlWo,4326
79
- execsql/importers/csv.py,sha256=Kec1VCycRdfstNoxIXsEsSFqQprZp_edpNiMZm43eTI,4914
78
+ execsql/importers/base.py,sha256=ikvJ98vVCcDBqp5ZdwwHwf-6zQCO4f8uI355VCVukHo,5783
79
+ execsql/importers/csv.py,sha256=4zIv-K02fuHKxnbqS5iTvLOeVnfssLYYJrs0Gh3qv7I,5021
80
80
  execsql/importers/feather.py,sha256=g2B69d2uv9vmnXcmjFyTVsMP40LYEzFYkhk3gD26mGw,1900
81
81
  execsql/importers/json.py,sha256=fL47h09Zzx4Qw3TTQRQJbdPdD3qVMiU-kK9C7j1IQzg,5534
82
82
  execsql/importers/ods.py,sha256=VsxIkr7opBamB0PbSFmMWt7G11w8lLUH1k_kRwz28zw,2847
83
83
  execsql/importers/xls.py,sha256=D7Ul42gIRYZZC5QxD35ft_wmqQv2f1jNMSbnqlzV0ZA,3851
84
84
  execsql/metacommands/__init__.py,sha256=H_D1Z5kN6zfYtxatejQhQhQV1tlVZ7rcdFZ_9uhXu2Q,13010
85
- execsql/metacommands/conditions.py,sha256=RJF5vplY6nRPk7oRg_AJ9Q8UdivpCn1srv2ixkJ-pW0,30066
85
+ execsql/metacommands/conditions.py,sha256=4DsMXr6vnfbtcKqgnxYV4UK4NmAfE_hpfgkFjlH0bjo,29844
86
86
  execsql/metacommands/connect.py,sha256=SPk4h9yiUgTD3w1gNOT_oYx8VShggsO357by5Hoy6OI,15344
87
87
  execsql/metacommands/control.py,sha256=9swW6X8jXDUpu5cHiAnQVx1ahFyWxlx7mjg4dqYfX5Y,9355
88
- execsql/metacommands/data.py,sha256=Rp18lHUKSTkwTFRjOQ7bDgZd42LNLVoTS3Zc_bcNEWY,12199
89
- execsql/metacommands/debug.py,sha256=MeVXAob8ItEg2QzuSUkKDaQCEABnH6u0XcAwJzw36CE,13015
88
+ execsql/metacommands/data.py,sha256=gaKJ0xA-maFnezT9TJv-q4G4Etn-kJnF7vZWZoG4UqI,12305
89
+ execsql/metacommands/debug.py,sha256=XyMoKnQKyYHdzcfGUGFEaecIlDOi1LMirwbbpbiRO7I,12922
90
90
  execsql/metacommands/dispatch.py,sha256=t7x0xWHJA0PeCrYf7jYeSMJgf0yxcZ_xh-_YAtBPHLw,87192
91
91
  execsql/metacommands/effects.py,sha256=cRSo48R4nRJzkRR3OGHLhJzofcdAaNIobaxmn1N9TGw,3813
92
92
  execsql/metacommands/io.py,sha256=vlGBje5sgnqeilooMdhJDgSRIhysHy5_7LrKtik9Xjs,3011
93
93
  execsql/metacommands/io_export.py,sha256=YamxQwURRjZRpCG2z8W3QurncCmEmAyLFqDkxtHo5dY,14434
94
- execsql/metacommands/io_fileops.py,sha256=l1ZaTMzvsXa88zaQp-scWvUy4TMmN4WVVhr4V6-b-tE,11645
95
- execsql/metacommands/io_import.py,sha256=bIFQMTEW9Rc5FB0VAR-04eve7FL0g0gBKtdoGR_jXrI,15719
94
+ execsql/metacommands/io_fileops.py,sha256=uXP5PdHOc8yi1rPo8PbWmvAx_yp69ozCkK_SHYoL0NE,12646
95
+ execsql/metacommands/io_import.py,sha256=gJICeK1MOfG6D73I7m8zBCalvr_ZJzD-QBKOpKYeYXo,15684
96
96
  execsql/metacommands/io_write.py,sha256=yXDkMbQ3haDARVATVUYZprakyJHSyk1NywdKkFLpQ14,12783
97
- execsql/metacommands/prompt.py,sha256=7pPURC11qBFcKEI7IdhrttbiBKTc1txjH59QN3dvFyQ,37865
97
+ execsql/metacommands/prompt.py,sha256=PlXhtBYCembG_1SSCrwpQR10mGF3_jXodu4aCSHlSCM,37950
98
98
  execsql/metacommands/script_ext.py,sha256=CsUbyq8QFPnnvfX_k7fPlYNvvRw1xLmAWER4Exo5pwc,3658
99
99
  execsql/metacommands/system.py,sha256=6X2qmMpGUHDzyEluEotXt0Ks9jKQTpc2x0eoYNgN12M,7997
100
- execsql/metacommands/upsert.py,sha256=wzoMpM8g49pEvU9GkHZ62fPvqV3w1UIUfxVA7HAsS_o,20317
100
+ execsql/metacommands/upsert.py,sha256=qez06e41ivxsLlB-Af91fkVzD6XhHVxpvv5sLMPul6M,20429
101
101
  execsql/script/__init__.py,sha256=I7hVO6wm3iOocxRRGEcFHhjdtL1moKbUYLB-wKbjPdk,3267
102
102
  execsql/script/ast.py,sha256=WqCpFxhxrT2IIGvbArTp3QS0BZryRZAb7IL4ri3I6xg,20591
103
103
  execsql/script/control.py,sha256=WqLy-HLPqHG3vEzYpKMiIJsD7LpORjyQuUWzFzcGz4w,2327
104
- execsql/script/engine.py,sha256=-F_0qacvSq-hNh7fQJ5brk-cslh_mpKJx7p9Nmf_sYA,17603
105
- execsql/script/executor.py,sha256=IA_1XMmVo7A-XlIZZS-JrgyKykSCUlcXcfZcs7DpMUg,41389
106
- execsql/script/parser.py,sha256=VhFTJK8kODNRWgIDc3LjYjA3_SMPFATkpjVl82dYnrM,35179
104
+ execsql/script/engine.py,sha256=wjXKwPIis-T2Y8rLnRXQ_ymUFdXff1MlI2IIYmxihKo,18448
105
+ execsql/script/executor.py,sha256=lvMFjKe2h4fafhKNiuoXAYpDe8pLHHuYMiwPkLYJe9I,41527
106
+ execsql/script/parser.py,sha256=z73v6t6ZbPUKkRu-UOIL6q1cCRDeoRvG2aXXC8NpMvE,37162
107
107
  execsql/script/variables.py,sha256=_hklqCeqPbdOT646Yg3ZcpmPke38_8bukMG3eZMTKZw,16384
108
108
  execsql/utils/__init__.py,sha256=0uR6JwVJQRX3vceByNBduCAf5dd5assKjeqJUWvpZoA,278
109
- execsql/utils/auth.py,sha256=8Wixkx5nayEBG7RT4WTUQpCiElIKS3yOTV_6_-hHTRs,8889
109
+ execsql/utils/auth.py,sha256=BV7VtLM-ID8jNB42vx7GEz8yb3Z1Qs9xCr4cUMqL864,14539
110
110
  execsql/utils/color.py,sha256=goQqhnLg8yERpFolQikA9zYSVcuAm0unKTJiWTbQm-U,634
111
111
  execsql/utils/crypto.py,sha256=KlT6lPk-v0-qQQfAMfWvT9Q6kRdCD3_5JVaLajNocKM,3051
112
- execsql/utils/datetime.py,sha256=8BrD24KWeMoouJZiFaXK4HF7plc-O_xrzIw12qOEyp8,3629
113
- execsql/utils/errors.py,sha256=LdIYp9C_m1BjdMhS_3XH4c0Why0ae41OIJr8y58r744,9059
114
- execsql/utils/fileio.py,sha256=ONLoXkq5PV4dvNc16UMgi9-EY2Wy4mNUFxneSrX91N0,35231
115
- execsql/utils/gui.py,sha256=X5aw6LVoeaAdHaQkymm4ba176jga0cS2GrqxSFWTWTg,23853
116
- execsql/utils/mail.py,sha256=SXZac24p62qxDbIviO8VdDZTbKljIoJWgWZfxIGu5zI,6260
112
+ execsql/utils/datetime.py,sha256=rqtGrc0t37V00mvirJ8wJKHmDtDSYzTg_UgCyIBzv9E,5583
113
+ execsql/utils/errors.py,sha256=JqV5mDKJnsYF8Uam6iLE3HNqkL1cUiiP8ExHpBBFnC8,11630
114
+ execsql/utils/fileio.py,sha256=ADp8Iltf_zfv0PL0VRdO0BDIHkVpKVVh59_5zmkTfkw,47564
115
+ execsql/utils/gui.py,sha256=1iiupP9AsLdR6ST0gcLE143o6y6YGUFlNv_pdVPxfCE,23943
116
+ execsql/utils/mail.py,sha256=4RiKtXa_sqij_YGdYmjQ3PG0u3G9qjs-9caQwBErtBw,7278
117
117
  execsql/utils/numeric.py,sha256=_7bi5R6pHjMCkOPne_Sh5nUj-B8e9g6WFmjptFHaunA,1573
118
118
  execsql/utils/regex.py,sha256=B3mSBhRRx_DpUnX_t9IoYd05KvWAebiLMCZqQAmEwcw,3885
119
119
  execsql/utils/strings.py,sha256=UQNjpRCEFa1UO6feU-M-9e24wWAvizs_iu_4fFusLxo,8516
120
120
  execsql/utils/timer.py,sha256=eDYf5VzCNFk7oo90InJucUm3XcBdhYMogjZMqeg9xzc,1899
121
- execsql2-2.24.0.data/data/execsql2_extras/README.md,sha256=7SG9FbBpdqkgQTTt1aBTbCgymBZyV0rLrQMQrendzxs,5032
122
- execsql2-2.24.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
123
- execsql2-2.24.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=2e8KzzVWhho8KxYVHETSVmZdhW7wodioDsqBLSL6m4s,7487
124
- execsql2-2.24.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
125
- execsql2-2.24.0.data/data/execsql2_extras/md_compare.sql,sha256=qYYVAjSeHZzjszxV3Bv6bg8Ckbq2kMHl87_gh4sywMU,24140
126
- execsql2-2.24.0.data/data/execsql2_extras/md_glossary.sql,sha256=hkZ2Onn57LAKKsuXxzhR8tPtcWXkmWEQkwPE58-Tm2k,10796
127
- execsql2-2.24.0.data/data/execsql2_extras/md_upsert.sql,sha256=_CAK4BzEboRXTNy03SJR-oOjcEdSNMuRBPL6noWUptY,112560
128
- execsql2-2.24.0.data/data/execsql2_extras/pg_compare.sql,sha256=1zJd4hVUKHR0tncc2qTBC9B4qVV4Us2ITkJpsjN3tMw,24352
129
- execsql2-2.24.0.data/data/execsql2_extras/pg_glossary.sql,sha256=IKuwna-_8b20ljSkXZruuiQigrCpo7ueQdUqd1MXiuI,9908
130
- execsql2-2.24.0.data/data/execsql2_extras/pg_upsert.sql,sha256=HpPJtTHvpEjQy03j-3iPxDEOHMRkudOg7O4D4YR38UI,108315
131
- execsql2-2.24.0.data/data/execsql2_extras/script_template.sql,sha256=2J35ddZPguJ-vwTsz83wErv0jiWUyJcdW_JM0mNKDXA,11155
132
- execsql2-2.24.0.data/data/execsql2_extras/ss_compare.sql,sha256=j1qVNUPXQsEU7-DoVgDJCGcE0EuIl7whLBT3fgeiMAo,24833
133
- execsql2-2.24.0.data/data/execsql2_extras/ss_glossary.sql,sha256=2gLxv34xzKt0vy7hSzJH7a9JiMC3ETrv9MofxQwAibU,13065
134
- execsql2-2.24.0.data/data/execsql2_extras/ss_upsert.sql,sha256=G_8rQ0VzuKIZHWs24O_WrfzpC5S27R1JsL-bFBR3SUQ,117730
135
- execsql2-2.24.0.dist-info/METADATA,sha256=IR9FCVJ_TpwHfIa53JA3I3SkVKyjp-7Gj5aBQveBeiw,25173
136
- execsql2-2.24.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
137
- execsql2-2.24.0.dist-info/entry_points.txt,sha256=jOf53-4IVGjEZeNYUOF1GGaiPNfVZcNKxP3vDFKEyMA,58
138
- execsql2-2.24.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
139
- execsql2-2.24.0.dist-info/licenses/NOTICE,sha256=McYzgxYav3U1OaVsY4Su1sfBrfmplpRdA9b6-gCDQCg,342
140
- execsql2-2.24.0.dist-info/RECORD,,
121
+ execsql2-2.25.0.data/data/execsql2_extras/README.md,sha256=7SG9FbBpdqkgQTTt1aBTbCgymBZyV0rLrQMQrendzxs,5032
122
+ execsql2-2.25.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
123
+ execsql2-2.25.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=2e8KzzVWhho8KxYVHETSVmZdhW7wodioDsqBLSL6m4s,7487
124
+ execsql2-2.25.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
125
+ execsql2-2.25.0.data/data/execsql2_extras/md_compare.sql,sha256=qYYVAjSeHZzjszxV3Bv6bg8Ckbq2kMHl87_gh4sywMU,24140
126
+ execsql2-2.25.0.data/data/execsql2_extras/md_glossary.sql,sha256=hkZ2Onn57LAKKsuXxzhR8tPtcWXkmWEQkwPE58-Tm2k,10796
127
+ execsql2-2.25.0.data/data/execsql2_extras/md_upsert.sql,sha256=_CAK4BzEboRXTNy03SJR-oOjcEdSNMuRBPL6noWUptY,112560
128
+ execsql2-2.25.0.data/data/execsql2_extras/pg_compare.sql,sha256=1zJd4hVUKHR0tncc2qTBC9B4qVV4Us2ITkJpsjN3tMw,24352
129
+ execsql2-2.25.0.data/data/execsql2_extras/pg_glossary.sql,sha256=IKuwna-_8b20ljSkXZruuiQigrCpo7ueQdUqd1MXiuI,9908
130
+ execsql2-2.25.0.data/data/execsql2_extras/pg_upsert.sql,sha256=HpPJtTHvpEjQy03j-3iPxDEOHMRkudOg7O4D4YR38UI,108315
131
+ execsql2-2.25.0.data/data/execsql2_extras/script_template.sql,sha256=2J35ddZPguJ-vwTsz83wErv0jiWUyJcdW_JM0mNKDXA,11155
132
+ execsql2-2.25.0.data/data/execsql2_extras/ss_compare.sql,sha256=j1qVNUPXQsEU7-DoVgDJCGcE0EuIl7whLBT3fgeiMAo,24833
133
+ execsql2-2.25.0.data/data/execsql2_extras/ss_glossary.sql,sha256=2gLxv34xzKt0vy7hSzJH7a9JiMC3ETrv9MofxQwAibU,13065
134
+ execsql2-2.25.0.data/data/execsql2_extras/ss_upsert.sql,sha256=G_8rQ0VzuKIZHWs24O_WrfzpC5S27R1JsL-bFBR3SUQ,117730
135
+ execsql2-2.25.0.dist-info/METADATA,sha256=8-U51LILehuLSC5E0zYP_tYCuJEtff0DkTsMSQ4RvHg,25703
136
+ execsql2-2.25.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
137
+ execsql2-2.25.0.dist-info/entry_points.txt,sha256=jOf53-4IVGjEZeNYUOF1GGaiPNfVZcNKxP3vDFKEyMA,58
138
+ execsql2-2.25.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
139
+ execsql2-2.25.0.dist-info/licenses/NOTICE,sha256=McYzgxYav3U1OaVsY4Su1sfBrfmplpRdA9b6-gCDQCg,342
140
+ execsql2-2.25.0.dist-info/RECORD,,