Remove remaining bits of Bernard's postgres dispense
API for the new dispense | ||
------------------------- | ||
New dispense is written in entirely in postgresql. The server does all the | ||
required processing, meaning that database integrity is always maintained. | ||
The current interface for dispense is using a postgresql client library. | ||
Client libraries exist for many languages including C, C++, Perl, Python, | ||
Ruby, PHP, or you could also speak with the supplied client 'psql' through | ||
stdin/stdout. | ||
The details for connecting to the database are: | ||
hostname: dispense.ucc.gu.uwa.edu.au | ||
username: anondispense | ||
database: dispense | ||
No password is required. You will only be able to connect from 'trusted' | ||
machines - currently this is mussel, mermaid, morwong. | ||
Note the API still isn't stable - it'd be worth running these commands by hand | ||
to see what the resulting tables look like. | ||
The useful things can be done once connected: | ||
- SELECT * FROM get_services(username) | ||
will give you a list of services available to the given user, including | ||
syntax if parameters are required | ||
- SELECT get_balance() | ||
will return a table of all users and their balances. | ||
- SELECT get_balance(username) | ||
will return a table with one row for the given user, displaying their | ||
account balance. | ||
- SELECT do_request(target_user, service_name, parameters) | ||
will perform a request. | ||
* target_user is the user you wish to perform the request upon. | ||
You will only be permitted to act on somebody else if you are in the | ||
coke group. | ||
* service_name is the name of the service as seen in the services | ||
table. | ||
* parameters is an array of parameters for the service, if required. | ||
These should appear in the order as item_syntax from the services | ||
table. | ||
Example follows: | ||
$ psql dispense -U anondispense -h dispense.ucc.gu.uwa.edu.au | ||
\Welcome to psql 7.4.1, the PostgreSQL interactive terminal. | ||
Type: \copyright for distribution terms | ||
\h for help with SQL commands | ||
\? for help on internal slash commands | ||
\g or terminate with semicolon to execute query | ||
\q to quit | ||
-- Equivalent of bringing up the menu. Only items allowed for | ||
-- the given user are shown. | ||
dispense=> select * from get_services('dagobah'); | ||
item_name | item_cost_cents | item_syntax | item_stock | ||
-------------+-----------------+--------------------------------------+------------ | ||
nothing | | | | ||
give | | <username> <cents> | | ||
acct | | <cents> <reason> | | ||
passion pop | 80 | | 8 | ||
vb | 80 | | 0 | ||
emu export | 80 | | 3 | ||
champagne | 80 | | 9 | ||
coke powder | 80 | | 11 | ||
update_coke | | <slot number> <new name> <new price> | | ||
opendoor | | | | ||
grape juice | 80 | | 0 | ||
some foo | 77 | | 3 | ||
(12 rows) | ||
-- Get balance for a user. | ||
-- Equivalent of 'dispense acct dagobah' | ||
-- Calling just get_balance() will return all users balances. | ||
dispense=> select * from get_balance('dagobah'); | ||
user_name | user_balance_cents | user_balance_bytes | ||
-----------+--------------------+-------------------- | ||
dagobah | -5080 | 0 | ||
(1 row) | ||
-- Dispense something for a user. | ||
-- Equivalent of 'dispense -u dagobah grape juice' | ||
dispense=> select do_request('dagobah', 'grape juice', NULL); | ||
ERROR: You may not dispense below -$20.00. | ||
CONTEXT: PL/pgSQL function "do_request" line 12 at SQL statement | ||
-- Adjust somebody's account balance up or down. | ||
-- Equivalent of 'dispense acct dagobah +10000 BAG123' | ||
dispense=> select do_request('dagobah', 'acct', array['+10000', 'BAG123']); | ||
do_request | ||
------------ | ||
t | ||
(1 row) | ||
-- Get the balance once again ... note that it's higher :) | ||
dispense=> select * from get_balance('dagobah'); | ||
user_name | user_balance_cents | user_balance_bytes | ||
-----------+--------------------+-------------------- | ||
dagobah | 4920 | 0 | ||
(1 row) | ||
-- Try that dispense again, but we see there is none | ||
dispense=> select do_request('dagobah', 'grape juice', NULL); | ||
ERROR: We are out of stock of that item. | ||
CONTEXT: PL/pgSQL function "do_request" line 12 at SQL statement | ||
-- Try that dispense again, but we see there is none | ||
dispense=> select do_request('dagobah', 'some foo', NULL); | ||
do_request | ||
------------ | ||
t | ||
(1 row) | ||
-- Updating a slot name/price on the coke machine | ||
dispense=> select do_request('dagobah', 'update_coke', array['3', 'orange blah', '88']); | ||
do_request | ||
------------ | ||
t | ||
(1 row) | ||
-- Note the services have changed | ||
dispense=> select * from get_services('dagobah'); | ||
item_name | item_cost_cents | item_syntax | item_stock | ||
-------------+-----------------+--------------------------------------+------------ | ||
nothing | | | | ||
give | | <username> <cents> | | ||
acct | | <cents> <reason> | | ||
passion pop | 80 | | 8 | ||
vb | 80 | | 0 | ||
emu export | 80 | | 3 | ||
champagne | 80 | | 9 | ||
coke powder | 80 | | 11 | ||
update_coke | | <slot number> <new name> <new price> | | ||
opendoor | | | | ||
grape juice | 80 | | 0 | ||
orange blah | 88 | | 3 | ||
(12 rows) | ||
Email comments or queries to <[email protected]> |
/* Prints a list of all usernames with useable coke balances | ||
* delimited by newlines. | ||
* | ||
* - Bernard Blackham <[email protected]> | ||
*/ | ||
#include <stdio.h> | ||
#include "ucc.h" | ||
int main(int argc, char* argv[]) { | ||
char username[30]; | ||
int32 balance; | ||
if (argc != 1) { | ||
fprintf(stderr, "Usage: %s\n", argv[0]); | ||
return 1; | ||
} | ||
SetCokebankToSocks(); | ||
cokebank_open(); | ||
printf("DELETE from users;\n"); | ||
printf("COPY users (user_name, user_balance_cents, user_balance_bytes) FROM stdin;\n"); | ||
while (cokebank_get_next(username, &balance, 0)) { | ||
printf("%s\t%d\t%d\n", username, cokebank_get(username), cokebank_get_bytes(username)); | ||
} | ||
printf("\\.\n"); | ||
cokebank_close(); | ||
return 0; | ||
} |
CC = gcc | ||
INCLUDES = -I$(shell pg_config --includedir) -I$(shell pg_config --includedir-server) | ||
CFLAGS = $(INCLUDES) -Wall -O2 | ||
all: pg_ident.so | ||
pg_ident.so: pg_ident.o | ||
gcc -shared -lident -o [email protected] $< | ||
clean: | ||
rm -f *.o *.so |
This diff is collapsed.
CC = gcc | ||
INCLUDES = -I$(shell pg_config --includedir) -I$(shell pg_config --includedir-server) | ||
CFLAGS = $(INCLUDES) -Wall -O2 | ||
all: pg_syslog.so | ||
pg_syslog.so: pg_syslog.o | ||
gcc -shared -o [email protected] $< | ||
clean: | ||
rm -f *.o *.so |
Please register or sign in to comment