mirror of
https://github.com/djhackersdev/minime.git
synced 2026-03-22 02:04:19 -05:00
82 lines
1.8 KiB
PL/PgSQL
82 lines
1.8 KiB
PL/PgSQL
-- Helper functions which might be useful in one-off queries.
|
|
-- These are not utilised by any services; those have their own ID generators.
|
|
|
|
create or replace function idnum(
|
|
str text)
|
|
returns bigint as $$
|
|
declare
|
|
num bigint;
|
|
x integer;
|
|
begin
|
|
num := 0;
|
|
|
|
for i in 1..11 loop
|
|
x := ascii(substr(str, i, 1));
|
|
num := num << 6;
|
|
|
|
if x >= 65 and x <= 90 then
|
|
-- A to Z
|
|
num = num | (x - 65);
|
|
elsif x >= 97 and x <= 122 then
|
|
-- a to z
|
|
num = num | (x - 71);
|
|
elsif x >= 48 and x <= 58 then
|
|
-- 0 to 9
|
|
num = num | (x + 4);
|
|
elsif x = 45 then
|
|
-- Dash
|
|
num = num | 62;
|
|
elsif x = 95 then
|
|
-- Underscore
|
|
num = num | 63;
|
|
else
|
|
raise 'Bad input';
|
|
end if;
|
|
end loop;
|
|
|
|
return num;
|
|
end;
|
|
$$ language plpgsql;
|
|
|
|
create or replace function idstr(
|
|
num bigint)
|
|
returns text as $$
|
|
declare
|
|
a text;
|
|
pos integer;
|
|
str text;
|
|
begin
|
|
a := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
|
str := '';
|
|
|
|
for i in 1..11 loop
|
|
pos := (num & 63);
|
|
str := substr(a, pos + 1, 1) || str;
|
|
num := num >> 6;
|
|
end loop;
|
|
|
|
return str;
|
|
end;
|
|
$$ language plpgsql;
|
|
|
|
create or replace function newid()
|
|
returns bigint as $$
|
|
declare
|
|
bytes bytea;
|
|
result bigint;
|
|
begin
|
|
bytes := gen_random_bytes(8);
|
|
result := 0;
|
|
|
|
for i in 0..7 loop
|
|
result := (result << 8) | get_byte(bytes, i);
|
|
end loop;
|
|
|
|
-- Truncate high bit to ensure result is positive
|
|
-- This value is just the decimal representation of 0x7FFFFFFF`FFFFFFFF.
|
|
|
|
return result & 9223372036854775807;
|
|
end;
|
|
$$ language plpgsql;
|
|
|