jaaql-middleware-python 4.24.5__tar.gz → 4.24.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. {jaaql-middleware-python-4.24.5/jaaql_middleware_python.egg-info → jaaql-middleware-python-4.24.6}/PKG-INFO +1 -1
  2. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/constants.py +1 -1
  3. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/documentation/documentation_internal.py +16 -0
  4. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/interpreter/interpret_jaaql.py +35 -2
  5. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/controller.py +4 -0
  6. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/model.py +39 -4
  7. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6/jaaql_middleware_python.egg-info}/PKG-INFO +1 -1
  8. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/LICENSE.txt +0 -0
  9. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/README.md +0 -0
  10. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/__init__.py +0 -0
  11. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/config/__init__.py +0 -0
  12. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/config/config-docker.ini +0 -0
  13. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/config/config-test.ini +0 -0
  14. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/config/config.ini +0 -0
  15. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/config_constants.py +0 -0
  16. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/db/__init__.py +0 -0
  17. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/db/db_interface.py +0 -0
  18. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/db/db_pg_interface.py +0 -0
  19. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/db/db_utils.py +0 -0
  20. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/db/db_utils_no_circ.py +0 -0
  21. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/documentation/__init__.py +0 -0
  22. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/documentation/documentation_public.py +0 -0
  23. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/documentation/documentation_shared.py +0 -0
  24. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/email/__init__.py +0 -0
  25. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/email/email_manager.py +0 -0
  26. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/email/email_manager_service.py +0 -0
  27. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/email/patch_ems.py +0 -0
  28. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/exceptions/__init__.py +0 -0
  29. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/exceptions/custom_http_status.py +0 -0
  30. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/exceptions/http_status_exception.py +0 -0
  31. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/exceptions/jaaql_interpretable_handled_errors.py +0 -0
  32. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/exceptions/not_yet_implement_exception.py +0 -0
  33. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/generated_constants.py +0 -0
  34. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/interpreter/__init__.py +0 -0
  35. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/jaaql.py +0 -0
  36. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/migrations/__init__.py +0 -0
  37. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/migrations/migrations.py +0 -0
  38. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/__init__.py +0 -0
  39. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/base_controller.py +0 -0
  40. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/base_model.py +0 -0
  41. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/controller_interface.py +0 -0
  42. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/exception_queries.py +0 -0
  43. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/generated_queries.py +0 -0
  44. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/handmade_queries.py +0 -0
  45. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/model_interface.py +0 -0
  46. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/mvc/response.py +0 -0
  47. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/openapi/__init__.py +0 -0
  48. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/openapi/swagger_documentation.py +0 -0
  49. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/patch.py +0 -0
  50. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/01.install_domains.generated.sql +0 -0
  51. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/02.install_super_user.exceptions.sql +0 -0
  52. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/03.install_super_user.handwritten.sql +0 -0
  53. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/04.install_jaaql_data_structures.generated.sql +0 -0
  54. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/05.install_jaaql.exceptions.sql +0 -0
  55. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/06.install_jaaql.handwritten.sql +0 -0
  56. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/ZZZZ.generated_functions_views_and_permissions.sql +0 -0
  57. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/ZZZZ.reset_references.sql +0 -0
  58. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/scripts/swagger_template.html +0 -0
  59. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/services/__init__.py +0 -0
  60. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/services/cached_canned_query_service.py +0 -0
  61. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/services/migrations_manager_service.py +0 -0
  62. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/services/patch_mms.py +0 -0
  63. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/services/patch_shared_var_service.py +0 -0
  64. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/services/shared_var_service.py +0 -0
  65. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/utilities/__init__.py +0 -0
  66. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/utilities/crypt_utils.py +0 -0
  67. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/utilities/options.py +0 -0
  68. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/utilities/utils.py +0 -0
  69. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/utilities/utils_no_project_imports.py +0 -0
  70. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql/utilities/vault.py +0 -0
  71. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql_middleware_python.egg-info/SOURCES.txt +0 -0
  72. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql_middleware_python.egg-info/dependency_links.txt +0 -0
  73. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql_middleware_python.egg-info/requires.txt +0 -0
  74. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/jaaql_middleware_python.egg-info/top_level.txt +0 -0
  75. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/setup.cfg +0 -0
  76. {jaaql-middleware-python-4.24.5 → jaaql-middleware-python-4.24.6}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaaql-middleware-python
3
- Version: 4.24.5
3
+ Version: 4.24.6
4
4
  Summary: The jaaql package, allowing for rapid development and deployment of RESTful HTTP applications
5
5
  Home-page: https://github.com/JAAQL/JAAQL-middleware-python
6
6
  Author: Software Quality Measurement and Improvement bv
@@ -180,5 +180,5 @@ ROLE__postgres = "postgres"
180
180
 
181
181
  PROTOCOL__postgres = "postgresql://"
182
182
 
183
- VERSION = "4.24.5"
183
+ VERSION = "4.24.6"
184
184
 
@@ -207,6 +207,22 @@ DOCUMENTATION__prepare = SwaggerDocumentation(
207
207
  )
208
208
  )
209
209
 
210
+ DOCUMENTATION__domains = SwaggerDocumentation(
211
+ tags="Prepare",
212
+ methods=SwaggerMethod(
213
+ name="Fetches domains",
214
+ description="Fetches database level domains",
215
+ method=REST__POST,
216
+ body=SwaggerArgumentResponse(
217
+ name=KEY__database,
218
+ description="The database against which to fetch the domains",
219
+ arg_type=str,
220
+ example=["database"]
221
+ ),
222
+ response=RES__allow_all
223
+ )
224
+ )
225
+
210
226
  DOCUMENTATION__set_web_config = SwaggerDocumentation(
211
227
  tags="Web Config",
212
228
  methods=SwaggerMethod(
@@ -1,4 +1,6 @@
1
+ import string
1
2
  import traceback
3
+ import random
2
4
 
3
5
  from jaaql.exceptions.http_status_exception import *
4
6
  from datetime import datetime
@@ -327,10 +329,41 @@ class InterpretJAAQL:
327
329
  found_params = {**found_parameter_dictionary, **enc_parameter_dictionary}
328
330
 
329
331
  if attempt_fetch_domain_types:
330
- last_query = "CREATE TEMP VIEW temp_view AS (" + last_query + ")"
332
+ temp_view_name = ''.join(random.choices(string.ascii_letters + string.digits, k=10))
333
+ last_query = "CREATE TEMP VIEW \"temp_view__" + temp_view_name + "\" AS (" + last_query + ")"
331
334
  self.db_interface.execute_query_fetching_results(conn, last_query, found_params, wait_hook=wait_hook,
332
335
  requires_dba_check=check_required and canned_query_service is not None)
333
- last_query = "SELECT column_name, data_type, udt_name, domain_name FROM information_schema.columns WHERE table_name = 'temp_view' ORDER BY ordinal_position;"
336
+ last_query = """
337
+ WITH RECURSIVE column_hierarchy AS (
338
+ -- Base case: Select columns from 'managed_service'
339
+ SELECT
340
+ C.column_name, C.data_type, C.udt_name, C.domain_name,
341
+ VC.table_catalog, VC.table_schema, VC.table_name,
342
+ true as is_nullable,
343
+ 1 as level
344
+ FROM information_schema.columns C
345
+ LEFT JOIN information_schema.view_column_usage VC on VC.view_name = C.table_name AND VC.column_name = C.column_name
346
+ WHERE C.table_name = 'temp_view__""" + temp_view_name + """'
347
+
348
+ UNION ALL
349
+
350
+ SELECT
351
+ C.column_name, C.data_type, C.udt_name, C.domain_name,
352
+ VC.table_catalog, VC.table_schema, VC.table_name,
353
+ CASE WHEN C.is_nullable = 'NO' then false else true end as is_nullable,
354
+ CH.level + 1 as level
355
+ FROM information_schema.columns C
356
+ JOIN column_hierarchy CH ON C.column_name = CH.column_name
357
+ LEFT JOIN information_schema.view_column_usage VC on VC.view_name = C.table_name AND VC.column_name = C.column_name
358
+ WHERE C.table_name = CH.table_name AND C.table_schema = CH.table_schema AND C.table_catalog = CH.table_catalog
359
+ )SELECT
360
+ MAX(CH.column_name) as column_name,
361
+ MAX(CH.data_type) as data_type,
362
+ MAX(CH.udt_name) as udt_name,
363
+ MAX(CH.domain_name) as domain_name,
364
+ NOT(bool_or(NOT(CH.is_nullable))) as is_nullable
365
+ FROM column_hierarchy CH
366
+ GROUP BY CH.column_name, CH.data_type, CH.udt_name, CH.domain_name;"""
334
367
  found_params = {}
335
368
  elif do_prepare_only and not psql:
336
369
  arg_open = "(" if len(found_params) != 0 else ""
@@ -80,6 +80,10 @@ class JAAQLController(BaseJAAQLController):
80
80
  def prepare(http_inputs: dict, account_id: str):
81
81
  return self.model.prepare_queries(http_inputs, account_id)
82
82
 
83
+ @self.publish_route('/domains', DOCUMENTATION__domains)
84
+ def prepare(http_inputs: dict, account_id: str):
85
+ return self.model.fetch_domains(http_inputs, account_id)
86
+
83
87
  @self.publish_route('/account/password', DOCUMENTATION__password)
84
88
  def password(account_id: str, username: str, ip_address: str, is_the_anonymous_user: bool, http_inputs: dict):
85
89
  return self.model.add_my_account_password(account_id, username, ip_address, is_the_anonymous_user, **http_inputs)
@@ -189,10 +189,42 @@ class JAAQLModel(BaseJAAQLModel):
189
189
  if len(parts) >= 2:
190
190
  column_name = parts[0]
191
191
  column_type = parts[1]
192
- columns[column_name] = column_type
192
+ columns[column_name] = {
193
+ "type": column_type,
194
+ "nullable": True # We can't figure this out with gdesc
195
+ }
193
196
  return columns
194
197
 
195
- def prepare_queries(self, inputs: dict, account_id: str, cost_only: bool = False):
198
+ def fetch_domains(self, inputs: dict, account_id: str):
199
+ db_connection = create_interface_for_db(self.vault, self.config, account_id, inputs[KEY__database], None)
200
+ self.is_dba(db_connection)
201
+
202
+ domains_query = """
203
+ SELECT
204
+ t.typname AS type_name,
205
+ CASE
206
+ WHEN t.typtype = 'd' THEN bt.typname
207
+ ELSE t.typname
208
+ END AS base_type,
209
+ t.typtype
210
+ FROM
211
+ pg_type t
212
+ JOIN pg_namespace n ON n.oid = t.typnamespace
213
+ LEFT JOIN pg_type bt ON bt.oid = t.typbasetype
214
+ WHERE
215
+ t.typtype IN ('b', 'd')
216
+ AND n.nspname NOT IN ('information_schema')
217
+ AND left(t.typname, 1) <> '_'
218
+ AND left(t.typname, 3) <> 'pg_'
219
+ ORDER BY
220
+ n.nspname,
221
+ t.typname;
222
+ """
223
+
224
+ return execute_supplied_statement(db_connection, domains_query, as_objects=True)
225
+
226
+ def prepare_queries(self, inputs: dict, account_id: str):
227
+ cost_only = inputs.get("cost_only", False)
196
228
  db_connection = create_interface_for_db(self.vault, self.config, account_id, inputs[KEY__database], None)
197
229
 
198
230
  self.is_dba(db_connection)
@@ -203,7 +235,6 @@ class JAAQLModel(BaseJAAQLModel):
203
235
  my_uuid = str(uuid.uuid4()).replace("-", "_")
204
236
  exc = None
205
237
  cost = None
206
- domain_types = None
207
238
  type_resolution_method = None
208
239
  columns = None
209
240
  try:
@@ -218,9 +249,13 @@ class JAAQLModel(BaseJAAQLModel):
218
249
  domain_types = execute_supplied_statement(db_connection, query["query"].strip(), do_prepare_only=my_uuid, attempt_fetch_domain_types=True)
219
250
  type_resolution_method = "temp_view"
220
251
  temp_columns = [row[0] for row in domain_types['rows']]
252
+ nullable = [row[4] for row in domain_types['rows']]
221
253
  temp_types = [row[3] if row[3] is not None else row[2] for row in domain_types['rows']]
222
254
  columns = {
223
- col: temp_types[idx]
255
+ col: {
256
+ "type": temp_types[idx],
257
+ "nullable": nullable[idx]
258
+ }
224
259
  for col, idx in zip(temp_columns, range(len(temp_columns)))
225
260
  }
226
261
  except Exception as ex:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaaql-middleware-python
3
- Version: 4.24.5
3
+ Version: 4.24.6
4
4
  Summary: The jaaql package, allowing for rapid development and deployment of RESTful HTTP applications
5
5
  Home-page: https://github.com/JAAQL/JAAQL-middleware-python
6
6
  Author: Software Quality Measurement and Improvement bv