gempir icon

Untitled

gempir | PRO | 10/21/24 07:21:23 AM UTC | 0 ⭐ | 329 👁️ | Never ⏰ | []
text |

920 B

|

None

|

0 👍

/

0 👎

CREATE OR REPLACE FUNCTION old_to_new(old_id TEXT) 
RETURNS TEXT AS $$
DECLARE
    number NUMERIC;
    timestamp_seconds NUMERIC;
    timestamp_milliseconds NUMERIC;
    random NUMERIC;
    new_number NUMERIC;
    ulid TEXT;
BEGIN
    -- Convert hexadecimal to numeric
    number := ('x' || old_id)::bit(128)::numeric;
     -- Shift by 8 bytes to get the timestamp in seconds
    timestamp_seconds := number >> 64;
    timestamp_milliseconds := timestamp_seconds * 1000;
     -- The first 8 bytes are treated as the random part of the ULID
    random := number & ((1::numeric << 64) - 1);
     -- Shift the timestamp by 80 bits to make room for the random part
    new_number := (timestamp_milliseconds << 80) | random;
     -- Convert to base32 encoding (simplified version, might need adjustment)
    ulid := encode(new_number::bytea, 'base64');
     RETURN ulid;
END;
$$ LANGUAGE plpgsql;

Comments