execsql2 2.4.5__py3-none-any.whl → 2.5.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 (62) hide show
  1. execsql/cli/__init__.py +14 -0
  2. execsql/cli/dsn.py +2 -0
  3. execsql/cli/help.py +2 -0
  4. execsql/cli/run.py +4 -2
  5. execsql/constants.py +11 -0
  6. execsql/db/access.py +20 -0
  7. execsql/db/base.py +4 -0
  8. execsql/db/dsn.py +11 -8
  9. execsql/db/duckdb.py +12 -8
  10. execsql/db/firebird.py +17 -8
  11. execsql/db/mysql.py +13 -8
  12. execsql/db/oracle.py +22 -8
  13. execsql/db/postgres.py +21 -9
  14. execsql/db/sqlite.py +18 -8
  15. execsql/db/sqlserver.py +14 -8
  16. execsql/exporters/__init__.py +6 -1
  17. execsql/exporters/base.py +2 -0
  18. execsql/exporters/delimited.py +10 -0
  19. execsql/exporters/protocol.py +128 -0
  20. execsql/exporters/xls.py +8 -0
  21. execsql/format.py +3 -1
  22. execsql/gui/__init__.py +2 -0
  23. execsql/gui/base.py +2 -0
  24. execsql/gui/console.py +2 -0
  25. execsql/gui/desktop.py +1 -0
  26. execsql/gui/tui.py +2 -0
  27. execsql/importers/base.py +1 -0
  28. execsql/importers/csv.py +2 -0
  29. execsql/importers/feather.py +2 -0
  30. execsql/importers/ods.py +1 -0
  31. execsql/importers/xls.py +1 -0
  32. execsql/metacommands/__init__.py +206 -0
  33. execsql/metacommands/dispatch.py +2 -0
  34. execsql/metacommands/io.py +41 -0
  35. execsql/models.py +17 -0
  36. execsql/parser.py +41 -0
  37. execsql/script/control.py +2 -0
  38. execsql/script/engine.py +19 -0
  39. execsql/script/variables.py +9 -5
  40. execsql/state.py +52 -0
  41. execsql/types.py +46 -0
  42. {execsql2-2.4.5.dist-info → execsql2-2.5.0.dist-info}/METADATA +2 -2
  43. {execsql2-2.4.5.dist-info → execsql2-2.5.0.dist-info}/RECORD +62 -61
  44. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/README.md +0 -0
  45. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/config_settings.sqlite +0 -0
  46. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/example_config_prompt.sql +0 -0
  47. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/execsql.conf +0 -0
  48. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/make_config_db.sql +0 -0
  49. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/md_compare.sql +0 -0
  50. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/md_glossary.sql +0 -0
  51. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/md_upsert.sql +0 -0
  52. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/pg_compare.sql +0 -0
  53. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/pg_glossary.sql +0 -0
  54. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/pg_upsert.sql +0 -0
  55. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/script_template.sql +0 -0
  56. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/ss_compare.sql +0 -0
  57. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/ss_glossary.sql +0 -0
  58. {execsql2-2.4.5.data → execsql2-2.5.0.data}/data/execsql2_extras/ss_upsert.sql +0 -0
  59. {execsql2-2.4.5.dist-info → execsql2-2.5.0.dist-info}/WHEEL +0 -0
  60. {execsql2-2.4.5.dist-info → execsql2-2.5.0.dist-info}/entry_points.txt +0 -0
  61. {execsql2-2.4.5.dist-info → execsql2-2.5.0.dist-info}/licenses/LICENSE.txt +0 -0
  62. {execsql2-2.4.5.dist-info → execsql2-2.5.0.dist-info}/licenses/NOTICE +0 -0
execsql/state.py CHANGED
@@ -55,6 +55,58 @@ if TYPE_CHECKING:
55
55
  from execsql.utils.mail import MailSpec
56
56
  from execsql.utils.timer import Timer
57
57
 
58
+ __all__ = [
59
+ # Configuration / encoding
60
+ "conf",
61
+ "logfile_encoding",
62
+ # Runtime state
63
+ "last_command",
64
+ "upass",
65
+ "varlike",
66
+ "err_halt_writespec",
67
+ "err_halt_email",
68
+ "err_halt_exec",
69
+ "cancel_halt_writespec",
70
+ "cancel_halt_mailspec",
71
+ "cancel_halt_exec",
72
+ "commandliststack",
73
+ "savedscripts",
74
+ "loopcommandstack",
75
+ "compiling_loop",
76
+ "endloop_rx",
77
+ "loop_rx",
78
+ "loop_nest_level",
79
+ "cmds_run",
80
+ "defer_rx",
81
+ "stringtypes",
82
+ "exec_log",
83
+ "subvars",
84
+ "status",
85
+ # Lazy singletons
86
+ "if_stack",
87
+ "counters",
88
+ "timer",
89
+ "output",
90
+ "dbs",
91
+ "tempfiles",
92
+ "export_metadata",
93
+ "metacommandlist",
94
+ "conditionallist",
95
+ "filewriter",
96
+ "gui_console",
97
+ "gui_manager_queue",
98
+ "gui_manager_thread",
99
+ # Version
100
+ "primary_vno",
101
+ "secondary_vno",
102
+ "tertiary_vno",
103
+ # Functions
104
+ "xcmd_test",
105
+ "endloop",
106
+ "reset",
107
+ "initialize",
108
+ ]
109
+
58
110
  # ---------------------------------------------------------------------------
59
111
  # Configuration / encoding
60
112
  # ---------------------------------------------------------------------------
execsql/types.py CHANGED
@@ -70,6 +70,8 @@ __all__ = [
70
70
 
71
71
 
72
72
  class DataType:
73
+ """Abstract base class for all data-type matchers used during column inference."""
74
+
73
75
  data_type_name = None
74
76
  data_type = None
75
77
  lenspec = False # Is a length specification required for a (SQL) declaration of this data type?
@@ -83,9 +85,11 @@ class DataType:
83
85
  return f"DataType({self.data_type_name!r}, {self.data_type!r})"
84
86
 
85
87
  def is_null(self, data: object) -> bool:
88
+ """Return True if the data value is None."""
86
89
  return data is None
87
90
 
88
91
  def matches(self, data: object) -> bool:
92
+ """Return True if the non-null data value could be of this data type."""
89
93
  # Returns T/F indicating whether the given data value could be of this data type.
90
94
  # The data value should be non-null.
91
95
  if self.is_null(data):
@@ -93,6 +97,7 @@ class DataType:
93
97
  return self._is_match(data)
94
98
 
95
99
  def from_data(self, data: object) -> object:
100
+ """Coerce the data value to this type or raise DataTypeError."""
96
101
  # Returns the data value coerced to this type, or raises a DataTypeError exception.
97
102
  # The data value should be non-null.
98
103
  if self.is_null(data):
@@ -123,16 +128,22 @@ class DataType:
123
128
 
124
129
 
125
130
  class Tz(datetime.tzinfo):
131
+ """Fixed-offset timezone implementation for timestamp-with-timezone parsing."""
132
+
126
133
  def __init__(self, sign: int, hr: int, min: int) -> None:
134
+ """Store the UTC offset as sign, hours, and minutes."""
127
135
  self.sign = sign
128
136
  self.hr = hr
129
137
  self.min = min
130
138
 
131
139
  def utcoffset(self, dt: object) -> datetime.timedelta:
140
+ """Return the UTC offset as a timedelta."""
132
141
  return self.sign * datetime.timedelta(hours=self.hr, minutes=self.min)
133
142
 
134
143
 
135
144
  class DT_TimestampTZ(DataType):
145
+ """Timezone-aware timestamp data type."""
146
+
136
147
  data_type_name = "timestamptz"
137
148
  data_type = datetime.datetime
138
149
  # There is no distinct Python type corresponding to a timestamptz, so the data_type
@@ -166,6 +177,8 @@ class DT_TimestampTZ(DataType):
166
177
 
167
178
 
168
179
  class DT_Timestamp(DataType):
180
+ """Naive timestamp (datetime without timezone) data type."""
181
+
169
182
  data_type_name = "timestamp"
170
183
  data_type = datetime.datetime
171
184
 
@@ -207,10 +220,13 @@ date_fmts = collections.deque(
207
220
 
208
221
 
209
222
  class DT_Date(DataType):
223
+ """Calendar date data type with multiple format recognition."""
224
+
210
225
  data_type_name = "date"
211
226
  data_type = datetime.date
212
227
 
213
228
  def __init__(self) -> None:
229
+ """Initialise the date format deque for adaptive format matching."""
214
230
  self._date_fmts = collections.deque(date_fmts)
215
231
 
216
232
  def __repr__(self) -> str:
@@ -239,6 +255,8 @@ class DT_Date(DataType):
239
255
 
240
256
 
241
257
  class DT_Time(DataType):
258
+ """Time-of-day data type with multiple format recognition."""
259
+
242
260
  data_type_name = "time"
243
261
  data_type = datetime.time
244
262
  time_fmts = (
@@ -288,6 +306,8 @@ class DT_Time_Oracle(DT_Time):
288
306
 
289
307
 
290
308
  class DT_Boolean(DataType):
309
+ """Boolean data type recognising word and integer true/false forms."""
310
+
291
311
  data_type_name = "boolean"
292
312
  data_type = bool
293
313
 
@@ -295,6 +315,7 @@ class DT_Boolean(DataType):
295
315
  return "DT_Boolean()"
296
316
 
297
317
  def set_bool_matches(self) -> None:
318
+ """Populate the true/false match tuples from the current configuration."""
298
319
  import execsql.state as _state
299
320
 
300
321
  conf = _state.conf
@@ -342,6 +363,8 @@ class DT_Boolean(DataType):
342
363
 
343
364
 
344
365
  class DT_Integer(DataType):
366
+ """Small integer data type bounded by the configured max_int."""
367
+
345
368
  data_type_name = "integer"
346
369
  data_type = int
347
370
 
@@ -391,6 +414,8 @@ class DT_Integer(DataType):
391
414
 
392
415
 
393
416
  class DT_Long(DataType):
417
+ """Large integer (bigint) data type using Python int."""
418
+
394
419
  data_type_name = "long"
395
420
  data_type = int # In Python 3, long is just int
396
421
 
@@ -425,6 +450,8 @@ class DT_Long(DataType):
425
450
 
426
451
 
427
452
  class DT_Float(DataType):
453
+ """IEEE double-precision floating-point data type."""
454
+
428
455
  data_type_name = "float"
429
456
  data_type = float
430
457
 
@@ -463,6 +490,8 @@ class DT_Float(DataType):
463
490
 
464
491
 
465
492
  class DT_Decimal(DataType):
493
+ """Exact decimal data type tracking precision and scale."""
494
+
466
495
  data_type_name = "decimal"
467
496
  data_type = Decimal
468
497
  precspec = True
@@ -471,6 +500,7 @@ class DT_Decimal(DataType):
471
500
  return "DT_Decimal()"
472
501
 
473
502
  def set_scale_prec(self, dec: Decimal) -> None:
503
+ """Compute and store the precision and scale from a Decimal value."""
474
504
  # 'dec' should be Decimal.
475
505
  x = dec.as_tuple()
476
506
  digits = len(x.digits)
@@ -501,6 +531,8 @@ class DT_Decimal(DataType):
501
531
 
502
532
 
503
533
  class DT_Character(DataType):
534
+ """Fixed-length string data type (up to 255 characters)."""
535
+
504
536
  data_type_name = "character"
505
537
  lenspec = True
506
538
 
@@ -530,6 +562,8 @@ class DT_Character(DataType):
530
562
 
531
563
 
532
564
  class DT_Varchar(DataType):
565
+ """Variable-length string data type (up to 255 characters)."""
566
+
533
567
  data_type_name = "varchar"
534
568
  lenspec = True
535
569
  varlen = True
@@ -558,6 +592,8 @@ class DT_Varchar(DataType):
558
592
 
559
593
 
560
594
  class DT_Text(DataType):
595
+ """Unbounded text string data type."""
596
+
561
597
  data_type_name = "character"
562
598
 
563
599
  def __repr__(self) -> str:
@@ -581,6 +617,8 @@ class DT_Text(DataType):
581
617
 
582
618
 
583
619
  class DT_Binary(DataType):
620
+ """Binary byte-array data type."""
621
+
584
622
  data_type_name = "binary"
585
623
  data_type = bytearray
586
624
 
@@ -589,7 +627,10 @@ class DT_Binary(DataType):
589
627
 
590
628
 
591
629
  class DbType:
630
+ """Map Python DataType subclasses to DBMS-specific SQL type names."""
631
+
592
632
  def __init__(self, DBMS_id: str, db_obj_quotes: str = '""') -> None:
633
+ """Initialise a DBMS dialect with its identifier and quoting characters."""
593
634
  # The DBMS_id is the name by which this DBMS is identified.
594
635
  # db_obj_quotechars is a string of two characters that are the opening and closing quotes
595
636
  # for identifiers (schema, table, and column names) that need to be quoted.
@@ -621,6 +662,7 @@ class DbType:
621
662
  precision: object = None,
622
663
  scale: object = None,
623
664
  ) -> None:
665
+ """Register a DBMS-specific SQL type name for a DataType class."""
624
666
  # data_type is a DataType class object.
625
667
  # dbms_name is the DBMS-specific name for this data type.
626
668
  # length_required indicates whether length information is required.
@@ -631,6 +673,7 @@ class DbType:
631
673
  self.dialect[data_type] = (dbms_name, length_required, casting_name, conv_mod_fn, precision, scale)
632
674
 
633
675
  def datatype_name(self, data_type: object) -> str:
676
+ """Return the DBMS-specific SQL type name for the given DataType class."""
634
677
  # A convenience function to simplify access to data type names.
635
678
  try:
636
679
  return self.dialect[data_type][0]
@@ -642,6 +685,7 @@ class DbType:
642
685
  ) from e
643
686
 
644
687
  def quoted(self, dbms_object: str) -> str:
688
+ """Quote a database identifier if it contains non-word characters."""
645
689
  if re.search(r"\W", dbms_object):
646
690
  if self.quotechars[0] == self.quotechars[1] and self.quotechars[0] in dbms_object:
647
691
  dbms_object = dbms_object.replace(self.quotechars[0], self.quotechars[0] + self.quotechars[0])
@@ -649,6 +693,7 @@ class DbType:
649
693
  return dbms_object
650
694
 
651
695
  def spec_type(self, data_type: object) -> object:
696
+ """Return the translated data type, or the original if no translation exists."""
652
697
  # Returns a translated data type or the original if there is no translation.
653
698
  if data_type in self.dt_xlate:
654
699
  return self.dt_xlate[data_type]
@@ -663,6 +708,7 @@ class DbType:
663
708
  precision: object = None,
664
709
  scale: object = None,
665
710
  ) -> str:
711
+ """Return a column specification string suitable for a CREATE TABLE statement."""
666
712
  # Returns a column specification as it would be used in a CREATE TABLE statement.
667
713
  data_type = self.spec_type(data_type)
668
714
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: execsql2
3
- Version: 2.4.5
3
+ Version: 2.5.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: Repository, https://github.com/geocoug/execsql
6
6
  Project-URL: Issues, https://github.com/geocoug/execsql/issues
@@ -298,7 +298,7 @@ repos:
298
298
  args: [--in-place]
299
299
  ```
300
300
 
301
- See the [formatter documentation](https://execsql2.readthedocs.io/en/latest/formatter/) for all options.
301
+ See the [formatter documentation](https://execsql2.readthedocs.io/en/latest/guides/formatter/) for all options.
302
302
 
303
303
  # VS Code Syntax Highlighting
304
304
 
@@ -1,33 +1,33 @@
1
1
  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
- execsql/constants.py,sha256=up8I1sfFg1KaQ-ZgwufDOYbupMgTkPVpHzAdWpi5-BQ,12628
4
+ execsql/constants.py,sha256=bns8_sN36Pe4R4vTQZb3dRXDHZhe4N34wZZboe1jBdM,12792
5
5
  execsql/exceptions.py,sha256=UE38-7HhQiwXzwKz9DgE4coTD2j6Jlam3jEB6-U-hNg,8383
6
- execsql/format.py,sha256=4uNF2MSDBYwZuK9k4wywcUZFU4D_9bMokseOyaCjmGU,11911
7
- execsql/models.py,sha256=kMqw5GSfb4posItCZtEX9FQRBx-BxQnUdD4_FP8rLo0,12513
8
- execsql/parser.py,sha256=PnuGdux9iLaMwYkVy3CWFzZqBYaK7JNBEdBBoD5KvVI,12839
6
+ execsql/format.py,sha256=-6iknDddqbkapMo4NKmT5LAynDLqMW5kHgDWRg0KSws,11990
7
+ execsql/models.py,sha256=DxkGp9iWbuZDWPGmnxZp9mvEeyOwxEJNx94fxQQiLfQ,13538
8
+ execsql/parser.py,sha256=mbNSMiAMR1NvNvFtQAZq6nxBOupMGJZXSimLWLtZeNs,15537
9
9
  execsql/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- execsql/state.py,sha256=INT7eXwO8_drZrngHqq2A4hN8Hrh-JFXELUVuqX4wgY,12385
11
- execsql/types.py,sha256=8lCYX4ihkSzQJKqCYFTOVv0GDfvNrY7dcb8pAnTSR4E,29776
12
- execsql/cli/__init__.py,sha256=rxQy5MktCksykRm9u7kqxqbTo-Rx0MCIHd3wqWufszY,14667
13
- execsql/cli/dsn.py,sha256=_mDilt_dhjt1uwN1AC6Mbl9zmKl7pdaZA7eMgR7ZpeE,2759
14
- execsql/cli/help.py,sha256=zSEn66LDnNEnkqgA6CEQWraIzgiwGBJSiaflRuCySXQ,5331
15
- execsql/cli/run.py,sha256=MjsQjSFyQRSIqA_T82n9ZbiKaVnFVzpRIcuv0IHqJT8,22748
10
+ execsql/state.py,sha256=aZP2xH1D9IcVl6c3gmxAIJwZuTcgz1dpIxygfxb8kPA,13346
11
+ execsql/types.py,sha256=HVWb4umIB9lpxCGgqk3xy1hoGYPfN39xci5mHF0Izq4,31882
12
+ execsql/cli/__init__.py,sha256=s4283f04Z-SS5CdwsJj6t_oHuyL5sQELsUGTh6x45NU,14908
13
+ execsql/cli/dsn.py,sha256=svaZtrUXFRL2W5G6FRRiKtR6kehOp7urrVhIx_642Z8,2820
14
+ execsql/cli/help.py,sha256=Sn_TgSJiQeBx-xZH0fuP5OvR_wasSTumjWF9UHfIX5k,5414
15
+ execsql/cli/run.py,sha256=seThMuXV0BmpG94lzOteoxlSjez-p-Ht4__5jjsJZAI,22829
16
16
  execsql/db/__init__.py,sha256=jTbuafuKOqYtXFR1wvCOoKK5Lr3l1uErfaIbIr6UywI,1063
17
- execsql/db/access.py,sha256=bx5qr_K51LNHVTibPqmjv7U1O2bW6DRQr8HzlzHrYIY,16520
18
- execsql/db/base.py,sha256=jcamHa5pHsOKpoNf3E166j_eKsMxu-8QMkHkMePLwd0,30110
19
- execsql/db/dsn.py,sha256=4YZr4yzXeaMrE-b72c8mJvi4gnllpI9v8iRrlzXKjb4,5142
20
- execsql/db/duckdb.py,sha256=KQQzO89ajJjXqEchysn9_kKdXdWxRPi4mKp8ra6A8v4,2836
17
+ execsql/db/access.py,sha256=L79gUnAnnM9EJ_f4k42jr7DI0qGcKtLOnJTlBC7uPm0,17879
18
+ execsql/db/base.py,sha256=hfMFj8fXY0T1aXLvWJHqb0aU4EQUDFOc-YrS29HH8U4,30405
19
+ execsql/db/dsn.py,sha256=TgQUedVCxnEYA3vae7JETyhb8kK23qkNbPxsMQrNUN8,5368
20
+ execsql/db/duckdb.py,sha256=cKeMwiSlYPyPDn1VLaJgbUD6_IEEaNqtUToLcmq7QaE,3189
21
21
  execsql/db/factory.py,sha256=YR1m_c2Hhj_GXVGGkWoSEPZBpgNu_c4FxRnbp-xV3rs,5230
22
- execsql/db/firebird.py,sha256=Kgjlij7HeKXr7fymFDl05Ljzvs25uoQcI6Do3A2mSNQ,7871
23
- execsql/db/mysql.py,sha256=KzDT5xgMG9Eh0L2fjKswdbRqEfVTq9pPSyBeWEAJVk4,13334
24
- execsql/db/oracle.py,sha256=Psl9JZ0XWwHshr2xyy1vIbLf2KJ2TGRj_kTcc0YXLh4,9464
25
- execsql/db/postgres.py,sha256=gYG1Jw8tbq06TROokoSlEfg6ZtSOXhWDYAeyS_K2Yaw,19443
26
- execsql/db/sqlite.py,sha256=oT8MlhsaD7lmJx9ZK32wR6H9Pccr5wxs3Bk9Q3iypRI,9429
27
- execsql/db/sqlserver.py,sha256=hSCu68Z21s2OSLow38qXwLQGxvM7IF6xjehGwgPXl9k,7092
28
- execsql/exporters/__init__.py,sha256=a679NAJp92e3565fhfqbBIbIT_RdyWQWCJ3-wqJJyYE,525
29
- execsql/exporters/base.py,sha256=a4jphxKnlEjXAemeNSHGelk7KvHJTghKhone75FyXAE,6242
30
- execsql/exporters/delimited.py,sha256=UCe5oUNhymkXD-4xek2Pk1K_9Sv9ziP7o0__LMl8ZuM,29512
22
+ execsql/db/firebird.py,sha256=P_5H_aWTh8fzJoH3vWwwUpAd0hehoXvwDcjggoZqhWE,8537
23
+ execsql/db/mysql.py,sha256=BR68IeVCh3HlUuePOTtcih1m5-kEIWI_6xUiYBJnHeA,13703
24
+ execsql/db/oracle.py,sha256=AFVHhGlCzBuU7JgrAqeUG6e8TUUkk1Y80XVJQnGOqLM,10547
25
+ execsql/db/postgres.py,sha256=oXR7ODzQhR3yO6q-aNa9_il_rO3SpOX9yYGsfIqHwLI,20139
26
+ execsql/db/sqlite.py,sha256=2fD3AfckIGWN1oHcOaqQlQnbig26top1IlW-ejPHttI,10204
27
+ execsql/db/sqlserver.py,sha256=mNwmIIxTzqXU-cOjpNpeFi568HjQHsAk8Xnn-tR6F_E,7563
28
+ execsql/exporters/__init__.py,sha256=IB3GdPKdRdyp9UPWTMqqJty769-LXKgBcLbEf3Q4LuM,656
29
+ execsql/exporters/base.py,sha256=W9USFyk_2eztjJ51X6CJh7-chE1i3cSx-STOtbHXCNI,6373
30
+ execsql/exporters/delimited.py,sha256=VnqDRuybQ7D9fBWf8UtqYYKTiQ-qwMJZFg_SaxNUV-k,30298
31
31
  execsql/exporters/duckdb.py,sha256=Wc9I5uiV4MzmVQzCX-vgVHQUL7U3ZWdOkFVFWBv5SXM,2911
32
32
  execsql/exporters/feather.py,sha256=w2qZAnewzeiRMnmPXECvkgD-6KtyxaiQwjokRT7Awrc,4167
33
33
  execsql/exporters/html.py,sha256=ISQBOr7AJ5koKlebXSvWqzEvl1nXriCRGeKmk-bzkrc,9335
@@ -36,32 +36,33 @@ execsql/exporters/latex.py,sha256=w_B83_5vKPe8uYxCWGdqvxwJeq0mw5zzKYDiAb7dbN0,45
36
36
  execsql/exporters/ods.py,sha256=jl2qVHUeCLLv8xrkZfG3jgXbaglQ3rggCHziv7tNQOI,18876
37
37
  execsql/exporters/parquet.py,sha256=186vUTH1oVAQ0s_qayLzEQVsKKu3ijAkhYEI6tysXkg,1095
38
38
  execsql/exporters/pretty.py,sha256=9isA8f6xUz-3-JhMJimibnvtybVrT1cnoAjGnzsPEGI,3423
39
+ execsql/exporters/protocol.py,sha256=BxATgz0xKHbB2FpZBeNg7wZfIiCohhD1awlr3JCec0c,4372
39
40
  execsql/exporters/raw.py,sha256=jNzfVqUgpKSIO7BsOVwBi4CcfCV5ooZLLq_kEXa4W_I,1918
40
41
  execsql/exporters/sqlite.py,sha256=XA0ALLvy-r6Pz1lpOFkWWbvpSP9Hm1tHHiuo_BvPVDk,2686
41
42
  execsql/exporters/templates.py,sha256=T9nk7vJrlxiPGfOWGc79xqqDxK3TCYu0wXq48U02npw,5564
42
43
  execsql/exporters/values.py,sha256=HIyud31aux_dbCphfKHEGeZB9fkIPE5PoGXQz817XIE,2520
43
- execsql/exporters/xls.py,sha256=QiMtWr-S8mB22ubK7F40x4r9ZyliDENOehiiVydwZpA,10259
44
+ execsql/exporters/xls.py,sha256=nPROgxL8XK2oiBVoqN2L-o0j_jynRIMokwB8NpvOBt0,10623
44
45
  execsql/exporters/xml.py,sha256=lqcOM8uKDoCayU42BPSLNH1_2DIHU5D3LtQItREU90c,2564
45
46
  execsql/exporters/zip.py,sha256=9-hExltQorONNThiMfxPDYHqHsbTeq9zM9zmtG4oFb8,4410
46
- execsql/gui/__init__.py,sha256=KnLB-8GuRPBZij4W-sihcA9ORRuLDYoa0p2dCeIzYRg,2001
47
- execsql/gui/base.py,sha256=gbfCqj3nOMkAcn-GNIIAy7RdPFJ0UMbzOxpDpfoEVxk,6042
48
- execsql/gui/console.py,sha256=Ln9ixVMLlEK5foHi0t2EywrvTiBqWoPEpp8cnof3eIw,14241
49
- execsql/gui/desktop.py,sha256=zooMA28FWHndy9Aw242wRzchs1QxYwlGGMsWvn4-EKo,42123
50
- execsql/gui/tui.py,sha256=n5xzwe1jAsU54jj0PpcBmVfnvfycPVOeiLx07-IfVVk,45948
47
+ execsql/gui/__init__.py,sha256=oCb-cyhLZzVpWJ4WU5HbqEDBrV-lm0ytEwxemrOZyqs,2048
48
+ execsql/gui/base.py,sha256=sfNRkDrf7FhIgMRUOdyZpRLS1Xk9RqNhrV0A1RP6PXU,6068
49
+ execsql/gui/console.py,sha256=TuGzm7XFxa8iWrofGLwx5DuVIlr3wqqyP_pSnAJ1S3s,14271
50
+ execsql/gui/desktop.py,sha256=LxRzX0R5iOfXO-OFGm2nzgUZqzGtMJYm0VgY3TV5feA,42152
51
+ execsql/gui/tui.py,sha256=8ulz-ZucVgoqmYfhglPeWsSb3ez3OV5Ks6BVjp1mEEg,45978
51
52
  execsql/importers/__init__.py,sha256=dDsxSVeQYXBvm9yGqN3QswyGbLWTwt08pvUuRJgZhl4,289
52
- execsql/importers/base.py,sha256=ODRrJ4mVRFyQ3iF7qYdTzrXZutxgFCHYnixvfPjt03k,4040
53
- execsql/importers/csv.py,sha256=x_9MrKj6K2ByrZNuO2mCnQNhQiN4WXclF4IfhwvRFPA,4696
54
- execsql/importers/feather.py,sha256=y_4i8A4v_kI2dOW7LPo2ndoQqUP5CmdDWqXtHsqpJ60,1770
55
- execsql/importers/ods.py,sha256=O-bXyy_vlG4xl_KEQstYOaSAlzkGdF6TRnoHCTGpgTo,2770
56
- execsql/importers/xls.py,sha256=wWIS8T-zxHEhK_YFl9tovCE_ByTVtUlbmVLhrrdFRb8,3602
57
- execsql/metacommands/__init__.py,sha256=z5KtcR7qCoV0P9qyoAB1i2naXMKLqKjCa7wBNjKMrHU,8720
53
+ execsql/importers/base.py,sha256=FGVz3ntN6xHL99rQixlQj3tAf570K_oU83UtbYE1lJg,4124
54
+ execsql/importers/csv.py,sha256=Mu848WNzuhVO1ade-WurPyxqGOuVNRO8UwRF3-bav_I,4845
55
+ execsql/importers/feather.py,sha256=g2B69d2uv9vmnXcmjFyTVsMP40LYEzFYkhk3gD26mGw,1900
56
+ execsql/importers/ods.py,sha256=MJsdsjropzCvxAA3DDZfAL_AnmZ4yij7DnrjGyDJqHQ,2843
57
+ execsql/importers/xls.py,sha256=e0Zfe47ZiCpA1Ae3XDJ1ko3sCiH3-8U6XLKi6NvD0jQ,3683
58
+ execsql/metacommands/__init__.py,sha256=X0esqay79dBn3DOOt7S1hz8k1DghZ6c2dDc4JlXcM2M,13333
58
59
  execsql/metacommands/conditions.py,sha256=u-XdeIWj9QMht9hRGhvH0XlB9V09AliAPKDBHRXc02s,24540
59
60
  execsql/metacommands/connect.py,sha256=Nsm0D91i3RX-R2rzQQ-Br-gULaI6Uvdn9fqb7DOAVfE,14804
60
61
  execsql/metacommands/control.py,sha256=FCIWD-ZivHRZDqMS-2k37iR05HKHsv_7UPh5zJAg4I4,7693
61
62
  execsql/metacommands/data.py,sha256=tRQBGTAuW-eJ2tBNWaoZI9OjTyNNyHJISo7gOdL-sm8,11370
62
63
  execsql/metacommands/debug.py,sha256=nmfQ2ijUbTQO3drnyV9EzFueGSTfMl-CddP_NlQyI14,8178
63
- execsql/metacommands/dispatch.py,sha256=9JrQfaa5d1UzkHg7-gpcOjOM9VdeBlrOeSznzOuHSe8,82029
64
- execsql/metacommands/io.py,sha256=ON6j_I6tmxXCvHRh0vaXWgFONLHsvt896IrgTWEwmrA,2020
64
+ execsql/metacommands/dispatch.py,sha256=th4vA2Vg4vY_fPcePRJUZ67CwUX-_j7tSckCucB3MQA,82065
65
+ execsql/metacommands/io.py,sha256=Vv0NnUHiNKVnHbWJ0nsEdtN5SW042OtPCu7hrV57XyY,2913
65
66
  execsql/metacommands/io_export.py,sha256=kxfGnoBDdPFfncxgz6dazMIoGZEHPOO-Mg02kbpdd20,15965
66
67
  execsql/metacommands/io_fileops.py,sha256=RKqbWPTYiwiqCZYG-lpih0w1JVOY4RBFdWr3BJb_pnY,9669
67
68
  execsql/metacommands/io_import.py,sha256=wyxJJdlW07P5ZIhweejhXyyGANAvEhY5uMjKZ200Jyc,12983
@@ -70,9 +71,9 @@ execsql/metacommands/prompt.py,sha256=xd3mAkdbn4AE4hUPuSfN5DgZGUZmk-Db23iL-JJPwX
70
71
  execsql/metacommands/script_ext.py,sha256=TUgAldB2LSJAwZrCvDDi804hQ1d9BDQD2GDqHNPVOcM,2280
71
72
  execsql/metacommands/system.py,sha256=sUR5kLL7idTVg8WXIMdd-Kv7nkERIiaeL0beWsz8NyY,7293
72
73
  execsql/script/__init__.py,sha256=pIo0EJ7-vg67rSMbOvbri_BOUgLoGoSEUfJgxUN7ZS0,3380
73
- execsql/script/control.py,sha256=oNfHGYui1wulZQji5_pr1qBqGfpcgxm_ESZQT00dn9Y,6095
74
- execsql/script/engine.py,sha256=zMwMmlBBXcBLdJcORIe9NBlyepqELLwDU80j3vM7Ydg,39278
75
- execsql/script/variables.py,sha256=zv8FkvtuINAwimJButNs7xaLT6KDukWu_LBfT9p7w4Q,11464
74
+ execsql/script/control.py,sha256=s-1eZdGARM6H1FwZ6VDdO_f50j7bvvRtTHesfUm9tbc,6144
75
+ execsql/script/engine.py,sha256=5WOuSbQR1vrp_SawylshzLmdHco2oEjqZBSoxRg0Ggo,39638
76
+ execsql/script/variables.py,sha256=MOT9XEHucpuuuHQZM5bklxGMBQcwHzwTBxd0q3aO0XY,11641
76
77
  execsql/utils/__init__.py,sha256=0uR6JwVJQRX3vceByNBduCAf5dd5assKjeqJUWvpZoA,278
77
78
  execsql/utils/auth.py,sha256=onXzNkNZQZxGC5w7eey06sjvAIAX_Lf9g7nUJtcsel0,7009
78
79
  execsql/utils/crypto.py,sha256=2OnBWwn9bCBGc1ZkyRv16TvhottoCNYtXqgbE3mG3Sg,2960
@@ -85,24 +86,24 @@ execsql/utils/numeric.py,sha256=xh02ANSRk3nUpQ-rtm66ILoMqoi7HtzCoRMIOT9U8QI,1570
85
86
  execsql/utils/regex.py,sha256=diEzTZqU_HHwVMadPAvN1Vgzhl7I03eVaEFGCXyGGL8,3770
86
87
  execsql/utils/strings.py,sha256=5Dvzrk-9SIw2lpxXZQkiJbNyo1sy7iXXAtSULlZ0KG8,8488
87
88
  execsql/utils/timer.py,sha256=eDYf5VzCNFk7oo90InJucUm3XcBdhYMogjZMqeg9xzc,1899
88
- execsql2-2.4.5.data/data/execsql2_extras/README.md,sha256=sxwVyU0ZahCfANv56LahkyuM505kFjrMhe-1SvWE69E,4845
89
- execsql2-2.4.5.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
90
- execsql2-2.4.5.data/data/execsql2_extras/example_config_prompt.sql,sha256=SY3Jxn1qcVm4kPW9xmmTfknHfvURXmeEYTbRjYrjGSw,7487
91
- execsql2-2.4.5.data/data/execsql2_extras/execsql.conf,sha256=_45iJ-KWZnB8uMW_gEg067MM5pmGJ-dVl7VbAZMunAE,9530
92
- execsql2-2.4.5.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
93
- execsql2-2.4.5.data/data/execsql2_extras/md_compare.sql,sha256=B8Wd7LZ0vnMY2qvA139JIEBkPObgRH2i5xj6PejTQt8,24092
94
- execsql2-2.4.5.data/data/execsql2_extras/md_glossary.sql,sha256=DJRHcU5NbFpxTTX-IwH3yRlsboj1q6BBGrUAHKn4Cuo,10796
95
- execsql2-2.4.5.data/data/execsql2_extras/md_upsert.sql,sha256=v_7GbWh_N1mBTmw3gvTrkagOVp2q0KmXvM8hE-DlFxY,112524
96
- execsql2-2.4.5.data/data/execsql2_extras/pg_compare.sql,sha256=9dWa8hnfy5dVJI-z2iGpd9JzQmI4j2ziMlEdpnr66ro,24352
97
- execsql2-2.4.5.data/data/execsql2_extras/pg_glossary.sql,sha256=pKjIIDsROAgJq2H-1qNEcRMAWManivcZ_AEVHzUUlic,9908
98
- execsql2-2.4.5.data/data/execsql2_extras/pg_upsert.sql,sha256=k7AFiGTLBy3nf-qO5QIaZrEYTAKvdxxU3JDLx9jqkzs,108315
99
- execsql2-2.4.5.data/data/execsql2_extras/script_template.sql,sha256=1Estacb_vm1FgK41k_G9nuduP1yiA-fQ1Kn4Z4mv5Ao,11153
100
- execsql2-2.4.5.data/data/execsql2_extras/ss_compare.sql,sha256=TsVxWm3cEpR5-EiMYXNhtaY0arSNeKZhsJdHdLA7xeI,24833
101
- execsql2-2.4.5.data/data/execsql2_extras/ss_glossary.sql,sha256=cLM7nN8JOIu9ZVP9oY9qdSK3hrnWJiDcX6nZmQQbQWI,13065
102
- execsql2-2.4.5.data/data/execsql2_extras/ss_upsert.sql,sha256=BCqmBykXBF-BpCgOFeG1qhf2XfScKsxPD17wd1hYfHw,120647
103
- execsql2-2.4.5.dist-info/METADATA,sha256=CdukkGR7HE8g4_vh1SdY0a1DZlqQtnQwj3ZLnv6seEE,16566
104
- execsql2-2.4.5.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
105
- execsql2-2.4.5.dist-info/entry_points.txt,sha256=sUOxkM-dN1eBGGpSpDLsAaE0yNXYQKWZAfxPOlMkQyk,90
106
- execsql2-2.4.5.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
107
- execsql2-2.4.5.dist-info/licenses/NOTICE,sha256=sqVrM73Ys9zfvWC_P797lHfTnoPW_ETeBSrUTFaob0A,339
108
- execsql2-2.4.5.dist-info/RECORD,,
89
+ execsql2-2.5.0.data/data/execsql2_extras/README.md,sha256=sxwVyU0ZahCfANv56LahkyuM505kFjrMhe-1SvWE69E,4845
90
+ execsql2-2.5.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
91
+ execsql2-2.5.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=SY3Jxn1qcVm4kPW9xmmTfknHfvURXmeEYTbRjYrjGSw,7487
92
+ execsql2-2.5.0.data/data/execsql2_extras/execsql.conf,sha256=_45iJ-KWZnB8uMW_gEg067MM5pmGJ-dVl7VbAZMunAE,9530
93
+ execsql2-2.5.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
94
+ execsql2-2.5.0.data/data/execsql2_extras/md_compare.sql,sha256=B8Wd7LZ0vnMY2qvA139JIEBkPObgRH2i5xj6PejTQt8,24092
95
+ execsql2-2.5.0.data/data/execsql2_extras/md_glossary.sql,sha256=DJRHcU5NbFpxTTX-IwH3yRlsboj1q6BBGrUAHKn4Cuo,10796
96
+ execsql2-2.5.0.data/data/execsql2_extras/md_upsert.sql,sha256=v_7GbWh_N1mBTmw3gvTrkagOVp2q0KmXvM8hE-DlFxY,112524
97
+ execsql2-2.5.0.data/data/execsql2_extras/pg_compare.sql,sha256=9dWa8hnfy5dVJI-z2iGpd9JzQmI4j2ziMlEdpnr66ro,24352
98
+ execsql2-2.5.0.data/data/execsql2_extras/pg_glossary.sql,sha256=pKjIIDsROAgJq2H-1qNEcRMAWManivcZ_AEVHzUUlic,9908
99
+ execsql2-2.5.0.data/data/execsql2_extras/pg_upsert.sql,sha256=k7AFiGTLBy3nf-qO5QIaZrEYTAKvdxxU3JDLx9jqkzs,108315
100
+ execsql2-2.5.0.data/data/execsql2_extras/script_template.sql,sha256=1Estacb_vm1FgK41k_G9nuduP1yiA-fQ1Kn4Z4mv5Ao,11153
101
+ execsql2-2.5.0.data/data/execsql2_extras/ss_compare.sql,sha256=TsVxWm3cEpR5-EiMYXNhtaY0arSNeKZhsJdHdLA7xeI,24833
102
+ execsql2-2.5.0.data/data/execsql2_extras/ss_glossary.sql,sha256=cLM7nN8JOIu9ZVP9oY9qdSK3hrnWJiDcX6nZmQQbQWI,13065
103
+ execsql2-2.5.0.data/data/execsql2_extras/ss_upsert.sql,sha256=BCqmBykXBF-BpCgOFeG1qhf2XfScKsxPD17wd1hYfHw,120647
104
+ execsql2-2.5.0.dist-info/METADATA,sha256=1GftiLPx-XfwxK2axlqnf1066YyOB-js3bk7ocHRlCQ,16573
105
+ execsql2-2.5.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
106
+ execsql2-2.5.0.dist-info/entry_points.txt,sha256=sUOxkM-dN1eBGGpSpDLsAaE0yNXYQKWZAfxPOlMkQyk,90
107
+ execsql2-2.5.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
108
+ execsql2-2.5.0.dist-info/licenses/NOTICE,sha256=sqVrM73Ys9zfvWC_P797lHfTnoPW_ETeBSrUTFaob0A,339
109
+ execsql2-2.5.0.dist-info/RECORD,,