
    Vh/                         d dl mZmZmZ eZdZdZdZd dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZmZmZmZmZmZmZ d d
lmZ ere ed      k  rd dlm Z! nerd dl"m Z! d Z#e$dk(  r e#        yy)    )absolute_importdivisionprint_functiona0  
---
module: postgresql_script

short_description: Run PostgreSQL statements from a file

description:
- Runs arbitrary PostgreSQL statements from a file.
- The module always reports that the state has changed.
- Do NOT run the module against files generated by C(pg_dump),
  C(pg_dumpall), C(pg_restore) and other PostgreSQL utilities.
- Use M(community.postgresql.postgresql_db) with I(state=restore)
  to run queries from files generated by C(pg_dump/pg_dumpall).

version_added: '2.1.0'

options:
  positional_args:
    description:
    - List of values to substitute variable placeholders within the file content.
    - When the value is a list, it will be converted to PostgreSQL array.
    - Mutually exclusive with I(named_args).
    type: list
    elements: raw
  named_args:
    description:
    - Dictionary of key-value arguments to substitute
      variable placeholders within the file content.
    - When the value is a list, it will be converted to PostgreSQL array.
    - Mutually exclusive with I(positional_args).
    type: dict
  path:
    description:
    - Path to a SQL script on the target machine.
    - To upload dumps, the preferable way
      is to use the M(community.postgresql.postgresql_db) module with I(state=restore).
    type: path
  session_role:
    description:
    - Switch to C(session_role) after connecting. The specified role must
      be a role that the current C(login_user) is a member of.
    - Permissions checking for SQL commands is carried out as though
      the C(session_role) were the one that had logged in originally.
    type: str
  login_db:
    description:
    - Name of database to connect to and run queries against.
    - The V(db) alias is deprecated and will be removed in version 5.0.0.
    type: str
    aliases:
    - db
  encoding:
    description:
    - Set the client encoding for the current session (e.g. C(UTF-8)).
    - The default is the encoding defined by the database.
    type: str
  trust_input:
    description:
    - If C(false), check whether a value of I(session_role) is potentially dangerous.
    - It makes sense to use C(false) only when SQL injections
      via I(session_role) are possible.
    type: bool
    default: true
  search_path:
    description:
    - Overrides the list of schemas to search for db objects in.
    type: list
    elements: str

seealso:
- module: community.postgresql.postgresql_db
- module: community.postgresql.postgresql_query
- name: PostgreSQL Schema reference
  description: Complete reference of the PostgreSQL schema documentation.
  link: https://www.postgresql.org/docs/current/ddl-schemas.html

attributes:
  check_mode:
    support: none

author:
- Douglas J Hunley (@hunleyd)
- A. Hart (@jtelcontar)
- Daniel Scharon (@DanScharon)
- Andrew Klychkov (@Andersson007)

extends_documentation_fragment:
- community.postgresql.postgres
aY
  
# Assuming that the file contains
# SELECT * FROM id_talbe WHERE id = %s,
# '%s' will be substituted with 1
- name: Run query from SQL script using UTF-8 client encoding for session and positional args
  community.postgresql.postgresql_script:
    login_db: test_db
    path: /var/lib/pgsql/test.sql
    positional_args:
      - 1
    encoding: UTF-8

# Assuming that the file contains
# SELECT * FROM test WHERE id = %(id_val)s AND story = %(story_val)s,
# %-values will be substituted with 1 and 'test'
- name: Select query to test_db with named_args
  community.postgresql.postgresql_script:
    login_db: test_db
    path: /var/lib/pgsql/test.sql
    named_args:
      id_val: 1
      story_val: test

- block:
  # Assuming that the the file contains
  # SELECT * FROM test_array_table WHERE arr_col1 = %s AND arr_col2 = %s
  # Pass list and string vars as positional_args
  - name: Set vars
    ansible.builtin.set_fact:
      my_list:
      - 1
      - 2
      - 3
      my_arr: '{1, 2, 3}'
  - name: Passing positional_args as arrays
    community.postgresql.postgresql_script:
      path: /var/lib/pgsql/test.sql
      positional_args:
        - '{{ my_list }}'
        - '{{ my_arr|string }}'

# Assuming that the the file contains
# SELECT * FROM test_table,
# look into app1 schema first, then,
# if the schema doesn't exist or the table hasn't been found there,
# try to find it in the schema public
- name: Select from test using search_path
  community.postgresql.postgresql_script:
    path: /var/lib/pgsql/test.sql
    search_path:
    - app1
    - public

- block:
    # If you use a variable in positional_args/named_args that can
    # be undefined and you wish to set it as NULL, constructions like
    # "{{ my_var if (my_var is defined) else none | default(none) }}"
    # will not work as expected substituting an empty string instead of NULL.
    # If possible, we suggest using Ansible's DEFAULT_JINJA2_NATIVE configuration
    # (https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-jinja2-native).
    # Enabling it fixes this problem. If you cannot enable it, the following workaround
    # can be used.
    # You should precheck such a value and define it as NULL when undefined.
    # For example:
    - name: When undefined, set to NULL
      set_fact:
        my_var: NULL
      when: my_var is undefined

    # Then, assuming that the file contains
    # INSERT INTO test_table (col1) VALUES (%s)
    - name: Insert a value using positional arguments
      community.postgresql.postgresql_script:
        path: /var/lib/pgsql/test.sql
        positional_args:
          - '{{ my_var }}'
a  
query:
    description:
    - Executed query.
    - When the C(positional_args) or C(named_args) options are used,
      the query contains all variables that were substituted
      inside the database connector.
    returned: success
    type: str
    sample: 'SELECT * FROM bar'
statusmessage:
    description:
    - Attribute containing the message returned by the database connector
      after executing the script content.
    - When there are several statements in the script, returns a message
      related to the last statement.
    returned: success
    type: str
    sample: 'INSERT 0 1'
query_result:
    description:
    - List of dictionaries in the column:value form representing returned rows.
    - When there are several statements in the script,
      returns result of the last statement.
    returned: success
    type: list
    elements: dict
    sample: [{"Column": "Value1"},{"Column": "Value2"}]
rowcount:
    description:
    - Number of produced or affected rows.
    - When there are several statements in the script,
      returns a number of rows affected by the last statement.
    returned: changed
    type: int
    sample: 5
)	to_native)AnsibleModule)	iteritems)check_input)HAS_PSYCOPGPSYCOPG_VERSIONTYPES_NEED_TO_CONVERTconnect_to_dbconvert_elements_to_pg_arraysconvert_to_supportedensure_required_libsget_conn_paramspg_cursor_argspostgres_common_argument_specset_search_path)LooseVersion3.0)ProgrammingErrorc                     t               } | j                  t        d      t        ddgddddg      t        d	d
      t        d      t        d      t        d      t        dd      t        d	d             t        | dd      }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|st        ||       	 t        |d      5 }	t        |	j                               }
d d d        t        |       t        ||j                        }|||d<   t        ||d      \  }} |j                  d*i t        }|r;t!        |d d!j#                  |D cg c]  }|j%                  d"       c}      z         |r|}n|r|}nd }|rt'        |      }	 |j)                  
|      }|j+                  |
|       |j.                  }|j0                  }g }	 |j3                         }t4        t7        d&      k\  r1|j9                         !|j3                         }|j9                         !|D ]P  }t        |      }t;        |      D ]$  \  }}t=        |t>              stA        |      ||<   & |jC                  |       R 	 |g k(  ri }t        d|||)      }|j-                          |j-                           |jF                  d*i | y # 1 sw Y   xY w# t        $ r,}|j                  d|dt        |             Y d }~d }~ww xY wc c}w # t        $ rO}|j-                          |j-                          |j                  d#
d$|d%t        |             Y d }~d }~ww xY w# tD        $ r}t        |      d'k(  ri }Y d }~d }~wt        $ r)}|j                  d(t        |      z         Y d }~>d }~ww xY w)+Npath)typestrdbz5.0.0zcommunity.postgresql)nameversioncollection_name)r   aliasesdeprecated_aliaseslistraw)r   elementsdictboolT)r   default)r   login_dbpositional_args
named_argssession_roleencodingtrust_inputsearch_path))r)   r*   F)argument_specmutually_exclusivesupports_check_moder)   r*   r,   r+   r-   r.   rbzCannot read file 'z' : )msgclient_encoding)
autocommitz%s, zCannot execute SQL 'z' z: r   zno results to fetchz!Cannot fetch rows from cursor: %s)changedquerystatusmessagequery_resultrowcount )$r   updater%   r   paramsr	   openr   read	Exception	fail_jsonr   r   r   cursorr   r   joinstripr   mogrifyexecutecloser:   r<   fetchallr   r   nextsetr   
isinstancer   r   appendPsycopgProgrammingError	exit_json)r/   moduler   r)   r*   r,   r+   r-   r.   fscript_contenteconn_paramsdb_connectiondummyrD   xargscurrent_query_txtr:   r<   r;   
result_setrowkeyvalkws                              z/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/postgresql/plugins/modules/postgresql_script.pymainr`      s   13Mv54&"#9F 
 &59V$u%5!fd3fu5  " #?!F == Dmm$56O|,J}}Z(H==0L--.K--.KFL)R$ 	1&qvvx0N	1  !&&--8K)1%&(NM5!]!!3N3Fsxx{0S!0S'T TU 	 ,T2f"NN>4@~t, ((MH
 LQ__&
l511..".#__.
 ..". 	%C s)C'n 9
cc#893C8CH9 $	%& r	#!
B LLNFrk	1 	1  RT9Q<PQQR 1T&  fQUW`abWcdeef< # Q<00L Q@9Q<OPPQs   L L+L M$M AN0 +1N0 #N0 LL 	M!!MM	N-AN((N-0	P9OPO??P__main__N)%
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils._textr   ansible.module_utils.basicr   ansible.module_utils.sixr   Fansible_collections.community.postgresql.plugins.module_utils.databaser	   Fansible_collections.community.postgresql.plugins.module_utils.postgresr
   r   r   r   r   r   r   r   r   r   r   Eansible_collections.community.postgresql.plugins.module_utils.versionr   psycopg2r   rN   psycopgr`   __name__r=       r_   <module>rq      s    A @XtL\$
L 1 4 .    ?\%%88DC{| zF rp   