Index: openacs-4/packages/ref-timezones/ref-timezones.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ref-timezones/ref-timezones.info,v diff -u -r1.39 -r1.40 --- openacs-4/packages/ref-timezones/ref-timezones.info 7 Aug 2017 23:48:13 -0000 1.39 +++ openacs-4/packages/ref-timezones/ref-timezones.info 19 Aug 2018 10:59:34 -0000 1.40 @@ -7,15 +7,15 @@ t t - + Jon Griffin Timezone data for acs-reference. 2017-08-06 3 Mayuli Enterprises, LLC This is the timezone data for the acs-reference data package. Used by acs-lang (among others) for localized times. - + Index: openacs-4/packages/ref-timezones/sql/postgresql/upgrade/upgrade-5.10.0d1-5.10.0d2.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ref-timezones/sql/postgresql/upgrade/upgrade-5.10.0d1-5.10.0d2.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/ref-timezones/sql/postgresql/upgrade/upgrade-5.10.0d1-5.10.0d2.sql 19 Aug 2018 10:59:34 -0000 1.1 @@ -0,0 +1,307 @@ +-- added +select define_function_args('timezone__add_rule','tz,abbrev,isdst_p,gmt_offset,utc_start,utc_end,local_start,local_end'); + +-- +-- procedure timezone__add_rule/8 +-- +CREATE OR REPLACE FUNCTION timezone__add_rule( + p_tz varchar, + p_abbrev varchar, + p_isdst_p integer, + p_gmt_offset varchar, + p_utc_start varchar, + p_utc_end varchar, + p_local_start varchar, + p_local_end varchar +) RETURNS integer AS $$ +DECLARE +BEGIN + insert into timezone_rules + (tz_id, abbrev, utc_start, utc_end, local_start, local_end, gmt_offset, isdst_p) + select timezone__get_id(p_tz), p_abbrev, rdbms_date(p_utc_start), + rdbms_date(p_utc_end), rdbms_date(p_local_start), + to_date(p_local_end), + p_gmt_offset, + case p_isdst_p when 0 then 'f' else 't'end; +END; +$$ LANGUAGE plpgsql; + + + +-- added +select define_function_args('timezone__convert_to_local','tz_id,utc_varchar'); + +-- +-- procedure timezone__convert_to_local/2 +-- +CREATE OR REPLACE FUNCTION timezone__convert_to_local( + p_tz_id integer, + p_utc_varchar varchar +) RETURNS timestamptz AS $$ +DECLARE + v_base_time timestamptz; +BEGIN + + select "timestamptz" (p_utc_varchar || substr(gmt_offset,1,5)) into v_base_time + from timezones + where tz_id = p_tz_id; + + if not found then + return "timestamptz" (p_utc_varchar || '+00'); + end if; + + return "timestamptz" (p_utc_varchar) + "interval" (gmt_offset || 'seconds') + from timezone_rules + where tz_id = p_tz_id and v_base_time between utc_start and utc_end; + +END; +$$ LANGUAGE plpgsql stable; + + +-- added +select define_function_args('timezone__convert_to_utc','tz_id,local_varchar'); + +-- +-- procedure timezone__convert_to_utc/2 +-- +CREATE OR REPLACE FUNCTION timezone__convert_to_utc( + p_tz_id integer, + p_local_varchar varchar +) RETURNS timestamptz AS $$ +DECLARE + v_base_time timestamptz; +BEGIN + + select "timestamptz" (p_local_varchar || substr(gmt_offset,1,5)) into v_base_time + from timezones + where tz_id = p_tz_id; + + if not found then + return "timestamptz" (p_local_varchar || '+00'); + end if; + + return "timestamptz" (p_local_varchar) - "interval" (gmt_offset || 'seconds') + from timezone_rules + where tz_id = p_tz_id and v_base_time between utc_start and utc_end; + +END; +$$ LANGUAGE plpgsql; + + + +-- added +select define_function_args('timezone__delete','tz_id'); + +-- +-- procedure timezone__delete/1 +-- +CREATE OR REPLACE FUNCTION timezone__delete( + p_tz_id integer +) RETURNS integer AS $$ +DECLARE +BEGIN + delete from timezone_rules where tz_id = p_tz_id; + delete from timezones where tz_id = p_tz_id; + return 0; +END; +$$ LANGUAGE plpgsql; + + +-- added +select define_function_args('timezone__get_abbrev','tz_id,time'); + +-- +-- procedure timezone__get_abbrev/2 +-- +CREATE OR REPLACE FUNCTION timezone__get_abbrev( + p_tz_id integer, + p_time timestamptz +) RETURNS varchar AS $$ +DECLARE + v_abbrev timezone_rules.abbrev%TYPE; +BEGIN + v_abbrev := 'GMT'; + + select abbrev into v_abbrev + from timezone_rules + where tz_id = p_tz_id and p_time between local_start and local_end; + + return v_abbrev; +END; +$$ LANGUAGE plpgsql stable; + + +-- added +select define_function_args('timezone__get_date','tz_id,timestamp,format,append_timezone_p'); + +-- +-- procedure timezone__get_date/4 +-- +CREATE OR REPLACE FUNCTION timezone__get_date( + p_tz_id integer, + p_timestamp timestamptz, + p_format varchar, + p_append_timezone_p boolean +) RETURNS varchar AS $$ +DECLARE + v_timestamp timestamptz; + v_abbrev text; + v_date text; +BEGIN + + v_abbrev := ''; + if p_append_timezone_p then + select abbrev into v_abbrev + from timezone_rules + where tz_id = p_tz_id and p_timestamp between utc_start and utc_end; + end if; + + select to_char(p_timestamp + "interval" ( + (extract(timezone_hour from p_timestamp) * 3600 + extract(timezone_minute from p_timestamp) * 60) || 'seconds') + + "interval" (gmt_offset || 'seconds'), p_format) || ' ' || v_abbrev + into v_date + from timezone_rules + where tz_id = p_tz_id and p_timestamp between utc_start and utc_end; + + if not found then + select to_char(p_timestamp + "interval" ((extract(timezone_hour from p_timestamp) * 3600 + extract(timezone_minute from p_timestamp) * 60) || 'seconds'), p_format) + into v_date; + end if; + + return v_date; + +END; +$$ LANGUAGE plpgsql stable; + + +-- added +select define_function_args('timezone__get_id','tz'); + +-- +-- procedure timezone__get_id/1 +-- +CREATE OR REPLACE FUNCTION timezone__get_id( + p_tz varchar +) RETURNS integer AS $$ +DECLARE + v_tz_id integer; +BEGIN + + return tz_id + from timezones + where tz = p_tz; + +END; +$$ LANGUAGE plpgsql stable strict; + +-- added +select define_function_args('timezone__get_offset','tz_id,time'); + +-- +-- procedure timezone__get_offset/2 +-- +CREATE OR REPLACE FUNCTION timezone__get_offset( + p_tz_id integer, + p_time timestamptz +) RETURNS interval AS $$ +DECLARE + v_offset integer; +BEGIN + v_offset := '0'; + + select gmt_offset into v_offset + from timezone_rules + where tz_id = p_tz_id and p_time between utc_start and utc_end; + + return "interval" (v_offset || 'seconds'); +END; +$$ LANGUAGE plpgsql stable; + + + +-- added +select define_function_args('timezone__get_rawoffset','tz_id,time'); + +-- +-- procedure timezone__get_rawoffset/2 +-- +CREATE OR REPLACE FUNCTION timezone__get_rawoffset( + p_tz_id integer, + p_time timestamptz +) RETURNS interval AS $$ +DECLARE + v_offset varchar; +BEGIN + v_offset := '0'; + + select + case isdst_p + when 't' then "interval" (gmt_offset || 'seconds') - '3600 seconds' + else "interval" (gmt_offset || 'seconds') + end + into v_offset + from timezone_rules + where tz_id = p_tz_id and p_time between utc_start and utc_end; + + return v_offset; +END; +$$ LANGUAGE plpgsql stable; + +-- added +select define_function_args('timezone__isdst_p','tz_id,time'); + +-- +-- procedure timezone__isdst_p/2 +-- +CREATE OR REPLACE FUNCTION timezone__isdst_p( + p_tz_id integer, + p_time timestamptz +) RETURNS boolean AS $$ +DECLARE + v_isdst_p boolean; +BEGIN + v_isdst_p := 'f'; + + select isdst_p into v_isdst_p + from timezone_rules + where tz_id = p_tz_id and p_time between local_start and local_end; + + return v_isdst_p; +END; +$$ LANGUAGE plpgsql stable; + +-- added +select define_function_args('timezone__new','tz,gmt_offset'); + +-- +-- procedure timezone__new/2 +-- +CREATE OR REPLACE FUNCTION timezone__new( + p_tz varchar, + p_gmt_offset varchar +) RETURNS integer AS $$ +DECLARE +BEGIN + insert into timezones + (tz_id, tz, gmt_offset) + values + (nextval('timezone_seq'), p_tz, gmt_offset); + return 0; +END; +$$ LANGUAGE plpgsql; + + +-- added +select define_function_args('rdbms_date','raw_date'); + +-- +-- procedure rdbms_date/1 +-- +CREATE OR REPLACE FUNCTION rdbms_date( + p_raw_date varchar +) RETURNS timestamptz AS $$ +DECLARE +BEGIN + return "timestamptz" (p_raw_date || '+00'); +END; +$$ LANGUAGE plpgsql stable strict;