Log of an installation of libexodus on Centos 5.3
Preparation
sudo yum update sudo yum install boost-devel postgresql-devel gcc-c++ subversion postgresql-server
Centos needs you to start the database manually. Ubuntu doesnt.
sudo /etc/init.d/postgresql start
Exodus
For the latest version of the software:
cd ~ mkdir exodus cd exodus svn checkout https://exodusdb.googlecode.com/svn/trunk/ cd trunk
Or for not the latest:
wget http://www.neosys.com/support/exodus_all-9.6.tar.gz tar xvfz exodus_all-9.6.tar.gz cd exodus_all-9.6
Classic installation steps
./configure make sudo make install
Setting up Postgres for Exodus
Register the exodus functions
Assume identity of a postgres superuser
sudo su - postgres
On Mac OSX only, ensure postgres can be found. Change 8.3 to your version) and check pg_config can run)
PATH=/Library/PostgreSQL/8.3/bin/:$PATH pg_config
Log in to postgres as a postgres superuser and connect to database template1
psql -U postgres -d template1 \connect template1
-- cut and paste the following SQL to register the functions into postgres --
CREATE OR REPLACE FUNCTION exodus_call(bytea, bytea, bytea, bytea, bytea, int4, int4) RETURNS bytea AS 'pgexodus', 'exodus_call' LANGUAGE C IMMUTABLE;
CREATE OR REPLACE FUNCTION exodus_extract_bytea(bytea, int4, int4, int4) RETURNS bytea AS 'pgexodus', 'exodus_extract_bytea' LANGUAGE C IMMUTABLE;
CREATE OR REPLACE FUNCTION exodus_extract_text(bytea, int4, int4, int4) RETURNS text AS 'pgexodus', 'exodus_extract_text' LANGUAGE C IMMUTABLE;
CREATE OR REPLACE FUNCTION exodus_extract_sort(bytea, int4, int4, int4) RETURNS text AS 'pgexodus', 'exodus_extract_sort' LANGUAGE C IMMUTABLE;
-- Remaining functions are STRICT therefore never get called with NULLS -- also return NULL if passed zero length strings
CREATE OR REPLACE FUNCTION exodus_extract_text2(bytea, int4, int4, int4) RETURNS text AS 'pgexodus', 'exodus_extract_text2' LANGUAGE C IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION exodus_extract_date(bytea, int4, int4, int4) RETURNS date AS 'pgexodus', 'exodus_extract_date' LANGUAGE C IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION exodus_extract_time(bytea, int4, int4, int4) RETURNS time AS 'pgexodus', 'exodus_extract_time' LANGUAGE C IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION exodus_extract_datetime(bytea, int4, int4, int4) RETURNS timestamp AS 'pgexodus', 'exodus_extract_datetime' LANGUAGE C IMMUTABLE STRICT;
Check the functions loaded properly (count them)
\df exodus*
List of functions Schema | Name | Result data type | Argument data types --------+-------------------------+-----------------------------+----------------------------------------------------- public | exodus_call | bytea | bytea, bytea, bytea, bytea, bytea, integer, integer public | exodus_extract_bytea | bytea | bytea, integer, integer, integer public | exodus_extract_date | date | bytea, integer, integer, integer public | exodus_extract_datetime | timestamp without time zone | bytea, integer, integer, integer public | exodus_extract_sort | text | bytea, integer, integer, integer public | exodus_extract_text | text | bytea, integer, integer, integer public | exodus_extract_text2 | text | bytea, integer, integer, integer public | exodus_extract_time | time without time zone | bytea, integer, integer, integer (8 rows)
For more information see http://www.postgresql.org/docs/8.1/static/app-psql.html
Create a user and database for exodus
Use the example password for now to avoid further configuration in exodus.
CREATE ROLE exodus LOGIN PASSWORD 'somesillysecret' CREATEDB CREATEROLE; CREATE DATABASE exodus WITH ENCODING='UTF8' OWNER=exodus;
Quit postgres command prompt
\q
Ensure Exodus can logon to postgres
Edit pg_hba.conf
Unless you are only going to run Exodus as user "exodus" from the local machine, grant login from 127.0.0.1 using username/encrypted password (instead of only "ident sameuser" which means the logged-in username without password) For more info see http://developer.postgresql.org/pgdocs/postgres/auth-pg-hba-conf.html
Redhat/Centos/MacOSX
nano ~/data/pg_hba.conf
or for Ubuntu
nano /etc/postgresql/8.3/main/pg_hba.conf
Allow any postgres user to login with a password via interprocess tcp/ip.
comment out the following line.
#host all all 127.0.0.1/32 ident sameuser
and add the following:
host all all 127.0.0.1/32 md5
quit postgres user
exit
Reload Postgres
Redhat/Centos
sudo /etc/init.d/postgresql reload
or Ubuntu
sudo /etc/init.d/postgresql-8.3 reload
or MacOSX
sudo su postgres /Library/PostgreSQL/8.3/bin/pg_ctl reload -D /Library/PostgreSQL/8.3/data exit
Testing
Test exodus library
nano test1.cpp
#include <exodus/exodus.h> program() { date().oconv("D").outputln(); print(oconv(date(),"D")); }
g++ test1.cpp -lexodus
./a.out
27 JUN 2009 27 JUN 2009
Test database connection
nano test2.cpp
#include <exodus/exodus.h> program() { createfile("exodustest"); }
g++ test2.cpp -lexodus
./a.out
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "exodustest_pkey" for table "exodustest"
Test symbolic dictionaries (call backs)
nano test3.cpp
#include <exodus/exodus.h> program() { var testfilename="test_symbolics"; createfile("dict_"^testfilename); write("F"^FM^0^FM^"ID","dict_"^testfilename,"ID"); write("S"^FM^FM^"Col1","dict_"^testfilename,"SYMCOL1"); createfile(testfilename); write(1000^FM^2000,testfilename,"3000"); select("select "^testfilename^" with SYMCOL1 = 3000 or with ID = 3000"); //should fail since have not installed a function to handle symbolics in this test //but it shows that everything else is working var key1; if (not readnext(key1)) stop("Cannot readnext (as expected)"); }
g++ test3.cpp -lexodus
./a.out
Expected result is which means everything is working and we can implement symbolic dictionaries in exodus.
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "dict_test_symbolics_pkey" for table "dict_test_symbolics" NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_symbolics_pkey" for table "test_symbolics" PGRES_FATAL_ERROR: ERROR: pgexodus exodus_call failed. (MVCipc() TEST_SYMBOLICS unknown filename) Cannot readnext (as expected)