Home > epg

epg

Epg is a project mainly written in C and ERLANG, based on the View license.

an Erlang PostgreSQL libpq wrapper

epg -- an Erlang PostgreSQL libpq wrapper

author: Michael Nacos (m.nacos AT gmail.com)


This software has been released under the terms of the BSD license. Please read LICENSE for more details. Use of this software implies LICENSE acceptance.

This code is alpha at best. Please Use at your own risk.

REQUIREMENTS -------------------------------------------------------------------------

You need access to your PostgreSQL source or the equivalent development files. In the following examples, we assume PostgreSQL has been compiled from source and installed in this location: /usr/local/pgsql8.4.1

INSTALLATION -------------------------------------------------------------------------

gcc -L/usr/local/pgsql8.4.1/lib -I/usr/local/pgsql8.4.1/include -lpq epg.c -o epg sudo mv epg /usr/local/bin erlc epg.erl

INSTRUCTIONS -------------------------------------------------------------------------

epg.beam needs to be in your erl path whenever you use it, of course. You may make this so via the -pa erl flag (e.g. erl -pa /my/path/to/epg.beam ...) The epg executable must also be in your path (e.g. /usr/local/bin)

The first call to epg:exec() is an authentication call. If successful, subsequent exec() calls execute SQL statements until epg:stop() is called. If authentication is unsuccessful, exec() keeps trying to authenticate. For a list of options and the format of the connection string, please visit the following link:

http://www.postgresql.org/docs/8.4/static/libpq-connect.html

SELECT queries return [{header,HList},{data,DList}] or {error,Msg} INSERT/UPDATE/DELETE etc. return either {info,Msg} or {error,Msg}

EXAMPLES -----------------------------------------------------------------------------

Eshell V5.6.5 (abort with ^G)

% --- Startup ---

1> epg:start(conn1). <0.33.0> 2> epg:start(conn2). <0.35.0>

% --- Authentication ---

3> epg:exec(conn1,"user=postgres dbname=postgres").
{info,"postgres@localhost:5432/postgres "}

4> epg:exec(conn2,"user=someuser password=somepass host=somehost port=5432 dbname=mydb"). {info,"someuser@somehost:5432/mydb "}

% --- Executing queries ---

5> epg:exec(conn1, "SELECT version();"). [{header,[{"version",25}]}, {data,[{"PostgreSQL 8.3.5 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1) 4.3.2"}]}]

6> epg:exec(conn1,"CREATE TEMP TABLE hello (id INT PRIMARY KEY, val TEXT);"). NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "hello_pkey" for table "hello" {info,"CREATE TABLE "}

% --- Processing the result set ---

7> [_,{data,Data}] = epg:exec(conn2,"SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW';"), [io:format("~p~n",[T]) || T <- Data].

{"user_mapping_options"}
{"user_mappings"}
{"triggered_update_columns"}
{"triggers"}
{"usage_privileges"}
{"view_column_usage"}
{"view_routine_usage"}
{"view_table_usage"}
{"views"}
{"data_type_privileges"}
{"element_types"}
...

% --- Pretty Printing ---

8> epg:pp(epg:exec(conn1,"SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW';")).

            table_name             
+-----------------------------------
| tables                            
| triggered_update_columns          
| triggers                          
| usage_privileges                  
| view_column_usage                 
| view_routine_usage                
| view_table_usage                  
| views                             
| data_type_privileges              
| element_types                     
| schemata                          
| sequences                         
...

% --- Disconnecting ---

8> epg:stop(conn1), epg:stop(conn2).

Previous:abrepo