Go to the first, previous, next, last section, table of contents.


Low-level socket interface to SQL/ODBC databases

Author(s): D. Cabeza, M. Carro, I. Caballero, and M. Hermenegildo..

Version: 1.5#118 (2000/4/19, 18:13:43 CEST)

Version of last change: 1.3#53 (1999/9/15, 23:37:55 MEST)

This library provides a socket-based interface to SQL Databases, using the database mediator server ODBC interface developed by C. Taboch and I. Caballero. The interface currently works for databases running in Win95/NT machines via ODBC. This low-level interface was defined with two goals in mind:

In order to allow the flexibility mentioned above, a socket (TCP/IP) client-server architecture was chosen. The interface has two main components:

Example:

:- use_module(library('persdb_sql/db_client')).
:- use_module(library(format)).
:- use_module(library(lists)).

:- multifile issue_debug_messages/1.
:- data issue_debug_messages/1.
issue_debug_messages('db_client').

main0:- %% getting the tables existing in a database
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream),
        db_login(Stream,'DaletDemo',dalet_admin,dalet_admin,
%%        db_login(Stream,'ASA 6.0 Sample',dba,sql,
                 dbconnection(Stream,DbHandle)),
%%        db_get_tables(dbconnection(Stream,DbHandle),TablesList),
        db_table_types(dbconnection(Stream,DbHandle),'Titles',AttList),
        db_logoff(dbconnection(Stream,DbHandle)),
        odbc_disconnect(Stream),
        format("Results: ~w \n",AttList).

main1 :- %% accessing the whole table in one go
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream), 
        db_login(Stream,'ASA 6.0 Sample',dba,sql,Conn),
        db_eval_sql(Conn,"SELECT fname,lname,address from ""DBA"".customer 
                   WHERE ((Id>100) AND (Id<105))",Term), 
        write(Term), nl,nl,nl,nl,nl,nl,nl,nl,nl,nl,nl,nl,nl,nl,nl,
        functor(Term,X,_Y),
        write(X),nl,
        Term=..[_|L],
        write('That is L'),nl,        
        write(L),nl,L=[M],length(M,N),write(N),
%        db_eval_sql(Conn,"SELECT id,name,description,color from 
%                    ""DBA"".product WHERE size='One size fits all' 
%                    OR size='Large'",Term2), 
%        write(Term2), nl,
        db_logoff(Conn),
        odbc_disconnect(Stream).

main2:- %% accessing tuples one by one
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream),
        db_login(Stream,'ASA 6.0 Sample',dba,sql,Conn),
        db_stmt_handle(Conn,
              "SELECT fname,lname,address from ""DBA"".customer 
               WHERE ((Id>100) AND (Id<105))",QueryConn),
        db_one_tuple(QueryConn,Answer),
        format("First Tuple: ~w \n",Answer),
        db_one_tuple(QueryConn,Answer2),
        format("Second Tuple: ~w \n",Answer2),
        db_logoff(Conn),
        odbc_disconnect(Stream).
        
main3:- %% bringing tuples (one to one) from Literature Database
        %% TO SEE : check it
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream),
        db_login(Stream,'Literature',dba,sql,Conn),
        db_stmt_handle(Conn,"SELECT * FROM AUTHORS ORDER BY ID",QueryConn),
        print_all_one_by_one(QueryConn),
        db_logoff(Conn),
        odbc_disconnect(Stream).

print_all_one_by_one(QueryConn):-
        db_one_tuple(QueryConn,Answer), 
        Answer\=[],
        !,
        format(" ~w \n",Answer),
        print_all_one_by_one(QueryConn).
print_all_one_by_one(_QueryConn):-
        write(' Finished fetching query statement.'),
        nl.

main4:- %% inserting a tuple into the Literature database
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream),
        db_login(Stream,'Literature',dba,sql,Conn),
        db_stmt_handle(Conn, 
               "INSERT INTO AUTHORS values ('Martin Gaite',
                'Carmen',10,'1910-7-10 00:00:00:000')",_QueryConn),
        db_logoff(Conn),
        odbc_disconnect(Stream).
        
main5:- %% creating a view
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream),
        db_login(Stream,'Literature',dba,sql,Conn),
        db_stmt_handle(Conn,
               "CREATE VIEW AntoniosDateOfBirth AS SELECT 
                LastName,Date_of_birth FROM 
                AUTHORS where FirstName='Antonio';",_QueryConn),
        db_logoff(Conn),
        odbc_disconnect(Stream).        

main6:- %% printing the view
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream),
        db_login(Stream,'Literature',dba,sql,Conn),
        db_eval_sql(Conn,"select * from AntoniosDateOfBirth",Term),
        write(Term),
        db_logoff(Conn),
        odbc_disconnect(Stream).

main7:- %% dropping a view
        odbc_connect('r2d5.dia.fi.upm.es':2020,Stream),
        db_login(Stream,'Literature',dba,sql,Conn),
        db_eval_sql(Conn,"DROP VIEW AntoniosDateOfBirth",Term),
        write(Term),
        db_logoff(Conn),
        odbc_disconnect(Stream).

Usage and interface (db_client)

Documentation on exports (db_client)

PREDICATE: odbc_connect/2:

Usage: odbc_connect(+DbAddress,-(Stream))

PREDICATE: db_login/5:

Usage: db_login(+Stream,+DbName,+User,+Passwd,-(DbConnection))

REGTYPE: socketname/1:
socketname(IPAddress:PortNumber) :-
        atm(IPAddress),
        int(PortNumber).

Usage: socketname(IPP)

REGTYPE: dbname/1:
dbname(DBId) :-
        atm(DBId).

Usage: dbname(DBId)

REGTYPE: user/1:
user(User) :-
        atm(User).

Usage: user(User)

REGTYPE: passwd/1:
passwd(Passwd) :-
        atm(Passwd).

Usage: passwd(Passwd)

REGTYPE: dbconnection/1:
dbconnection(dbconnection(DbStream,DbHandle)) :-
        stream(DbStream),
        dbhandle(DbHandle).

Usage: dbconnection(H)

PREDICATE: db_eval_sql/3:

Usage: db_eval_sql(+DbConnection,+Sentence,-(AnswerTableTerm))

REGTYPE: answertableterm/1:

Represents the types of responses that will be returned from the ODBC database interface. These can be a set of answer tuples, or the atom ok in case of a successful addition or deletion.

Usage: answertableterm(AT)

REGTYPE: tuple/1:
tuple(T) :-
        list(T,atm).

Usage: tuple(T)

PREDICATE: db_stmt_handle/3:

Usage: db_stmt_handle(+DbConnection,+Sentence,-(DbQueryConnection))

REGTYPE: dbqueryconnection/1:
dbqueryconnection(dbqueryconnection(DbStream,DbHandle,StmtHandle)) :-
        stream(DbStream),
        dbhandle(DbHandle),
        stmthandle(StmtHandle).

Usage: dbqueryconnection(H)

PREDICATE: db_one_tuple/2:

Usage: db_one_tuple(+DbQueryConnection,-(TupleTerm))

REGTYPE: answertupleterm/1:
answertupleterm([]).
answertupleterm(tup(T)) :-
        tuple(T).

Usage: answertupleterm(X)

PREDICATE: db_get_tables/2:

Usage: db_get_tables(+DbConnection,-(Tables))

PREDICATE: db_table_types/3:

Usage: db_table_types(+DbConnection,+Table,-(AttrTypes))

PREDICATE: db_logoff/1:

Usage: db_logoff(+DbConnection)

PREDICATE: odbc_disconnect/1:

Usage: odbc_disconnect(+Stream)

PREDICATE: match_string/3:

No further documentation available for this predicate.

Documentation on internals (db_client)

REGTYPE: dbhandle/1:
dbhandle(H) :-
        string(H).

Usage: dbhandle(H)

REGTYPE: stmthandle/1:
stmthandle(H) :-
        string(H).

Usage: stmthandle(H)

Known bugs and planned improvements (db_client)


Go to the first, previous, next, last section, table of contents.