
    Vhqt                         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mZ d dlmZmZmZmZmZmZmZ dZ G d	 d
e      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functionaR  
---
module: postgresql_owner
short_description: Change an owner of PostgreSQL database object
description:
- Change an owner of PostgreSQL database object.
- Also allows to reassign the ownership of database objects owned by a database role to another role.

options:
  new_owner:
    description:
    - Role (user/group) to set as an I(obj_name) owner.
    type: str
    required: true
  obj_name:
    description:
    - Name of a database object to change ownership.
    - Mutually exclusive with I(reassign_owned_by).
    type: str
  obj_type:
    description:
    - Type of a database object.
    - Mutually exclusive with I(reassign_owned_by).
    - I(obj_type=matview) is available since PostgreSQL 9.3.
    - I(obj_type=event_trigger), I(obj_type=procedure), I(obj_type=publication),
      I(obj_type=statistics), and I(obj_type=routine) are available since PostgreSQL 11.
    type: str
    choices: [ aggregate, collation, conversion, database, domain, event_trigger, foreign_data_wrapper,
               foreign_table, function, language, large_object, matview, procedure, publication, routine,
               schema, sequence, server, statistics, table, tablespace, text_search_configuration,
               text_search_dictionary, type, view ]
    aliases:
    - type
  reassign_owned_by:
    description:
    - Caution - the ownership of all the objects within the specified I(db),
      owned by this role(s) will be reassigned to I(new_owner).
    - REASSIGN OWNED is often used to prepare for the removal of one or more roles.
    - REASSIGN OWNED does not affect objects within other databases.
    - Execute this command in each database that contains objects owned by a role that is to be removed.
    - If role(s) exists, always returns changed True.
    - Cannot reassign ownership of objects that are required by the database system.
    - Mutually exclusive with C(obj_type).
    type: list
    elements: str
  fail_on_role:
    description:
    - If C(true), fail when I(reassign_owned_by) role does not exist.
      Otherwise just warn and continue.
    - Mutually exclusive with I(obj_name) and I(obj_type).
    default: true
    type: bool
  login_db:
    description:
    - Name of database to connect to.
    - The V(db) alias is deprecated and will be removed in version 5.0.0.
    type: str
    aliases:
    - db
  session_role:
    description:
    - Switch to session_role after connecting.
      The specified session_role must be a role that the current login_user is a member of.
    - Permissions checking for SQL commands is carried out as though
      the session_role were the one that had logged in originally.
    type: str
  trust_input:
    description:
    - If C(false), check whether values of parameters I(new_owner), I(obj_name),
      I(reassign_owned_by), I(session_role) are potentially dangerous.
    - It makes sense to use C(false) only when SQL injections via the parameters are possible.
    type: bool
    default: true
    version_added: '0.2.0'

notes:
- Function Overloading is not supported so when I(obj_type) is C(aggregate), C(function), C(routine), or C(procedure)
  I(obj_name) is considered the only object of same type with this name.
- Despite Function Overloading is not supported, when I(obj_type=aggregate) I(obj_name) must contain also aggregate
  signature because it is required by SQL syntax.
- I(new_owner) must be a superuser if I(obj_type) is C(event_type) or C(foreign_data_wrapper).
- To manage subscriptions ownership use C(community.postgresql.postgresql_subscription) module.

seealso:
- module: community.postgresql.postgresql_user
- module: community.postgresql.postgresql_privs
- module: community.postgresql.postgresql_membership
- module: community.postgresql.postgresql_subscription
- name: PostgreSQL REASSIGN OWNED command reference
  description: Complete reference of the PostgreSQL REASSIGN OWNED command documentation.
  link: https://www.postgresql.org/docs/current/sql-reassign-owned.html

attributes:
  check_mode:
    support: full

author:
- Andrew Klychkov (@Andersson007)
- Daniele Giudice (@RealGreenDragon)

extends_documentation_fragment:
- community.postgresql.postgres
aA  
# Set owner as alice for function myfunc in database bar by ansible ad-hoc command:
# ansible -m postgresql_owner -a "db=bar new_owner=alice obj_name=myfunc obj_type=function"

- name: The same as above by playbook
  community.postgresql.postgresql_owner:
    login_db: bar
    new_owner: alice
    obj_name: myfunc
    obj_type: function

- name: Set owner as bob for table acme in database bar
  community.postgresql.postgresql_owner:
    login_db: bar
    new_owner: bob
    obj_name: acme
    obj_type: table

- name: Set owner as alice for view test_view in database bar
  community.postgresql.postgresql_owner:
    login_db: bar
    new_owner: alice
    obj_name: test_view
    obj_type: view

- name: Set owner as bob for tablespace ssd in database foo
  community.postgresql.postgresql_owner:
    login_db: foo
    new_owner: bob
    obj_name: ssd
    obj_type: tablespace

- name: Reassign all databases owned by bob to alice and all objects in database bar owned by bob to alice
  community.postgresql.postgresql_owner:
    login_db: bar
    new_owner: alice
    reassign_owned_by: bob

- name: Reassign all databases owned by bob or bill to alice and all objects in database bar owned by bob or bill to alice
  community.postgresql.postgresql_owner:
    login_db: bar
    new_owner: alice
    reassign_owned_by:
    - bob
    - bill
z
queries:
  description: List of executed queries.
  returned: success
  type: str
  sample: [ 'REASSIGN OWNED BY "bob" TO "alice"' ]
)AnsibleModule)check_inputpg_quote_identifier)connect_to_dbensure_required_libsexec_sqlget_conn_paramsget_server_versionpg_cursor_argspostgres_common_argument_spec)	aggregate	collation
conversiondatabasedomainevent_triggerforeign_data_wrapperforeign_tablefunctionlanguagelarge_objectmatview	procedurepublicationroutineschemasequenceserver
statisticstable
tablespacetext_search_configurationtext_search_dictionarytypeviewc                       e Zd ZdZd Zd"dZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"y!)#PgOwnershipa  Class for changing ownership of PostgreSQL objects.

    Arguments:
        module (AnsibleModule): Object of Ansible module class.
        cursor (psycopg.connect.cursor): Cursor object for interaction with the database.
        role (str): Role name to set as a new owner of objects.

    Important:
        If you want to add handling of a new type of database objects:
        1. Add a specific method for this like self.__set_db_owner(), etc.
        2. Add a condition with a check of ownership for new type objects to self.__is_owner()
        3. Add a condition with invocation of the specific method to self.set_owner()
        4. Add the information to the module documentation
        That's all.
    c                     || _         || _        || _        | j                  |       || _        d| _        g | _        d| _        d| _        y )NF )	modulecursor
pg_versioncheck_role_existsrolechangedexecuted_queriesobj_nameobj_type)selfr-   r.   r/   r1   s        y/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/postgresql/plugins/modules/postgresql_owner.py__init__zPgOwnership.__init__   sI    $t$	 "    c                     | j                  |      sA|r | j                  j                  d|z         y| j                  j                  d|z         yy)zCheck the role exists or not.

        Arguments:
            role (str): Role name.
            fail_on_role (bool): If True, fail when the role does not exist.
                Otherwise just warn and continue.
        zRole '%s' does not existmsgzRole '%s' does not exist, passFT)_PgOwnership__role_existsr-   	fail_jsonwarn)r6   r1   fail_on_roles      r7   r0   zPgOwnership.check_role_exists   sW     !!$'%%*Dt*K%L    !AD!HI r9   c                 8   g }|D ])  }| j                  ||      s|j                  d|z         + |sydj                  |      }dg}|j                  |       |j                  d| j                  z         dj                  |      }t	        | |d      | _        y	)
a  Implements REASSIGN OWNED BY command.

        If success, set self.changed as True.

        Arguments:
            old_owners (list): The ownership of all the objects within
                the current database, and of all shared objects (databases, tablespaces),
                owned by these roles will be reassigned to self.role.
            fail_on_role (bool): If True, fail when a role from old_owners does not exist.
                Otherwise just warn and continue.
        z"%s"F,zREASSIGN OWNED BYzTO "%s" Treturn_boolN)r0   appendjoinr1   r   r2   )r6   
old_ownersr@   rolesrquerys         r7   reassignzPgOwnership.reassign   s      	)A%%a6VaZ(	)
 XXe_
$%Z Y*+e>r9   c                    || _         || _        | j                         ry|dk(  r| j                          y|dk(  r| j	                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|d	k(  r| j                          y|d
k(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r| j!                          y|dk(  r| j#                          y|dk(  r| j%                          y|dk(  r| j'                          y|dk(  r| j)                          y|dk(  r| j+                          y|dk(  r| j-                          y|dk(  r| j/                          y|dk(  r| j1                          y|dk(  r| j3                          y|dk(  r| j5                          y|dk(  r| j7                          yy)zChange owner of a database object.

        Arguments:
            obj_type (str): Type of object (like database, table, view, etc.).
            obj_name (str): Object name.
        Fr   r   r    r   r#   r$   r(   r   r   r'   r   r   r   r   r   r   r%   r&   r   r!   r   r   r   r   r"   N)r4   r5   _PgOwnership__is_owner_PgOwnership__set_db_owner_PgOwnership__set_func_owner_PgOwnership__set_seq_owner_PgOwnership__set_schema_owner_PgOwnership__set_table_owner"_PgOwnership__set_tablespace_owner_PgOwnership__set_view_owner _PgOwnership__set_mat_view_owner!_PgOwnership__set_procedure_owner_PgOwnership__set_type_owner!_PgOwnership__set_aggregate_owner_PgOwnership__set_routine_owner _PgOwnership__set_language_owner_PgOwnership__set_domain_owner!_PgOwnership__set_collation_owner"_PgOwnership__set_conversion_owner1_PgOwnership__set_text_search_configuration_owner._PgOwnership__set_text_search_dictionary_owner,_PgOwnership__set_foreign_data_wrapper_owner_PgOwnership__set_server_owner%_PgOwnership__set_foreign_table_owner%_PgOwnership__set_event_trigger_owner$_PgOwnership__set_large_object_owner#_PgOwnership__set_publication_owner"_PgOwnership__set_statistics_owner)r6   r5   r4   s      r7   	set_ownerzPgOwnership.set_owner  s    !  ??z!!#!!##  "!##% ""$%'')!!#"%%'$&&(!!#$&&("$$&#%%'!##%$&&(%'')4466811335//113!##%(**,(**,'))+&((*%'') &r9   c                    | j                   dk(  rd}n| j                   dk(  rd}n~| j                   dv rx| j                   dk(  r+| j                  dk  r| j                  j                  d	       | j                   d
k(  r+| j                  dk  r| j                  j                  d	       d}n| j                   dk(  rd}n| j                   dk(  rd}n| j                   dk(  rd}n| j                   dk(  rd}n| j                   dk(  r/| j                  dk  r| j                  j                  d	       d}nn| j                   dv rd}n\| j                   dk(  rd}nI| j                   dk(  rd}n6| j                   dk(  rd }n#| j                   d!k(  rd"}n| j                   d#k(  rd$}n| j                   d%k(  rd&}n| j                   d'k(  rd(}n| j                   d)k(  rd*}n| j                   d+k(  r.| j                  dk  r| j                  j                  d,	       d-}n| j                   d.k(  rd/}ny| j                   d0k(  r.| j                  dk  r| j                  j                  d1	       d2}n<| j                   d3k(  r-| j                  dk  r| j                  j                  d4	       d5}| j                   d6v r,| j                  j                  d7      d8   | j                  d9}n| j                  | j                  d9}t        | |d:;      S )<z5Return True if self.role is the current object owner.r#   zPSELECT 1 FROM pg_tables WHERE tablename = %(obj_name)s AND tableowner = %(role)sr   z}SELECT 1 FROM pg_database AS d JOIN pg_roles AS r ON d.datdba = r.oid WHERE d.datname = %(obj_name)s AND r.rolname = %(role)s)r   r   r   r   r   鰭 6PostgreSQL version must be >= 11 for obj_type=routine.r;   r   8PostgreSQL version must be >= 11 for obj_type=procedure.z{SELECT 1 FROM pg_proc AS f JOIN pg_roles AS r ON f.proowner = r.oid WHERE f.proname = %(obj_name)s AND r.rolname = %(role)sr    zSELECT 1 FROM pg_class AS c JOIN pg_roles AS r ON c.relowner = r.oid WHERE c.relkind = 'S' AND c.relname = %(obj_name)s AND r.rolname = %(role)sr   zfSELECT 1 FROM information_schema.schemata WHERE schema_name = %(obj_name)s AND schema_owner = %(role)sr$   zSELECT 1 FROM pg_tablespace AS t JOIN pg_roles AS r ON t.spcowner = r.oid WHERE t.spcname = %(obj_name)s AND r.rolname = %(role)sr(   zMSELECT 1 FROM pg_views WHERE viewname = %(obj_name)s AND viewowner = %(role)sr   ` 7PostgreSQL version must be >= 9.3 for obj_type=matview.zVSELECT 1 FROM pg_matviews WHERE matviewname = %(obj_name)s AND matviewowner = %(role)s)r   r'   z{SELECT 1 FROM pg_type AS t JOIN pg_roles AS r ON t.typowner = r.oid WHERE t.typname = %(obj_name)s AND r.rolname = %(role)sr   zSELECT 1 FROM pg_language AS l JOIN pg_roles AS r ON l.lanowner = r.oid WHERE l.lanname = %(obj_name)s AND r.rolname = %(role)sr   zSELECT 1 FROM pg_collation AS c JOIN pg_roles AS r ON c.collowner = r.oid WHERE c.collname = %(obj_name)s AND r.rolname = %(role)sr   zSELECT 1 FROM pg_conversion AS c JOIN pg_roles AS r ON c.conowner = r.oid WHERE c.conname = %(obj_name)s AND r.rolname = %(role)sr%   zSELECT 1 FROM pg_ts_config AS t JOIN pg_roles AS r ON t.cfgowner = r.oid WHERE t.cfgname = %(obj_name)s AND r.rolname = %(role)sr&   zSELECT 1 FROM pg_ts_dict AS t JOIN pg_roles AS r ON t.dictowner = r.oid WHERE t.dictname = %(obj_name)s AND r.rolname = %(role)sr   zSELECT 1 FROM pg_foreign_data_wrapper AS f JOIN pg_roles AS r ON f.fdwowner = r.oid WHERE f.fdwname = %(obj_name)s AND r.rolname = %(role)sr!   zSELECT 1 FROM pg_foreign_server AS f JOIN pg_roles AS r ON f.srvowner = r.oid WHERE f.srvname = %(obj_name)s AND r.rolname = %(role)sr   zSELECT 1 FROM pg_class AS c JOIN pg_roles AS r ON c.relowner = r.oid WHERE c.relkind = 'f' AND c.relname = %(obj_name)s AND r.rolname = %(role)sr   z<PostgreSQL version must be >= 11 for obj_type=event_trigger.zSELECT 1 FROM pg_event_trigger AS e JOIN pg_roles AS r ON e.evtowner = r.oid WHERE e.evtname = %(obj_name)s AND r.rolname = %(role)sr   zSELECT 1 FROM pg_largeobject_metadata AS l JOIN pg_roles AS r ON l.lomowner = r.oid WHERE l.oid = %(obj_name)s AND r.rolname = %(role)sr   :PostgreSQL version must be >= 11 for obj_type=publication.zSELECT 1 FROM pg_publication AS p JOIN pg_roles AS r ON p.pubowner = r.oid WHERE p.pubname = %(obj_name)s AND r.rolname = %(role)sr"   9PostgreSQL version must be >= 11 for obj_type=statistics.zSELECT 1 FROM pg_statistic_ext AS s JOIN pg_roles AS r ON s.stxowner = r.oid WHERE s.stxname = %(obj_name)s AND r.rolname = %(role)s)r   r   r   r   (r   )r4   r1   Fadd_to_executed)r5   r/   r-   r>   r4   splitr1   r   )r6   rK   query_paramss      r7   
__is_ownerzPgOwnership.__is_ownerg  s   ==G#1E ]]j(0E
 ]]OO}}	)doo.F%%*b%c}}+&0H%%*d%e0E
 ]]j(0E
 ]]h&3E ]]l*0E
 ]]f$0E ]]i'&%%*c%d3E ]]000E
 ]]j(0E
 ]]k)0E
 ]]l*0E
 ]]990E
 ]]660E
 ]]440E
 ]]h&0E
 ]]o-0E
 ]]o-'%%*h%i0E
 ]]n,0E
 ]]m+'%%*f%g0E
 ]]l*'%%*e%f0E
 ==MM(,(;(;C(@(CTYYWL(,tyyILe\5IIr9   c                 d    d| j                   d| j                  d}t        | |d      | _        y)zSet the database owner.zALTER DATABASE "" OWNER TO ""TrD   Nr4   r1   r   r2   r6   rK   s     r7   __set_db_ownerzPgOwnership.__set_db_owner  s$    7;}}diiPe>r9   c                 d    d| j                   d| j                  d}t        | |d      | _        y)zSet the function owner.zALTER FUNCTION  OWNER TO "ry   TrD   Nrz   r{   s     r7   __set_func_ownerzPgOwnership.__set_func_owner  $    59]]DIINe>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the sequence owner.zALTER SEQUENCE r    r~   ry   TrD   Nr   r4   r1   r   r2   r{   s     r7   __set_seq_ownerzPgOwnership.__set_seq_owner   s0    5HXb5c59YY@e>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the schema owner.zALTER SCHEMA r   r~   ry   TrD   Nr   r{   s     r7   __set_schema_ownerzPgOwnership.__set_schema_owner  s/    3Ft}}V^3_3799>e>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the table owner.zALTER TABLE r#   r~   ry   TrD   Nr   r{   s     r7   __set_table_ownerzPgOwnership.__set_table_owner  s/    2EdmmU\2]26))=e>r9   c                 d    d| j                   d| j                  d}t        | |d      | _        y)zSet the tablespace owner.zALTER TABLESPACE "rx   ry   TrD   Nrz   r{   s     r7   __set_tablespace_ownerz"PgOwnership.__set_tablespace_owner  $    9=		Re>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the view owner.zALTER VIEW r#   r~   ry   TrD   Nr   r{   s     r7   __set_view_ownerzPgOwnership.__set_view_owner  /    1DT]]T[1\15<e>r9   c                     | j                   dk  r| j                  j                  d       dt        | j                  d      d| j
                  d}t        | |d	      | _        y
)z Set the materialized view owner.rm   rn   r;   zALTER MATERIALIZED VIEW r#   r~   ry   TrD   Nr/   r-   r>   r   r4   r1   r   r2   r{   s     r7   __set_mat_view_ownerz PgOwnership.__set_mat_view_owner  sV    ??U"KK!!&_!`>QRVR_R_ah>i>BiiIe>r9   c                     | j                   dk  r| j                  j                  d       dt        | j                  d      d| j
                  d}t        | |d	      | _        y
)zSet the procedure owner.rj   rl   r;   zALTER PROCEDURE r#   r~   ry   TrD   Nr   r{   s     r7   __set_procedure_ownerz!PgOwnership.__set_procedure_owner&  sS    ??V#KK!!&`!a6I$--Y`6a6:iiAe>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the type owner.zALTER TYPE r#   r~   ry   TrD   Nr   r{   s     r7   __set_type_ownerzPgOwnership.__set_type_owner/  r   r9   c                 d    d| j                   d| j                  d}t        | |d      | _        y)zSet the aggregate owner.zALTER AGGREGATE r~   ry   TrD   Nrz   r{   s     r7   __set_aggregate_ownerz!PgOwnership.__set_aggregate_owner5  s$    6:mmTYYOe>r9   c                     | j                   dk  r| j                  j                  d       dt        | j                  d      d| j
                  d}t        | |d	      | _        y
)zSet the routine owner.rj   rk   r;   zALTER ROUTINE r#   r~   ry   TrD   Nr   r{   s     r7   __set_routine_ownerzPgOwnership.__set_routine_owner:  sR    ??V#KK!!&^!_4GW^4_48II?e>r9   c                 d    d| j                   d| j                  d}t        | |d      | _        y)zSet the language owner.zALTER LANGUAGE r~   ry   TrD   Nrz   r{   s     r7   __set_language_ownerz PgOwnership.__set_language_ownerB  r   r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the domain owner.zALTER DOMAIN r#   r~   ry   TrD   Nr   r{   s     r7   __set_domain_ownerzPgOwnership.__set_domain_ownerG  /    3Ft}}V]3^3799>e>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the collation owner.zALTER COLLATION r#   r~   ry   TrD   Nr   r{   s     r7   __set_collation_ownerz!PgOwnership.__set_collation_ownerM  s0    6I$--Y`6a6:iiAe>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the conversion owner.zALTER CONVERSION r#   r~   ry   TrD   Nr   r{   s     r7   __set_conversion_ownerz"PgOwnership.__set_conversion_ownerS  s0    7J4==Za7b7;yyBe>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)z(Set the text search configuration owner.z ALTER TEXT SEARCH CONFIGURATION r#   r~   ry   TrD   Nr   r{   s     r7   %__set_text_search_configuration_ownerz1PgOwnership.__set_text_search_configuration_ownerY  s3    FYZ^ZgZgipFqFJiiQe>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)z%Set the text search dictionary owner.zALTER TEXT SEARCH DICTIONARY r#   r~   ry   TrD   Nr   r{   s     r7   "__set_text_search_dictionary_ownerz.PgOwnership.__set_text_search_dictionary_owner_  s3    CVW[WdWdfmCnCG99Ne>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)z#Set the foreign data wrapper owner.zALTER FOREIGN DATA WRAPPER r#   r~   ry   TrD   Nr   r{   s     r7    __set_foreign_data_wrapper_ownerz,PgOwnership.__set_foreign_data_wrapper_ownere  s3    ATUYUbUbdkAlAELe>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the server owner.zALTER SERVER r#   r~   ry   TrD   Nr   r{   s     r7   __set_server_ownerzPgOwnership.__set_server_ownerk  r   r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the foreign table owner.zALTER FOREIGN TABLE r#   r~   ry   TrD   Nr   r{   s     r7   __set_foreign_table_ownerz%PgOwnership.__set_foreign_table_ownerq  0    :Mdmm]d:e:>))Ee>r9   c                 x    dt        | j                  d      d| j                  d}t        | |d      | _        y)zSet the event trigger owner.zALTER EVENT TRIGGER r#   r~   ry   TrD   Nr   r{   s     r7   __set_event_trigger_ownerz%PgOwnership.__set_event_trigger_ownerw  r   r9   c                 d    d| j                   d| j                  d}t        | |d      | _        y)zSet the large object owner.zALTER LARGE OBJECT r~   ry   TrD   Nrz   r{   s     r7   __set_large_object_ownerz$PgOwnership.__set_large_object_owner}  r   r9   c                     | j                   dk  r| j                  j                  d       dt        | j                  d      d| j
                  d}t        | |d	      | _        y
)zSet the publication owner.rj   ro   r;   zALTER PUBLICATION r   r~   ry   TrD   Nr   r{   s     r7   __set_publication_ownerz#PgOwnership.__set_publication_owner  sS    ??V#KK!!&b!c8KDMM[h8i8<		Ce>r9   c                     | j                   dk  r| j                  j                  d       dt        | j                  d      d| j
                  d}t        | |d	      | _        y
)zSet the statistics owner.rj   rp   r;   zALTER STATISTICS r#   r~   ry   TrD   Nr   r{   s     r7   __set_statistics_ownerz"PgOwnership.__set_statistics_owner  sS    ??V#KK!!&a!b7J4==Za7b7;yyBe>r9   c                 ,    d|i}d}t        | ||d      S )z3Return True if role exists, otherwise return False.r1   z/SELECT 1 FROM pg_roles WHERE rolname = %(role)sFrr   )r   )r6   r1   ru   rK   s       r7   __role_existszPgOwnership.__role_exists  s!    ~Ae\5IIr9   N)T)#__name__
__module____qualname____doc__r8   r0   rL   rh   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   r=    r9   r7   r*   r*      s     	&?<X*tMJ^?
?
????
?????
??
??????????
??Jr9   r*   c                  4   t               } | j                  t        dd      t        d      t        ddgt              t        dd      t        d	d
      t        ddgddddg      t        d      t        d	d
             t	        | ddgddgddgddggd      }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|st        |||||       t        |       t        ||j
                        }	t        ||	d      \  }
} |
j                  di t        }t        |
      }t        ||||      }|r|j                  ||       n|r|j                  ||       |j                   r|
j#                          n|
j%                          |j'                          |
j'                          |j)                  |j*                  |j,                         y )NstrT)r'   required)r'   r'   )r'   aliaseschoiceslist)r'   elementsbool)r'   defaultdbz5.0.0zcommunity.postgresql)nameversioncollection_name)r'   r   deprecated_aliases)	new_ownerr4   r5   reassign_owned_byr@   login_dbsession_roletrust_inputr4   r   r5   r@   )argument_specmutually_exclusivesupports_check_moder   r   r   F)
autocommit)r2   queriesr   )r   updatedictVALID_OBJ_TYPESr   paramsr   r
   r   r	   r.   r   r   r*   rh   rL   
check_moderollbackcommitclose	exit_jsonr2   r3   )r   r-   r   r4   r5   r   r@   r   r   conn_paramsdb_connectiondummyr.   r/   pg_ownerships                  r7   mainr     s"   13MED15!56(OLFU;vt454&"#9F 
 u%fd3    #,-,-((	
 !	F k*I}}Z(H}}Z(H&9:==0L==0L--.KFIx1BLQ  !&&--8K(OM5!]!!3N3F#M2J vvz9EL x2 
/>  
LLN
$$--  r9   __main__N)
__future__r   r   r   r'   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.basicr   Fansible_collections.community.postgresql.plugins.module_utils.databaser   r   Fansible_collections.community.postgresql.plugins.module_utils.postgresr	   r
   r   r   r   r   r   r   objectr*   r   r   r   r9   r7   <module>r      sw    A @fP-^
 5  =WJ& WJ|GT zF r9   