/epg

an Erlang PostgreSQL libpq wrapper

Primary LanguageCOtherNOASSERTION

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\n\n\n"}

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

% --- 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\n\n\n"}

% --- 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).