PostgreSQL рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ

рдореИрдВ рдЦреБрд╢рдЦрдмрд░реА рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВ: рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдФрд░ рдЙрдирдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХрд╛ рдЬреАрд╡рди рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рд╡рд┐рднрдХреНрддрд┐рдпрд╛рдБ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ <source> рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмреИрдХрд▓рд╛рдЗрдЯрд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд▓реЗрдЦрдХ (рдЬреЛ рдЙрдирдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ) рдХреЛ рд╢реМрдХрд┐рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ <font color=...> рдХреЗ рд╕рд╛рде <font color=...> ред

PostgreSQL рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреБрдЦреА рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдиреЗ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдорд╛рдирдХ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдбреАрдмреАрдПрдордПрд╕ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрд╛ред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд╕рдордп рдмреАрддрддрд╛ рдЧрдпрд╛ , рдЕрд▓реЗрдХреНрд╕реА рдмреЛрдореНрдмреБрд░рдо рдиреЗ рдореЗрд░реЗ рдлреЛрдВрдЯ рдХреЛ рд╕реНрд░реЛрдд рддрдХ (рдФрд░ рдореИрдВ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛) рдареАрдХ рдХрд░ рджрд┐рдпрд╛, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдмреИрдХрд▓рд╛рдЗрдЯ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рджрд▓реЗрд░ рджрд▓реЗрд░рд╛рд▓рд┐рдпреЛрд░реЛрд╡ рдиреЗ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╕реБрдЭрд╛рдпрд╛: рд╣рдмреНрдмрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╣рд╛рдЗрд▓рд╛рдЗрдЯрдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВред рдФрд░ рдЕрдм - рдХрд┐рдпрд╛, рд╕реНрд╡рд╛рдЧрдд рд╣реИред

pgsql: SQL, PL / pgSQL рдФрд░ рдСрд▓-рдСрд▓-рдСрд▓


рддреЛ, рд╕рд╣реА рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд╛ рд░рд╣рд╕реНрдп рдирдИ pgsql рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИред рдЗрд╕реЗ рдореЗрдиреВ (рдмрдЯрди "рд╕реНрд░реЛрдд рдХреЛрдб") рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Html рдореЗрдВ рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИ

<source lang="pgsql">

</source>

рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ:

```pgsql

```

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рд╛рдЗрд▓рд╛рдЗрдЯрдЬ рд╕реНрд╡рдпрдВ рднрд╛рд╖рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рдмрдбрд╝реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ, рдСрдЯреЛ-рдбрд┐рдЯреЗрдХреНрд╢рди рдЕрдХреНрд╕рд░ рдЫреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдЯреЛ-рдбрд┐рдЯреЗрдХреНрд╢рди рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднрд╛рд╖рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рддреЗрдЬреА рд╕реЗ рдЪрдордХ рдЬрд╛рдПрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП

 CREATE TABLE aircrafts_data ( aircraft_code character(3) NOT NULL, model jsonb NOT NULL, range integer NOT NULL, CONSTRAINT aircrafts_range_check CHECK ((range > 0)) ); 

рд╣рдо рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ

<source lang="pgsql">
CREATE TABLE aircrafts_data (
aircraft_code character(3) NOT NULL,
model jsonb NOT NULL,
range integer NOT NULL,
CONSTRAINT aircrafts_range_check CHECK ((range > 0))
);
</source>

рд╡рд╣реА pgsql рднрд╛рд╖рд╛ PL / pgSQL рдХреЛрдб рдХреЛ рднреА рд░рдВрдЧрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП

 CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$ BEGIN RETURN QUERY SELECT flightid FROM flight WHERE flightdate >= $1 AND flightdate < ($1 + 1); IF NOT FOUND THEN RAISE EXCEPTION '   : %.', $1; END IF; RETURN; END $$ LANGUAGE plpgsql; 

рд▓рд┐рдЦрдиреЗ

<source lang="pgsql">
CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$
...
$$ LANGUAGE plpgsql;
</source>

рдПрдХ рдорд╛рдореВрд▓реА рд╕реВрдХреНрд╖реНрдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбреЙрд▓рд░ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдкреЛрд╕реНрдЯреНрд░реЛрдл рдореЗрдВ рддрд╛рд░ рдХреЛ рдХрднреА рднреА рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧ рд░рд╣рд╛ рдерд╛ред

рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдЦрдВрдб рдХреА рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрд▓рд╛рдЗрдЯрдЬ рдХреА рдХреНрд╖рдорддрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ PL / рдкрд░реНрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛:

 CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$ my ($x, $y) = @_; if (not defined $x) { return undef if not defined $y; return $y; } return $x if not defined $y; return $x if $x > $y; return $y; $$ LANGUAGE plperl; 

рдЖрдкрдХреЛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рд▓рд┐рдЦреЗрдВ

<source lang="pgsql">
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
...
$$ LANGUAGE plperl;
</source>

рдмреЗрд╢рдХ, рдЪреБрдиреА рдЧрдИ рднрд╛рд╖рд╛ рдХреЗрд╡рд▓ рдЙрд╕ рдЪреАрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдЬреЛ рдбреЙрд▓рд░ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдж рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмреИрдХрд▓рд╛рдЗрдЯ PostgreSQL рдХреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬрд╛рд░реА 11 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдВрджреЗрд╣ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рд╕реЗ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдирд╛рдо, рдПрдХ рдкреВрд░реНрдг-рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рднреАрддрд░ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд▓рдВрдмреА рд╕реВрдЪреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рдВрдЧ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдирддреАрдЬрддрди, рдореИрдВрдиреЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд░рдВрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рд╕рднреА рд╕рдорд╛рди, рд╕рдм рдХреБрдЫ рдХреАрд╡рд░реНрдб рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред

plaintext: рдЯреЗрдХреНрд╕реНрдЯ, рдкреНрд▓реЗрди рдЯреЗрдХреНрд╕реНрдЯ


рдХрднреА-рдХрднреА рд▓реЗрдЦ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмреЗрд╢рдХ, рд╡рд╣рд╛рдБ рдХреЛрдИ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИрдВ, рдХреБрдЫ рднреА рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛрдб рдХреЗ рд╕рдорд╛рди "рдХрдВрд╕реЛрд▓" рджрд┐рдЦреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЕрдм рдЖрдк рд╡рд┐рд╢реЗрд╖ рд╕рд╛рджреЗ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП

 WITH xmldata(data) AS (VALUES ($$ <example xmlns="http://example.com/myns" xmlns:B="http://example.com/b"> <item foo="1" B:bar="2"/> <item foo="3" B:bar="4"/> <item foo="4" B:bar="5"/> </example>$$::xml) ) SELECT xmltable.* FROM XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x, 'http://example.com/b' AS "B"), '/x:example/x:item' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '@foo', bar int PATH '@B:bar'); 

  foo | bar -----+----- 1 | 2 3 | 4 4 | 5 (3 rows) 

рд▓рд┐рдЦрдиреЗ

<source lang="pgsql">
WITH xmldata(data) AS (VALUES ($$
...
</source>
<source lang="plaintext">
foo | bar
-----+-----
1 | 2
3 | 4
4 | 5
(3 rows)
</source>

рдкреНрд▓реЗрдирдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдирд╡рд╛рдЪрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрд╛рдо рдореЗрдВ рдЖрдПрдВрдЧреЗред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ (рдФрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИрдВ, рддреЛ рд╕рдВрджрд░реНрдн-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ SQL тАЛтАЛрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ), рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЧрд┐рддреБрдм рдкрд░ рдПрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдПрдВ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░реЗрдВред

PS рдкреАрдЬреАрдХреЛрдирдл рд╕рдореНрдореЗрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓реЛ, рдЬреЛ рдорд╛рд╕реНрдХреЛ рдореЗрдВ 4-6 рдлрд░рд╡рд░реА рдХреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди 5 рджрд┐рд╕рдВрдмрд░ рддрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ!

Source: https://habr.com/ru/post/hi430040/


All Articles