Alon Bar-Lev has uploaded a new change for review. Change subject: db: cleanup: dos2unix ......................................................................
db: cleanup: dos2unix Change-Id: I11129940f2b364248b8a71ab1215d1db6985e00f Signed-off-by: Alon Bar-Lev <alo...@redhat.com> --- M packaging/dbscripts/common_sp.sql 1 file changed, 595 insertions(+), 595 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-dwh refs/changes/48/25248/1 diff --git a/packaging/dbscripts/common_sp.sql b/packaging/dbscripts/common_sp.sql index 32906cb..567c391 100644 --- a/packaging/dbscripts/common_sp.sql +++ b/packaging/dbscripts/common_sp.sql @@ -1,595 +1,595 @@ --------------------------------------------------- --- DB helper functions --------------------------------------------------- - --- Creates a column in the given table (if not exists) -Create or replace FUNCTION fn_db_add_column(v_table varchar(128), v_column varchar(128), v_column_def text) -returns void -AS $procedure$ -declare -v_sql text; - -begin - if (not exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column)) then - begin - v_sql := 'ALTER TABLE ' || v_table || ' ADD COLUMN ' || v_column || ' ' || v_column_def; - EXECUTE v_sql; - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --- delete a column from a table and all its dependencied -Create or replace FUNCTION fn_db_drop_column(v_table varchar(128), v_column varchar(128)) -returns void -AS $procedure$ -declare -v_sql text; -begin - if (exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column)) then - begin - v_sql := 'ALTER TABLE ' || v_table || ' DROP COLUMN ' || v_column; - EXECUTE v_sql; - end; - end if; -end;$procedure$ -LANGUAGE plpgsql; - --- Changes a column data type (if value conversion is supported) -Create or replace FUNCTION fn_db_change_column_type(v_table varchar(128), v_column varchar(128), - v_type varchar(128), v_new_type varchar(128)) -returns void -AS $procedure$ -declare -v_sql text; - -begin - if (exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column and (udt_name ilike v_type or data_type ilike v_type))) then - begin - v_sql := 'ALTER TABLE ' || v_table || ' ALTER COLUMN ' || v_column || ' TYPE ' || v_new_type; - EXECUTE v_sql; - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --- rename a column for a given table -Create or replace FUNCTION fn_db_rename_column(v_table varchar(128), v_column varchar(128), v_new_name varchar(128)) -returns void -AS $procedure$ -declare -v_sql text; - -begin - if (exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column)) then - begin - v_sql := 'ALTER TABLE ' || v_table || ' RENAME COLUMN ' || v_column || ' TO ' || v_new_name; - EXECUTE v_sql; - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - - - --- Adds a value to vdc_options (if not exists) -create or replace FUNCTION fn_db_add_config_value(v_option_name varchar(100), v_option_value varchar(4000), - v_version varchar(40)) -returns void -AS $procedure$ -begin - if (not exists (select 1 from vdc_options where option_name ilike v_option_name and version = v_version)) then - begin - insert into vdc_options (option_name, option_value, version) values (v_option_name, v_option_value, v_version); - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --- Deletes a key from vdc_options if exists, for all its versions -create or replace FUNCTION fn_db_delete_config_value_all_versions(v_option_name varchar(100)) -returns void -AS $procedure$ -begin - if (exists (select 1 from vdc_options where option_name ilike v_option_name)) then - begin - delete from vdc_options where option_name ilike v_option_name; - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --- Deletes a key from vdc_options (if exists) -create or replace FUNCTION fn_db_delete_config_value(v_option_name varchar(100), v_version text) -returns void -AS $procedure$ -begin - if (exists (select 1 from vdc_options where option_name ilike v_option_name and version in (select ID from fnSplitter(v_version)))) then - begin - delete from vdc_options where option_name ilike v_option_name and version in (select ID from fnSplitter(v_version)); - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --- Deletes a key from vdc_options by version/versions(comma separated) -create or replace FUNCTION fn_db_delete_config_for_version(v_version text) -returns void -AS $procedure$ -BEGIN - delete from vdc_options where version in (select ID from fnSplitter(v_version)); -END; $procedure$ -LANGUAGE plpgsql; - --- Updates a value in vdc_options (if exists) -create or replace FUNCTION fn_db_update_config_value(v_option_name varchar(100), v_option_value varchar(4000), - v_version varchar(40)) -returns void -AS $procedure$ -begin - if (exists (select 1 from vdc_options where option_name ilike v_option_name and version = v_version)) then - begin - update vdc_options set option_value = v_option_value - where option_name ilike v_option_name and version = v_version; - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --- Updates a value in vdc_options (if exists) if default value wasn't changed -create or replace FUNCTION fn_db_update_default_config_value(v_option_name varchar(100),v_default_option_value varchar(4000),v_option_value varchar(4000),v_version varchar(40),v_ignore_default_value_case boolean) -returns void -AS $procedure$ -begin - if (exists (select 1 from vdc_options where option_name ilike v_option_name and version = v_version)) then - begin - if (v_ignore_default_value_case) - then - update vdc_options set option_value = v_option_value - where option_name ilike v_option_name and option_value ilike v_default_option_value and version = v_version; - else - update vdc_options set option_value = v_option_value - where option_name ilike v_option_name and option_value = v_default_option_value and version = v_version; - end if; - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - ---renames an existing config key name, custome option_value modifications are preserved -create or replace FUNCTION fn_db_rename_config_key(v_old_option_name varchar(100),v_new_option_name varchar(100),v_version varchar(40)) -returns void -AS $procedure$ -DECLARE - v_current_option_value varchar(4000); -begin - if (exists (select 1 from vdc_options where option_name ilike v_old_option_name and version = v_version)) then - v_current_option_value:=option_value from vdc_options where option_name ilike v_old_option_name and version = v_version; - update vdc_options set option_name = v_new_option_name, option_value = v_current_option_value - where option_name ilike v_old_option_name and version = v_version; - end if; -END; $procedure$ -LANGUAGE plpgsql; - - -create or replace function fn_db_create_constraint ( - v_table varchar(128), v_constraint varchar(128), v_constraint_sql text) -returns void -AS $procedure$ -begin - if NOT EXISTS (SELECT 1 from pg_constraint where conname ilike v_constraint) then - execute 'ALTER TABLE ' || v_table || ' ADD CONSTRAINT ' || v_constraint || ' ' || v_constraint_sql; - end if; -END; $procedure$ -LANGUAGE plpgsql; - -create or replace function fn_db_drop_constraint ( - v_table varchar(128), v_constraint varchar(128)) -returns void -AS $procedure$ -begin - if EXISTS (SELECT 1 from pg_constraint where conname ilike v_constraint) then - execute 'ALTER TABLE ' || v_table || ' DROP CONSTRAINT ' || v_constraint || ' CASCADE'; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --------------------------------------------------- --- End of DB helper functions --------------------------------------------------- - -CREATE OR REPLACE FUNCTION attach_user_to_su_role(v_permission_id uuid) - RETURNS void AS -$procedure$ - DECLARE - v_user_entry VARCHAR(255); - v_user_id UUID; - v_name VARCHAR(255); - v_domain VARCHAR(255); - v_user_name VARCHAR(255); - - v_document VARCHAR(64); - v_index INTEGER; -BEGIN - - select option_value INTO v_user_entry from vdc_options where option_name = 'AdUserId'; - select option_value INTO v_name from vdc_options where option_name = 'AdUserName'; - select option_value INTO v_domain from vdc_options where option_name = 'DomainName'; - - v_index := POSITION(':' IN v_user_entry); - if ( v_index <> 0 ) then - v_user_entry := substring( v_user_entry from v_index + 1 ); - v_user_id := CAST( v_user_entry AS uuid ); - end if; - - v_index := POSITION(':' IN v_name); - if ( v_index <> 0 ) then - v_name := substring( v_name from v_index + 1 ); - end if; - --- find if name already includes domain (@) - v_index := POSITION('@' IN v_name); - - if (v_index = 0) then - v_user_name := coalesce(v_name,'') || '@' || coalesce(v_domain,''); - else - v_user_name := v_name; - end if; - - -insert into users(user_id,name,domain,username,groups,status) select v_user_id, v_name, v_domain, v_user_name,'',1 where not exists (select user_id,name,domain,username,groups,status from users where user_id = v_user_id and name = v_name and domain = v_domain and username = v_user_name and groups = '' and status = 1); - -insert into permissions(id,role_id,ad_element_id,object_id,object_type_id) select v_permission_id, '00000000-0000-0000-0000-000000000001', v_user_id, getGlobalIds('system'), 1 where not exists(select role_id,ad_element_id,object_id,object_type_id from permissions where role_id = '00000000-0000-0000-0000-000000000001' and ad_element_id = v_user_id and object_id= getGlobalIds('system') and object_type_id = 1); -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION CheckDBConnection() RETURNS SETOF integer IMMUTABLE - AS $procedure$ -BEGIN - RETURN QUERY SELECT 1; -END; $procedure$ -LANGUAGE plpgsql; - -Create or replace FUNCTION generate_drop_all_functions_syntax() RETURNS SETOF text STABLE - AS $procedure$ -BEGIN -RETURN QUERY select 'drop function if exists ' || ns.nspname || '.' || proname || '(' || oidvectortypes(proargtypes) || ') cascade;' from pg_proc inner join pg_namespace ns on (pg_proc.pronamespace=ns.oid) where ns.nspname = 'public' and proname not ilike 'uuid%' order by proname; -END; $procedure$ -LANGUAGE plpgsql; - -Create or replace FUNCTION generate_drop_all_views_syntax() RETURNS SETOF text STABLE - AS $procedure$ -BEGIN -RETURN QUERY select 'DROP VIEW if exists ' || table_name || ' CASCADE;' from information_schema.views where table_schema = 'public' order by table_name; -END; $procedure$ -LANGUAGE plpgsql; - -Create or replace FUNCTION generate_drop_all_tables_syntax() RETURNS SETOF text STABLE - AS $procedure$ -BEGIN -RETURN QUERY select 'DROP TABLE if exists ' || table_name || ' CASCADE;' from information_schema.tables where table_schema = 'public' and table_type = 'BASE TABLE' order by table_name; -END; $procedure$ -LANGUAGE plpgsql; - -Create or replace FUNCTION generate_drop_all_seq_syntax() RETURNS SETOF text STABLE - AS $procedure$ -BEGIN -RETURN QUERY select 'DROP SEQUENCE if exists ' || sequence_name || ' CASCADE;' from information_schema.sequences where sequence_schema = 'public' order by sequence_name; -END; $procedure$ -LANGUAGE plpgsql; - -Create or replace FUNCTION fn_get_column_size( v_table varchar(64), v_column varchar(64)) returns integer STABLE - AS $procedure$ - declare - retvalue integer; -BEGIN - retvalue := character_maximum_length from information_schema.columns - where - table_name ilike v_table and column_name ilike v_column and - table_schema = 'public' and udt_name in ('char','varchar'); - return retvalue; -END; $procedure$ -LANGUAGE plpgsql; - - - -CREATE OR REPLACE FUNCTION attach_user_to_su_role(v_permission_id uuid, v_user_id VARCHAR(255), v_name VARCHAR(255), v_domain VARCHAR(255)) - RETURNS void AS -$BODY$ - DECLARE - v_user_name VARCHAR(255); - v_document VARCHAR(64); - v_index INTEGER; - input_uuid uuid; -BEGIN - input_uuid = CAST( v_user_id AS uuid ); --- find if name already includes domain (@) - v_index := POSITION('@' IN v_name); - - if (v_index = 0) then - v_user_name := coalesce(v_name,'') || '@' || coalesce(v_domain,''); - else - v_user_name := v_name; - end if; - - -insert into users(user_id,name,domain,username,groups,status) select input_uuid, v_name, v_domain, v_user_name,'',1 where not exists (select user_id,name,domain,username,groups,status from users where user_id = input_uuid); - -insert into permissions(id,role_id,ad_element_id,object_id,object_type_id) select v_permission_id, '00000000-0000-0000-0000-000000000001', input_uuid, getGlobalIds('system'), 1 where not exists(select role_id,ad_element_id,object_id,object_type_id from permissions where role_id = '00000000-0000-0000-0000-000000000001' and ad_element_id = input_uuid and object_id= getGlobalIds('system') and object_type_id = 1); -END; $BODY$ - -LANGUAGE plpgsql; - - --- a method for adding an action group to a role if doesn't exist -CREATE OR REPLACE FUNCTION fn_db_add_action_group_to_role(v_role_id UUID, v_action_group_id INTEGER) -RETURNS VOID -AS $procedure$ -BEGIN - INSERT INTO roles_groups(role_id,action_group_id) - SELECT v_role_id, v_action_group_id - WHERE NOT EXISTS (SELECT 1 - FROM roles_groups - WHERE role_id = v_role_id - AND action_group_id = v_action_group_id); -RETURN; -END; $procedure$ -LANGUAGE plpgsql; - - --- This function splits a config value: given a config value with one row for 'general', it creates new options --- with the old value, for each version, except the v_update_from_version version and beyond, which gets the input value -CREATE OR REPLACE FUNCTION fn_db_split_config_value(v_option_name character varying, v_old_option_value character varying, v_new_option_value character varying, v_update_from_version character varying) - RETURNS void AS -$BODY$ -declare -v_old_value varchar(4000); -v_cur cursor for select distinct version from vdc_options where version <> 'general' order by version; -v_version varchar(40); -v_index integer; -v_count integer; -v_total_count integer; -v_version_count integer; -begin - v_total_count := count(version) from vdc_options where option_name = v_option_name; - v_old_value := option_value from vdc_options where option_name = v_option_name and version = 'general'; - v_version_count := count(distinct version) from vdc_options where version <> 'general'; - if (v_total_count <= v_version_count) then - begin - if (v_old_value IS NULL) then - v_old_value := v_old_option_value; - end if; - v_count := count(distinct version) from vdc_options where version <> 'general'; - v_index := 1; - open v_cur; - loop - fetch v_cur into v_version; - exit when not found; - -- We shouldn't update if already exists - if (not exists (select 1 from vdc_options where option_name = v_option_name and version = v_version)) then - -- Might not work well for versions such as 3.10, but we currently don't have any - if (v_version >= v_update_from_version) then - insert into vdc_options (option_name, option_value, version) values (v_option_name, v_new_option_value, v_version); - else - insert into vdc_options (option_name, option_value, version) values (v_option_name, v_old_value, v_version); - end if; - end if; - v_index := v_index +1; - end loop; - close v_cur; - delete from vdc_options where option_name = v_option_name and version = 'general'; - end; - end if; -END; $BODY$ -LANGUAGE plpgsql; - --- Function: fn_db_grant_action_group_to_all_roles(integer) --- This function adds the input v_action_group_id to all the existing roles (both pre-defined and custom), besides the --- input roles to filter. -CREATE OR REPLACE FUNCTION fn_db_grant_action_group_to_all_roles_filter(v_action_group_id integer, uuid[]) - RETURNS void AS -$BODY$ -declare -v_role_id_to_filter alias for $2; -begin - insert into roles_groups (role_id, action_group_id) - select distinct role_id, v_action_group_id - from roles_groups rg - where not ARRAY [role_id] <@ v_role_id_to_filter and not exists (select 1 from roles_groups where role_id = rg.role_id and action_group_id = v_action_group_id); -END; $BODY$ -LANGUAGE plpgsql; - --- The following function accepts a table or view object --- Values of columns not matching the ones stored for this object in object_column_white_list table --- will be masked with an empty value. -CREATE OR REPLACE FUNCTION fn_db_mask_object(v_object regclass) RETURNS setof record as -$BODY$ -DECLARE - v_sql TEXT; - v_table record; - v_table_name TEXT; - temprec record; -BEGIN - -- get full table/view name from v_object (i.e <namespace>.<name>) - select c.relname, n.nspname INTO v_table - FROM pg_class c join pg_namespace n on c.relnamespace = n.oid WHERE c.oid = v_object; - -- try to get filtered query syntax from previous execution - if exists (select 1 from object_column_white_list_sql where object_name = v_table.relname) then - select sql into v_sql from object_column_white_list_sql where object_name = v_table.relname; - else - v_table_name := quote_ident( v_table.nspname ) || '.' || quote_ident( v_table.relname ); - -- compose sql statement while skipping values for columns not defined in object_column_white_list for this table. - for temprec in select a.attname, t.typname - FROM pg_attribute a join pg_type t on a.atttypid = t.oid - WHERE a.attrelid = v_object AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum - loop - v_sql := coalesce( v_sql || ', ', 'SELECT ' ); - if exists(select 1 from object_column_white_list - where object_name = v_table.relname and column_name = temprec.attname) then - v_sql := v_sql || quote_ident( temprec.attname ); - ELSE - v_sql := v_sql || 'NULL::' || quote_ident( temprec.typname ) || ' as ' || quote_ident( temprec.attname ); - END IF; - END LOOP; - v_sql := v_sql || ' FROM ' || v_table_name; - v_sql := 'SELECT x::' || v_table_name || ' as rec FROM (' || v_sql || ') as x'; - -- save generated query for further use - insert into object_column_white_list_sql(object_name,sql) values (v_table.relname, v_sql); - end if; - RETURN QUERY EXECUTE v_sql; -END; $BODY$ -LANGUAGE plpgsql; - --- Adds a table/view new added column to the white list -create or replace FUNCTION fn_db_add_column_to_object_white_list(v_object_name varchar(128), v_column_name varchar(128)) -returns void -AS $procedure$ -begin - if (not exists (select 1 from object_column_white_list - where object_name = v_object_name and column_name = v_column_name)) then - begin - -- verify that there is such object in db - if exists (select 1 from information_schema.columns - where table_name = v_object_name and column_name = v_column_name) then - insert into object_column_white_list (object_name, column_name) values (v_object_name, v_column_name); - end if; - end; - end if; -END; $procedure$ -LANGUAGE plpgsql; - --- Unlocks a specific disk -create or replace FUNCTION fn_db_unlock_disk(v_id UUID) -returns void -AS $procedure$ -declare - OK integer; - LOCKED integer; -begin - OK:=1; - LOCKED:=2; - update images set imagestatus = OK where imagestatus = LOCKED and - image_group_id in (select device_id from vm_device where device_id = v_id and is_plugged); -END; $procedure$ -LANGUAGE plpgsql; - --- Unlocks a specific snapshot -create or replace FUNCTION fn_db_unlock_snapshot(v_id UUID) -returns void -AS $procedure$ -declare - OK varchar; - LOCKED varchar; -begin - OK:='OK'; - LOCKED:='LOCKED'; - update snapshots set status = OK where status = LOCKED and snapshot_id = v_id; -END; $procedure$ -LANGUAGE plpgsql; - - --- Unlocks all VM/Template disks -create or replace FUNCTION fn_db_unlock_entity(v_object_type varchar(10), v_name varchar(255), v_recursive boolean) -returns void -AS $procedure$ -declare - DOWN integer; - OK integer; - LOCKED integer; - TEMPLATE_OK integer; - TEMPLATE_LOCKED integer; - IMAGE_LOCKED integer; - SNAPSHOT_OK varchar; - SNAPSHOT_LOCKED varchar; - v_id UUID; -begin - DOWN:=0; - OK:=1; - LOCKED:=2; - TEMPLATE_OK:=0; - TEMPLATE_LOCKED:=1; - IMAGE_LOCKED:=15; - SNAPSHOT_OK:='OK'; - SNAPSHOT_LOCKED:='LOCKED'; - v_id := vm_guid from vm_static where vm_name = v_name and entity_type ilike v_object_type; - -- set VM status to DOWN - if (v_object_type = 'vm') then - update vm_dynamic set status = DOWN where status = IMAGE_LOCKED and vm_guid = v_id; - -- set Template status to OK - else - if (v_object_type = 'template') then - update vm_static set template_status = TEMPLATE_OK where template_status = TEMPLATE_LOCKED and vm_guid = v_id; - end if; - end if; - --unlock images and snapshots if recursive flag is set - if (v_recursive) then - update images set imagestatus = OK where imagestatus = LOCKED and - image_group_id in (select device_id from vm_device where vm_id = v_id and is_plugged); - - update snapshots set status = SNAPSHOT_OK where status ilike SNAPSHOT_LOCKED and vm_id = v_id; - end if; -END; $procedure$ -LANGUAGE plpgsql; - -/* Displays DC id , DC name, SPM Host id , SPM Host name and number of async tasks awaiting. - -1) create a record type with DC name, DC id, SPM host id, SPM host name, count - -2) get all distinct DC ids from async_tasks table - -3) Run a cursor for each result in 2) - - a) get DC name - b) get SPM Host id & name if available - c) get count of tasks - - return current record - -4) return set of generated records -*/ - -DROP TYPE IF EXISTS async_tasks_info_rs CASCADE; -CREATE TYPE async_tasks_info_rs AS ( - dc_id UUID, dc_name CHARACTER VARYING, spm_host_id UUID, spm_host_name CHARACTER VARYING, task_count integer); - - -create or replace FUNCTION fn_db_get_async_tasks() -returns SETOF async_tasks_info_rs STABLE -AS $procedure$ -DECLARE - v_record async_tasks_info_rs; - - -- selects storage_pool_id uuid found in async_tasks - v_tasks_cursor cursor for select distinct storage_pool_id from async_tasks; -begin - - OPEN v_tasks_cursor; - FETCH v_tasks_cursor into v_record.dc_id; - WHILE FOUND LOOP - -- get dc_name and SPM Host id - v_record.dc_name := name from storage_pool where id = v_record.dc_id; - v_record.spm_host_id := - spm_vds_id from storage_pool where id = v_record.dc_id; - -- get Host name if we have non NULL SPM Host - if (v_record.spm_host_id IS NOT NULL) then - v_record.spm_host_name := - vds_name from vds_static where vds_id = v_record.spm_host_id; - else - v_record.spm_host_name:=''; - end if; - -- get tasks count for this DC - v_record.task_count := count(*) from async_tasks - where position (cast(v_record.dc_id as varchar) in action_parameters) > 0; - -- return the record - RETURN NEXT v_record; - FETCH v_tasks_cursor into v_record.dc_id; - END LOOP; - CLOSE v_tasks_cursor; - -- return full set of generated records - RETURN; -END; $procedure$ -LANGUAGE plpgsql; +-------------------------------------------------- +-- DB helper functions +-------------------------------------------------- + +-- Creates a column in the given table (if not exists) +Create or replace FUNCTION fn_db_add_column(v_table varchar(128), v_column varchar(128), v_column_def text) +returns void +AS $procedure$ +declare +v_sql text; + +begin + if (not exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column)) then + begin + v_sql := 'ALTER TABLE ' || v_table || ' ADD COLUMN ' || v_column || ' ' || v_column_def; + EXECUTE v_sql; + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-- delete a column from a table and all its dependencied +Create or replace FUNCTION fn_db_drop_column(v_table varchar(128), v_column varchar(128)) +returns void +AS $procedure$ +declare +v_sql text; +begin + if (exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column)) then + begin + v_sql := 'ALTER TABLE ' || v_table || ' DROP COLUMN ' || v_column; + EXECUTE v_sql; + end; + end if; +end;$procedure$ +LANGUAGE plpgsql; + +-- Changes a column data type (if value conversion is supported) +Create or replace FUNCTION fn_db_change_column_type(v_table varchar(128), v_column varchar(128), + v_type varchar(128), v_new_type varchar(128)) +returns void +AS $procedure$ +declare +v_sql text; + +begin + if (exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column and (udt_name ilike v_type or data_type ilike v_type))) then + begin + v_sql := 'ALTER TABLE ' || v_table || ' ALTER COLUMN ' || v_column || ' TYPE ' || v_new_type; + EXECUTE v_sql; + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-- rename a column for a given table +Create or replace FUNCTION fn_db_rename_column(v_table varchar(128), v_column varchar(128), v_new_name varchar(128)) +returns void +AS $procedure$ +declare +v_sql text; + +begin + if (exists (select 1 from information_schema.columns where table_name ilike v_table and column_name ilike v_column)) then + begin + v_sql := 'ALTER TABLE ' || v_table || ' RENAME COLUMN ' || v_column || ' TO ' || v_new_name; + EXECUTE v_sql; + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + + + +-- Adds a value to vdc_options (if not exists) +create or replace FUNCTION fn_db_add_config_value(v_option_name varchar(100), v_option_value varchar(4000), + v_version varchar(40)) +returns void +AS $procedure$ +begin + if (not exists (select 1 from vdc_options where option_name ilike v_option_name and version = v_version)) then + begin + insert into vdc_options (option_name, option_value, version) values (v_option_name, v_option_value, v_version); + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-- Deletes a key from vdc_options if exists, for all its versions +create or replace FUNCTION fn_db_delete_config_value_all_versions(v_option_name varchar(100)) +returns void +AS $procedure$ +begin + if (exists (select 1 from vdc_options where option_name ilike v_option_name)) then + begin + delete from vdc_options where option_name ilike v_option_name; + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-- Deletes a key from vdc_options (if exists) +create or replace FUNCTION fn_db_delete_config_value(v_option_name varchar(100), v_version text) +returns void +AS $procedure$ +begin + if (exists (select 1 from vdc_options where option_name ilike v_option_name and version in (select ID from fnSplitter(v_version)))) then + begin + delete from vdc_options where option_name ilike v_option_name and version in (select ID from fnSplitter(v_version)); + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-- Deletes a key from vdc_options by version/versions(comma separated) +create or replace FUNCTION fn_db_delete_config_for_version(v_version text) +returns void +AS $procedure$ +BEGIN + delete from vdc_options where version in (select ID from fnSplitter(v_version)); +END; $procedure$ +LANGUAGE plpgsql; + +-- Updates a value in vdc_options (if exists) +create or replace FUNCTION fn_db_update_config_value(v_option_name varchar(100), v_option_value varchar(4000), + v_version varchar(40)) +returns void +AS $procedure$ +begin + if (exists (select 1 from vdc_options where option_name ilike v_option_name and version = v_version)) then + begin + update vdc_options set option_value = v_option_value + where option_name ilike v_option_name and version = v_version; + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-- Updates a value in vdc_options (if exists) if default value wasn't changed +create or replace FUNCTION fn_db_update_default_config_value(v_option_name varchar(100),v_default_option_value varchar(4000),v_option_value varchar(4000),v_version varchar(40),v_ignore_default_value_case boolean) +returns void +AS $procedure$ +begin + if (exists (select 1 from vdc_options where option_name ilike v_option_name and version = v_version)) then + begin + if (v_ignore_default_value_case) + then + update vdc_options set option_value = v_option_value + where option_name ilike v_option_name and option_value ilike v_default_option_value and version = v_version; + else + update vdc_options set option_value = v_option_value + where option_name ilike v_option_name and option_value = v_default_option_value and version = v_version; + end if; + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +--renames an existing config key name, custome option_value modifications are preserved +create or replace FUNCTION fn_db_rename_config_key(v_old_option_name varchar(100),v_new_option_name varchar(100),v_version varchar(40)) +returns void +AS $procedure$ +DECLARE + v_current_option_value varchar(4000); +begin + if (exists (select 1 from vdc_options where option_name ilike v_old_option_name and version = v_version)) then + v_current_option_value:=option_value from vdc_options where option_name ilike v_old_option_name and version = v_version; + update vdc_options set option_name = v_new_option_name, option_value = v_current_option_value + where option_name ilike v_old_option_name and version = v_version; + end if; +END; $procedure$ +LANGUAGE plpgsql; + + +create or replace function fn_db_create_constraint ( + v_table varchar(128), v_constraint varchar(128), v_constraint_sql text) +returns void +AS $procedure$ +begin + if NOT EXISTS (SELECT 1 from pg_constraint where conname ilike v_constraint) then + execute 'ALTER TABLE ' || v_table || ' ADD CONSTRAINT ' || v_constraint || ' ' || v_constraint_sql; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +create or replace function fn_db_drop_constraint ( + v_table varchar(128), v_constraint varchar(128)) +returns void +AS $procedure$ +begin + if EXISTS (SELECT 1 from pg_constraint where conname ilike v_constraint) then + execute 'ALTER TABLE ' || v_table || ' DROP CONSTRAINT ' || v_constraint || ' CASCADE'; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-------------------------------------------------- +-- End of DB helper functions +-------------------------------------------------- + +CREATE OR REPLACE FUNCTION attach_user_to_su_role(v_permission_id uuid) + RETURNS void AS +$procedure$ + DECLARE + v_user_entry VARCHAR(255); + v_user_id UUID; + v_name VARCHAR(255); + v_domain VARCHAR(255); + v_user_name VARCHAR(255); + + v_document VARCHAR(64); + v_index INTEGER; +BEGIN + + select option_value INTO v_user_entry from vdc_options where option_name = 'AdUserId'; + select option_value INTO v_name from vdc_options where option_name = 'AdUserName'; + select option_value INTO v_domain from vdc_options where option_name = 'DomainName'; + + v_index := POSITION(':' IN v_user_entry); + if ( v_index <> 0 ) then + v_user_entry := substring( v_user_entry from v_index + 1 ); + v_user_id := CAST( v_user_entry AS uuid ); + end if; + + v_index := POSITION(':' IN v_name); + if ( v_index <> 0 ) then + v_name := substring( v_name from v_index + 1 ); + end if; + +-- find if name already includes domain (@) + v_index := POSITION('@' IN v_name); + + if (v_index = 0) then + v_user_name := coalesce(v_name,'') || '@' || coalesce(v_domain,''); + else + v_user_name := v_name; + end if; + + +insert into users(user_id,name,domain,username,groups,status) select v_user_id, v_name, v_domain, v_user_name,'',1 where not exists (select user_id,name,domain,username,groups,status from users where user_id = v_user_id and name = v_name and domain = v_domain and username = v_user_name and groups = '' and status = 1); + +insert into permissions(id,role_id,ad_element_id,object_id,object_type_id) select v_permission_id, '00000000-0000-0000-0000-000000000001', v_user_id, getGlobalIds('system'), 1 where not exists(select role_id,ad_element_id,object_id,object_type_id from permissions where role_id = '00000000-0000-0000-0000-000000000001' and ad_element_id = v_user_id and object_id= getGlobalIds('system') and object_type_id = 1); +END; $procedure$ +LANGUAGE plpgsql; + + + + + +Create or replace FUNCTION CheckDBConnection() RETURNS SETOF integer IMMUTABLE + AS $procedure$ +BEGIN + RETURN QUERY SELECT 1; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION generate_drop_all_functions_syntax() RETURNS SETOF text STABLE + AS $procedure$ +BEGIN +RETURN QUERY select 'drop function if exists ' || ns.nspname || '.' || proname || '(' || oidvectortypes(proargtypes) || ') cascade;' from pg_proc inner join pg_namespace ns on (pg_proc.pronamespace=ns.oid) where ns.nspname = 'public' and proname not ilike 'uuid%' order by proname; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION generate_drop_all_views_syntax() RETURNS SETOF text STABLE + AS $procedure$ +BEGIN +RETURN QUERY select 'DROP VIEW if exists ' || table_name || ' CASCADE;' from information_schema.views where table_schema = 'public' order by table_name; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION generate_drop_all_tables_syntax() RETURNS SETOF text STABLE + AS $procedure$ +BEGIN +RETURN QUERY select 'DROP TABLE if exists ' || table_name || ' CASCADE;' from information_schema.tables where table_schema = 'public' and table_type = 'BASE TABLE' order by table_name; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION generate_drop_all_seq_syntax() RETURNS SETOF text STABLE + AS $procedure$ +BEGIN +RETURN QUERY select 'DROP SEQUENCE if exists ' || sequence_name || ' CASCADE;' from information_schema.sequences where sequence_schema = 'public' order by sequence_name; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION fn_get_column_size( v_table varchar(64), v_column varchar(64)) returns integer STABLE + AS $procedure$ + declare + retvalue integer; +BEGIN + retvalue := character_maximum_length from information_schema.columns + where + table_name ilike v_table and column_name ilike v_column and + table_schema = 'public' and udt_name in ('char','varchar'); + return retvalue; +END; $procedure$ +LANGUAGE plpgsql; + + + +CREATE OR REPLACE FUNCTION attach_user_to_su_role(v_permission_id uuid, v_user_id VARCHAR(255), v_name VARCHAR(255), v_domain VARCHAR(255)) + RETURNS void AS +$BODY$ + DECLARE + v_user_name VARCHAR(255); + v_document VARCHAR(64); + v_index INTEGER; + input_uuid uuid; +BEGIN + input_uuid = CAST( v_user_id AS uuid ); +-- find if name already includes domain (@) + v_index := POSITION('@' IN v_name); + + if (v_index = 0) then + v_user_name := coalesce(v_name,'') || '@' || coalesce(v_domain,''); + else + v_user_name := v_name; + end if; + + +insert into users(user_id,name,domain,username,groups,status) select input_uuid, v_name, v_domain, v_user_name,'',1 where not exists (select user_id,name,domain,username,groups,status from users where user_id = input_uuid); + +insert into permissions(id,role_id,ad_element_id,object_id,object_type_id) select v_permission_id, '00000000-0000-0000-0000-000000000001', input_uuid, getGlobalIds('system'), 1 where not exists(select role_id,ad_element_id,object_id,object_type_id from permissions where role_id = '00000000-0000-0000-0000-000000000001' and ad_element_id = input_uuid and object_id= getGlobalIds('system') and object_type_id = 1); +END; $BODY$ + +LANGUAGE plpgsql; + + +-- a method for adding an action group to a role if doesn't exist +CREATE OR REPLACE FUNCTION fn_db_add_action_group_to_role(v_role_id UUID, v_action_group_id INTEGER) +RETURNS VOID +AS $procedure$ +BEGIN + INSERT INTO roles_groups(role_id,action_group_id) + SELECT v_role_id, v_action_group_id + WHERE NOT EXISTS (SELECT 1 + FROM roles_groups + WHERE role_id = v_role_id + AND action_group_id = v_action_group_id); +RETURN; +END; $procedure$ +LANGUAGE plpgsql; + + +-- This function splits a config value: given a config value with one row for 'general', it creates new options +-- with the old value, for each version, except the v_update_from_version version and beyond, which gets the input value +CREATE OR REPLACE FUNCTION fn_db_split_config_value(v_option_name character varying, v_old_option_value character varying, v_new_option_value character varying, v_update_from_version character varying) + RETURNS void AS +$BODY$ +declare +v_old_value varchar(4000); +v_cur cursor for select distinct version from vdc_options where version <> 'general' order by version; +v_version varchar(40); +v_index integer; +v_count integer; +v_total_count integer; +v_version_count integer; +begin + v_total_count := count(version) from vdc_options where option_name = v_option_name; + v_old_value := option_value from vdc_options where option_name = v_option_name and version = 'general'; + v_version_count := count(distinct version) from vdc_options where version <> 'general'; + if (v_total_count <= v_version_count) then + begin + if (v_old_value IS NULL) then + v_old_value := v_old_option_value; + end if; + v_count := count(distinct version) from vdc_options where version <> 'general'; + v_index := 1; + open v_cur; + loop + fetch v_cur into v_version; + exit when not found; + -- We shouldn't update if already exists + if (not exists (select 1 from vdc_options where option_name = v_option_name and version = v_version)) then + -- Might not work well for versions such as 3.10, but we currently don't have any + if (v_version >= v_update_from_version) then + insert into vdc_options (option_name, option_value, version) values (v_option_name, v_new_option_value, v_version); + else + insert into vdc_options (option_name, option_value, version) values (v_option_name, v_old_value, v_version); + end if; + end if; + v_index := v_index +1; + end loop; + close v_cur; + delete from vdc_options where option_name = v_option_name and version = 'general'; + end; + end if; +END; $BODY$ +LANGUAGE plpgsql; + +-- Function: fn_db_grant_action_group_to_all_roles(integer) +-- This function adds the input v_action_group_id to all the existing roles (both pre-defined and custom), besides the +-- input roles to filter. +CREATE OR REPLACE FUNCTION fn_db_grant_action_group_to_all_roles_filter(v_action_group_id integer, uuid[]) + RETURNS void AS +$BODY$ +declare +v_role_id_to_filter alias for $2; +begin + insert into roles_groups (role_id, action_group_id) + select distinct role_id, v_action_group_id + from roles_groups rg + where not ARRAY [role_id] <@ v_role_id_to_filter and not exists (select 1 from roles_groups where role_id = rg.role_id and action_group_id = v_action_group_id); +END; $BODY$ +LANGUAGE plpgsql; + +-- The following function accepts a table or view object +-- Values of columns not matching the ones stored for this object in object_column_white_list table +-- will be masked with an empty value. +CREATE OR REPLACE FUNCTION fn_db_mask_object(v_object regclass) RETURNS setof record as +$BODY$ +DECLARE + v_sql TEXT; + v_table record; + v_table_name TEXT; + temprec record; +BEGIN + -- get full table/view name from v_object (i.e <namespace>.<name>) + select c.relname, n.nspname INTO v_table + FROM pg_class c join pg_namespace n on c.relnamespace = n.oid WHERE c.oid = v_object; + -- try to get filtered query syntax from previous execution + if exists (select 1 from object_column_white_list_sql where object_name = v_table.relname) then + select sql into v_sql from object_column_white_list_sql where object_name = v_table.relname; + else + v_table_name := quote_ident( v_table.nspname ) || '.' || quote_ident( v_table.relname ); + -- compose sql statement while skipping values for columns not defined in object_column_white_list for this table. + for temprec in select a.attname, t.typname + FROM pg_attribute a join pg_type t on a.atttypid = t.oid + WHERE a.attrelid = v_object AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum + loop + v_sql := coalesce( v_sql || ', ', 'SELECT ' ); + if exists(select 1 from object_column_white_list + where object_name = v_table.relname and column_name = temprec.attname) then + v_sql := v_sql || quote_ident( temprec.attname ); + ELSE + v_sql := v_sql || 'NULL::' || quote_ident( temprec.typname ) || ' as ' || quote_ident( temprec.attname ); + END IF; + END LOOP; + v_sql := v_sql || ' FROM ' || v_table_name; + v_sql := 'SELECT x::' || v_table_name || ' as rec FROM (' || v_sql || ') as x'; + -- save generated query for further use + insert into object_column_white_list_sql(object_name,sql) values (v_table.relname, v_sql); + end if; + RETURN QUERY EXECUTE v_sql; +END; $BODY$ +LANGUAGE plpgsql; + +-- Adds a table/view new added column to the white list +create or replace FUNCTION fn_db_add_column_to_object_white_list(v_object_name varchar(128), v_column_name varchar(128)) +returns void +AS $procedure$ +begin + if (not exists (select 1 from object_column_white_list + where object_name = v_object_name and column_name = v_column_name)) then + begin + -- verify that there is such object in db + if exists (select 1 from information_schema.columns + where table_name = v_object_name and column_name = v_column_name) then + insert into object_column_white_list (object_name, column_name) values (v_object_name, v_column_name); + end if; + end; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +-- Unlocks a specific disk +create or replace FUNCTION fn_db_unlock_disk(v_id UUID) +returns void +AS $procedure$ +declare + OK integer; + LOCKED integer; +begin + OK:=1; + LOCKED:=2; + update images set imagestatus = OK where imagestatus = LOCKED and + image_group_id in (select device_id from vm_device where device_id = v_id and is_plugged); +END; $procedure$ +LANGUAGE plpgsql; + +-- Unlocks a specific snapshot +create or replace FUNCTION fn_db_unlock_snapshot(v_id UUID) +returns void +AS $procedure$ +declare + OK varchar; + LOCKED varchar; +begin + OK:='OK'; + LOCKED:='LOCKED'; + update snapshots set status = OK where status = LOCKED and snapshot_id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + + +-- Unlocks all VM/Template disks +create or replace FUNCTION fn_db_unlock_entity(v_object_type varchar(10), v_name varchar(255), v_recursive boolean) +returns void +AS $procedure$ +declare + DOWN integer; + OK integer; + LOCKED integer; + TEMPLATE_OK integer; + TEMPLATE_LOCKED integer; + IMAGE_LOCKED integer; + SNAPSHOT_OK varchar; + SNAPSHOT_LOCKED varchar; + v_id UUID; +begin + DOWN:=0; + OK:=1; + LOCKED:=2; + TEMPLATE_OK:=0; + TEMPLATE_LOCKED:=1; + IMAGE_LOCKED:=15; + SNAPSHOT_OK:='OK'; + SNAPSHOT_LOCKED:='LOCKED'; + v_id := vm_guid from vm_static where vm_name = v_name and entity_type ilike v_object_type; + -- set VM status to DOWN + if (v_object_type = 'vm') then + update vm_dynamic set status = DOWN where status = IMAGE_LOCKED and vm_guid = v_id; + -- set Template status to OK + else + if (v_object_type = 'template') then + update vm_static set template_status = TEMPLATE_OK where template_status = TEMPLATE_LOCKED and vm_guid = v_id; + end if; + end if; + --unlock images and snapshots if recursive flag is set + if (v_recursive) then + update images set imagestatus = OK where imagestatus = LOCKED and + image_group_id in (select device_id from vm_device where vm_id = v_id and is_plugged); + + update snapshots set status = SNAPSHOT_OK where status ilike SNAPSHOT_LOCKED and vm_id = v_id; + end if; +END; $procedure$ +LANGUAGE plpgsql; + +/* Displays DC id , DC name, SPM Host id , SPM Host name and number of async tasks awaiting. + +1) create a record type with DC name, DC id, SPM host id, SPM host name, count + +2) get all distinct DC ids from async_tasks table + +3) Run a cursor for each result in 2) + + a) get DC name + b) get SPM Host id & name if available + c) get count of tasks + + return current record + +4) return set of generated records +*/ + +DROP TYPE IF EXISTS async_tasks_info_rs CASCADE; +CREATE TYPE async_tasks_info_rs AS ( + dc_id UUID, dc_name CHARACTER VARYING, spm_host_id UUID, spm_host_name CHARACTER VARYING, task_count integer); + + +create or replace FUNCTION fn_db_get_async_tasks() +returns SETOF async_tasks_info_rs STABLE +AS $procedure$ +DECLARE + v_record async_tasks_info_rs; + + -- selects storage_pool_id uuid found in async_tasks + v_tasks_cursor cursor for select distinct storage_pool_id from async_tasks; +begin + + OPEN v_tasks_cursor; + FETCH v_tasks_cursor into v_record.dc_id; + WHILE FOUND LOOP + -- get dc_name and SPM Host id + v_record.dc_name := name from storage_pool where id = v_record.dc_id; + v_record.spm_host_id := + spm_vds_id from storage_pool where id = v_record.dc_id; + -- get Host name if we have non NULL SPM Host + if (v_record.spm_host_id IS NOT NULL) then + v_record.spm_host_name := + vds_name from vds_static where vds_id = v_record.spm_host_id; + else + v_record.spm_host_name:=''; + end if; + -- get tasks count for this DC + v_record.task_count := count(*) from async_tasks + where position (cast(v_record.dc_id as varchar) in action_parameters) > 0; + -- return the record + RETURN NEXT v_record; + FETCH v_tasks_cursor into v_record.dc_id; + END LOOP; + CLOSE v_tasks_cursor; + -- return full set of generated records + RETURN; +END; $procedure$ +LANGUAGE plpgsql; -- To view, visit http://gerrit.ovirt.org/25248 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I11129940f2b364248b8a71ab1215d1db6985e00f Gerrit-PatchSet: 1 Gerrit-Project: ovirt-dwh Gerrit-Branch: master Gerrit-Owner: Alon Bar-Lev <alo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches