-- PostgreSQL database dump
--
-\restrict rL7JZX9lefDYCij1ck1YZ9zBYKQONa1UgbdrSppmH7VGwDI2usPtcuRDMxQJwsl
+\restrict PmCqBzadGBjf7X81pOnYPHbo4fs9Y3SWPwRhwMTKuXKIZtccpmryrLaLv9R92bW
-- Dumped from database version 17.6 (Debian 17.6-0+deb13u1)
-- Dumped by pg_dump version 17.6 (Debian 17.6-0+deb13u1)
);
+--
+-- Name: domain_unique_ids; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE public.domain_unique_ids (
+ id bigint NOT NULL,
+ name text NOT NULL
+);
+
+
+--
+-- Name: domain_unique_ids_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE public.domain_unique_ids_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: domain_unique_ids_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE public.domain_unique_ids_id_seq OWNED BY public.domain_unique_ids.id;
+
+
--
-- Name: domains; Type: TABLE; Schema: public; Owner: -
--
ALTER TABLE ONLY public.api_keys ALTER COLUMN id SET DEFAULT nextval('public.api_keys_id_seq'::regclass);
+--
+-- Name: domain_unique_ids id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.domain_unique_ids ALTER COLUMN id SET DEFAULT nextval('public.domain_unique_ids_id_seq'::regclass);
+
+
--
-- Name: domains id; Type: DEFAULT; Schema: public; Owner: -
--
ADD CONSTRAINT checker_domains_pkey PRIMARY KEY (name);
+--
+-- Name: domain_unique_ids domain_unique_ids_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.domain_unique_ids
+ ADD CONSTRAINT domain_unique_ids_pkey PRIMARY KEY (id);
+
+
--
-- Name: domains domains_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
CREATE INDEX api_keys_prefix ON public.api_keys USING btree (prefix) WHERE (deleted_at IS NULL);
+--
+-- Name: domain_unique_ids_unique; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE UNIQUE INDEX domain_unique_ids_unique ON public.domain_unique_ids USING btree (name);
+
+
--
-- Name: domains_list_id; Type: INDEX; Schema: public; Owner: -
--
-- PostgreSQL database dump complete
--
-\unrestrict rL7JZX9lefDYCij1ck1YZ9zBYKQONa1UgbdrSppmH7VGwDI2usPtcuRDMxQJwsl
+\unrestrict PmCqBzadGBjf7X81pOnYPHbo4fs9Y3SWPwRhwMTKuXKIZtccpmryrLaLv9R92bW
# Log action
log.info("%s (block = %s) has been removed from %s" % (self.name, self.block, self.list))
+
+
+class DomainUniqueID(sqlmodel.SQLModel, table=True):
+ __tablename__ = "domain_unique_ids"
+
+ def __str__(self):
+ return self.name
+
+ # ID
+ id: int = sqlmodel.Field(primary_key=True)
+
+ # Name
+ name: str
sqlmodel
.select(
blocked_domains.c.name,
+ domains.DomainUniqueID.id.label("unique_id"),
)
.distinct(
blocked_domains.c.name,
)
+ .join(
+ domains.DomainUniqueID,
+ domains.DomainUniqueID.name == blocked_domains.c.name,
+ isouter=True,
+ )
.where(
~sqlmodel.exists(
sqlmodel
.cte("listed_domains")
)
- return listed_domains
+ # Create and assign a unique ID to each domain
+ new_domains_with_unique_ids = (
+ sqlalchemy.dialects.postgresql
+ .insert(
+ domains.DomainUniqueID,
+ )
+ .from_select(
+ ["name"],
+ sqlmodel.select(
+ listed_domains.c.name,
+ )
+ .where(
+ listed_domains.c.unique_id == None,
+ ),
+ )
+ .on_conflict_do_nothing(
+ index_elements=["name"],
+ )
+ .returning(
+ domains.DomainUniqueID.name,
+ domains.DomainUniqueID.id,
+ )
+ .cte("new_domains_with_unique_ids")
+ )
+
+ all_domains = (
+ sqlmodel
+ .select(
+ listed_domains.c.name,
+ sqlmodel.func.coalesce(
+ listed_domains.c.unique_id,
+ new_domains_with_unique_ids.c.id,
+ ).label("unique_id"),
+ )
+ .join(
+ new_domains_with_unique_ids,
+ new_domains_with_unique_ids.c.name == listed_domains.c.name,
+ isouter=True,
+ )
+ )
+
+ return all_domains
@property
def domains(self):
stmt = (
sqlmodel
.select(
- self.__domains.c.name,
+ domains.DomainUniqueID,
+ )
+ .select_from(
+ self.__domains,
+ )
+ .join(
+ domains.DomainUniqueID,
+ domains.DomainUniqueID.name == self.__domains.c.name,
)
)