--- /dev/null
+require 'digest/md5'
+
+module Puppet::Parser::Functions
+ newfunction(:postgresql_escape, :type => :rvalue, :doc => <<-EOS
+ Safely escapes a string using $$ using a random tag which should be consistent
+ EOS
+ ) do |args|
+
+ raise(Puppet::ParseError, "postgresql_escape(): Wrong number of arguments " +
+ "given (#{args.size} for 1)") if args.size != 1
+
+ password = args[0]
+
+ if password !~ /\$\$/ and password[-1] != '$'
+ retval = "$$#{password}$$"
+ else
+ escape = Digest::MD5.hexdigest(password)[0..5].gsub(/\d/,'')
+ until password !~ /#{escape}/
+ escape = Digest::MD5.hexdigest(escape)[0..5].gsub(/\d/,'')
+ end
+ retval = "$#{escape}$#{password}$#{escape}$"
+ end
+ retval
+ end
+end