-
Notifications
You must be signed in to change notification settings - Fork 938
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #14 from zanfranceschi/main
Rebasing my side
- Loading branch information
Showing
453 changed files
with
29,320 additions
and
348,006 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
## Submissão para Rinha de Backend, Segunda Edição: 2024/Q1 - Controle de Concorrência | ||
|
||
Submissão feita com: | ||
- `Go` para api com o framework `Gin Web Framework` | ||
- `nginx` como load balancer | ||
- `postgres` como banco de dados | ||
- [repositório da api](https://github.com/4emcos/rinha-de-backend-2024-q1-golang) | ||
|
||
|
||
[@4emcos](https://twitter.com/4emcos) @ twitter | ||
[@4emcos](https://www.linkedin.com/in/4emcos/) @ linkedin |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
SET timezone = 'America/Sao_Paulo'; | ||
CREATE SCHEMA IF NOT EXISTS rinha; | ||
|
||
CREATE TABLE rinha.users | ||
( | ||
id SERIAL PRIMARY KEY, | ||
limit_in_cents INTEGER NOT NULL, | ||
initial_balance INTEGER NOT NULL DEFAULT 0 | ||
); | ||
|
||
INSERT INTO rinha.users (id, limit_in_cents, initial_balance) | ||
VALUES (DEFAULT, 1000 * 100, 0), | ||
(DEFAULT, 800 * 100, 0), | ||
(DEFAULT, 10000 * 100, 0), | ||
(DEFAULT, 100000 * 100, 0), | ||
(DEFAULT, 5000 * 100, 0); | ||
|
||
CREATE UNLOGGED TABLE rinha.history | ||
( | ||
id SERIAL PRIMARY KEY, | ||
user_id SMALLINT NOT NULL, | ||
value INTEGER NOT NULL, | ||
type CHAR(1) NOT NULL, | ||
description VARCHAR(10) NOT NULL, | ||
do_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP | ||
); | ||
|
||
ALTER TABLE | ||
rinha.history | ||
SET | ||
(autovacuum_enabled = false); | ||
|
||
CREATE INDEX idx_history ON rinha.history (user_id); | ||
|
||
|
||
CREATE OR REPLACE FUNCTION rinha.credit( | ||
user_id_tx SMALLINT, | ||
value_tx INT, | ||
description_tx VARCHAR(10)) | ||
RETURNS TABLE | ||
( | ||
new_balance INT, | ||
success BOOL, | ||
current_limit INT | ||
) | ||
LANGUAGE plpgsql | ||
AS | ||
$$ | ||
BEGIN | ||
PERFORM pg_advisory_xact_lock(user_id_tx); | ||
|
||
INSERT INTO rinha.history VALUES (DEFAULT, user_id_tx, value_tx, 'c', description_tx); | ||
|
||
RETURN QUERY | ||
UPDATE rinha.users | ||
SET initial_balance = initial_balance + value_tx | ||
WHERE id = user_id_tx | ||
RETURNING initial_balance, TRUE, limit_in_cents; | ||
END; | ||
$$; | ||
|
||
CREATE OR REPLACE FUNCTION rinha.debit( | ||
user_id_tx SMALLINT, | ||
value_tx INT, | ||
description_tx VARCHAR(10)) | ||
RETURNS TABLE | ||
( | ||
new_balance INT, | ||
success BOOL, | ||
current_limit INT | ||
) | ||
LANGUAGE plpgsql | ||
AS | ||
$$ | ||
DECLARE | ||
current_balance int; | ||
current_limit_value int; | ||
BEGIN | ||
PERFORM pg_advisory_xact_lock(user_id_tx); | ||
|
||
SELECT limit_in_cents, | ||
initial_balance | ||
INTO | ||
current_limit_value, | ||
current_balance | ||
FROM rinha.users | ||
WHERE id = user_id_tx; | ||
|
||
IF current_balance - value_tx >= current_limit_value * -1 THEN | ||
INSERT INTO rinha.history VALUES (DEFAULT, user_id_tx, value_tx, 'd', description_tx); | ||
|
||
RETURN QUERY | ||
UPDATE rinha.users | ||
SET initial_balance = initial_balance - value_tx | ||
WHERE id = user_id_tx | ||
RETURNING initial_balance, TRUE, limit_in_cents; | ||
|
||
ELSE | ||
RETURN QUERY SELECT current_balance, FALSE, current_limit_value; | ||
END IF; | ||
END; | ||
$$; | ||
|
Oops, something went wrong.