aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/doc/ecpg.texinfo
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/doc/ecpg.texinfo')
-rw-r--r--src/interfaces/ecpg/doc/ecpg.texinfo679
1 files changed, 679 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/doc/ecpg.texinfo b/src/interfaces/ecpg/doc/ecpg.texinfo
new file mode 100644
index 00000000000..a76bc8b2a5a
--- /dev/null
+++ b/src/interfaces/ecpg/doc/ecpg.texinfo
@@ -0,0 +1,679 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename ecpg
+@settitle Ecpg - Embedded SQL in C for Postgres95
+@setchapternewpage odd
+@c %**end of header
+
+@ifinfo
+This file documents an embedded SQL in C package for Postgres 95.
+
+Copyright 1996 Linus Tolke
+
+Permission is granted to copy and use in the same way as you are allowed
+to copy and use the rest of the Postgres 95.
+@end ifinfo
+
+@c This title page illustrates only one of the
+@c two methods of forming a title page.
+
+@titlepage
+@title ECPG
+@subtitle Embedded SQL in C for Postgres95
+@author Linus Tolke
+
+@c The following two commands
+@c start the copyright page.
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1996 Linus Tolke
+
+Published by Linus Tolke
+
+Permission is granted to copy and use in the same way as you are allowed
+to copy and use the rest of the Postgres 95.
+@end titlepage
+
+@node Top, Why embedded SQL, (dir), (dir)
+@comment node-name, next, previous, up
+
+@ifinfo
+Ecpg is an embedded sql preprocessor for C and library for Postgres95.
+
+It is written by Linus Tolke <linus@@epact.se>
+
+This texinfo page and the code is all the documentation you get. There
+will not be any separate manual page, installation description or
+buglist.
+@end ifinfo
+
+@menu
+* Why embedded SQL::
+* Simple description of the concept::
+* How to use it::
+* How it works::
+* Limitations::
+* Porting from other DBMSs::
+* Installation::
+* Index::
+
+ --- The Detailed Node Listing ---
+
+How to use it
+
+* Preprocessor::
+* Library::
+* Error handling::
+
+How it works
+
+* The preprocessor::
+* A complete example::
+* The library::
+
+Limitations
+
+* What can be done with this concept::
+* What will never be included and why::
+@end menu
+
+@node Why embedded SQL, Simple description of the concept, Top, Top
+@comment node-name, next, previous, up
+@chapter Why embedded SQL
+
+Embedded SQL has some small advantages over other ways to handle SQL
+queries. It takes care of all the tidious moving of information to and
+from variables in your c-program.
+
+There is an ANSI-standard describing how the embedded language should
+work. Most embedded sql preprocessors I have seen and heard of makes
+extensions so it is difficult to obtain portability even between them
+anyway. I have not read the standard but I hope that my implementation
+does not deviate to much and that it would be possible to port programs
+with embedded sql written for other DBMS:s to Postgres95 and thus
+promoting the spirit of free software.
+
+
+@node Simple description of the concept, How to use it, Why embedded SQL, Top
+@comment node-name, next, previous, up
+@chapter Simple description of the concept
+
+You write your program in C with some special sql things.
+For declaring variables that can be used in SQL statements you need to
+put them in a special declare section.
+You use a special syntax for the sql queries.
+
+Before compiling you run the file through the embedded sql c
+preprocessor and it converts the SQL statements you used to function
+calls with the variables used as arguments. Both variables that are used
+as input to the SQL statements and variables that will contain the
+result are passed.
+
+Then you compile and at link time you link with a special library that
+contains the functions used. These functions (actually it is mostly one
+single function) fetches the information from the arguments, performs
+the SQL query using the ordinary interface (pq) and puts back
+the result in the arguments dedicated for output.
+
+Then you run your program and when the control arrives to the SQL
+statement the SQL statement is performed against the database and you
+can continue with the result.
+
+
+@node How to use it, How it works, Simple description of the concept, Top
+@comment node-name, next, previous, up
+@chapter How to use it
+
+This chapter describes how to use the ECPG tool.
+
+@menu
+* Preprocessor::
+* Library::
+* Error handling::
+@end menu
+
+@node Preprocessor, Library, How to use it, How to use it
+@comment node-name, next, previous, up
+@section Preprocessor
+
+@cindex preprocessor
+@cindex @code{ecpg}
+The preprocessor is called @code{ecpg}. After installation it resides in
+the postgres @code{bin} directory. It accepts two arguments like
+@code{iname=filename} and @code{oname=filename}. Both arguments must be
+present or an error will occur.
+
+In the alpha version the preprocessor has a lot of flaws:
+@table @asis
+@item Debug text output
+It writes every token parsed to the @code{stderr}.
+@item Looses line numbering
+The line numbers and file name information is lost in the preprocessor.
+This means that when running the program through a debugger you end up
+in the @code{.c}-file that is the output from the preprocessor and not
+in the input to the preprocessor. This can be fixed!
+@item The interface is strange, to say the least
+It would be better with a consistant unix arguments interface, perhaps
+builtin default filenames so they won't have to be given all the time.
+@item Cannot do syntax checking on your SQL statements
+Whatever you write is copied more or less exactly to the postgres95 and
+you will not be able to locate your errors until run-time.
+@end table
+
+@node Library, Error handling, Preprocessor, How to use it
+@section Library
+
+@cindex library functions
+@cindex @code{libecpg.a}
+@cindex @code{-lecpg}
+The library is called @code{libecpg.a}. The library used the pq library
+for the communication to the postgres server so you will have to link
+your program with @code{-lecpg -lpq}.
+
+The library has some methods that are "hidden" but that could prove very
+useful sometime.
+
+@table @asis
+@item @code{ECPGdebug(int)}
+@cindex @code{ECPGdebug(int)}
+@cindex debuglogging
+If this is called, with a non-zero argument, then debuglogging is turned
+on. Debuglogging is done on @code{stderr}. Most SQL statement logs its
+arguments and result.
+
+The most important one (@code{ECPGdo}) that is called on all SQL
+statements except @code{EXEC SQL COMMIT}, @code{EXEC SQL ROLLBACK},
+@code{EXEC SQL CONNECT} logs both its expanded string, i.e. the string
+with all the input variables inserted, and the result from the
+postgres95 server. This can be very useful when searching for errors
+in your SQL statements.
+
+@item @code{ECPGstatus()}
+@cindex @code{ECPGstatus()}
+This method returns TRUE if we are connected to a database and FALSE if
+not.
+@end table
+
+@node Error handling, , Library, How to use it
+@comment node-name, next, previous, up
+@section Error handling
+
+@cindex @code{sqlca.h}
+@cindex @code{struct sqlca}
+@cindex @code{sqlcode}
+@cindex @code{error messages}
+To be able to detect errors from the postgres server you include a line
+like:
+@example
+exec sql include sqlca;
+@end example
+in the include section of your file. This will define a struct and a
+variable with the name @code{sqlca} as following:
+@example
+struct sqlca @{
+ int sqlcode;
+ struct @{
+ int sqlerrml;
+ char sqlerrmc[1000];
+ @} sqlerrm;
+@} sqlca;
+@end example
+
+If an error occured in the last SQL statement then @code{sqlca.sqlcode}
+will be non-zero. If @code{sqlca.sqlcode} is less that 0 then this is
+some kind of serious error, like the database definition does not match
+the query given. If it is bigger than 0 then this is a normal error like
+the table did not contain the requested row.
+
+sqlca.sqlerrm.sqlerrmc will contain a string that describes the error.
+The string ends with @code{line 23.} where the line is the line number
+in the source file (actually the file generated by the preprocessor but
+I hope I can fix this to be the line number in the input file.)
+
+List of errors that can occur:
+@cindex error list
+@table @asis
+@item -1, Unsupported type %s on line %d.
+Does not normally occur. This is a sign that the preprocessor has
+generated something that the library does not know about. Perhaps you
+are running incompatible versions of the preprocessor and the library.
+
+@item -1, Too many arguments line %d.
+@itemx -1, Too few arguments line %d.
+The preprocessor has goofed up and generated some incorrect code.
+
+@item -1, Error starting transaction line %d.
+Postgres95 signalled to us that we cannot open the connection.
+
+@item -1, Postgres error: %s line %d.
+Some postgres95 error. The message contains the error message from the
+postgres95 backend.
+
+@item 1, Data not found line %d.
+This is a "normal" error that tells you that what you are quering cannot
+be found or we have gone through the cursor.
+
+@item -1, To many matches line %d.
+This means that the query has returned several lines. The @code{SELECT}
+you made probably was not unique.
+
+@item -1, Not correctly formatted int type: %s line %d.
+This means that the host variable is of an @code{int} type and the field
+in the postgres95 database is of another type and contains a value that
+cannot be interpreted as an @code{int}. The library uses @code{strtol}
+for this conversion.
+
+@item -1, Not correctly formatted unsigned type: %s line %d.
+This means that the host variable is of an @code{unsigned int} type and
+the field in the postgres95 database is of another type and contains a
+value that cannot be interpreted as an @code{unsigned int}. The library
+uses @code{strtoul} for this conversion.
+
+@item -1, Not correctly formatted floating point type: %s line %d.
+This means that the host variable is of an @code{float} type and
+the field in the postgres95 database is of another type and contains a
+value that cannot be interpreted as an @code{float}. The library
+uses @code{strtod} for this conversion.
+
+@item -1, Too few arguments line %d.
+This means that the postgres95 has returned more records than we have
+matching variables. Perhaps you have forgotten a couple of the host
+variables in the @code{INTO :var1,:var2}-list.
+
+@item -1, Too many arguments line %d.
+This means that th postgres95 has returned fewer records than we have
+host variables. Perhaps you have to many host variables in the
+@code{INTO :var1,:var2}-list.
+
+@item -1, Empty query line %d.
+Postgres95 returned PGRES_EMPTY_QUERY.
+
+@item -1, Error: %s line %d.
+Postgres95 returned PGRES_NONFATAL_ERROR, PGRES_FATAL_ERROR or
+PGRES_BAD_RESPONSE. Which one and why is hopefully explained in the
+message.
+
+@item -1, Postgres error line %d.
+Postgres95 returns something that the library does not know how to
+handle. This is probably because the version of postgres95 does not
+match the version of the ecpg library.
+
+@item -1, Error committing line %d.
+Error during @code{COMMIT}. @code{EXEC SQL COMMIT} is translated to an
+@code{end} operation in postgres95 and that is the operation that could
+not be performed.
+
+@item -1, Error rolling back line %d.
+Error during @code{ROLLBACK}. @code{EXEC SQL ROLLBACK} is translated to
+an @code{abort} operation in postgres95 and that is the operation that
+could not be performed.
+
+@item -1, ECPGconnect: could not open database %s.
+The connect to the database did not work.
+
+@end table
+
+@node How it works, Limitations, How to use it, Top
+@chapter How it works
+@comment node-name, next, previous, up
+
+This chapter describes how the things work. The ambition is to make this
+chapter contain things for those that want to have a look inside and the
+chapter on How to use it should be enough for all normal questions.
+
+So, read this before looking at the internals of the @code{ecpg}. If
+you are not interested in how it really works, skip this chapter.
+
+@menu
+* The preprocessor::
+* A complete example::
+* The library::
+@end menu
+
+@node The preprocessor, A complete example, How it works, How it works
+@comment node-name, next, previous, up
+@section The preprocessor
+
+First three lines are written to the output. A comment and two include
+lines necessary for the interface to the library.
+
+Then the preprocessor works in one pass only reading the input file and
+writing to the output as it goes along. Normally it just echoes
+everything to the output without looking at it further.
+
+When it comes to an @code{EXEC SQL} statements it interviens and
+changes them depending on what iit is. The @code{EXEC SQL} statement can
+be one of these:
+
+@itemize @bullet
+
+@item Declare sections
+@cindex Declare section
+Declare sections begins with
+@example
+exec sql begin declare section;
+@end example
+and ends with
+@example
+exec sql end declare section;
+@end example
+In the section only variable declarations are allowed. Every variable
+declare within this section is also entered in a list of variables
+indexed on their name together with the corresponding type.
+
+The declaration is echoed to the file to make the variable a normal
+C-variable also.
+
+The special types VARCHAR and VARCHAR2 are converted into a named struct
+for every variable. A declaration like:
+@example
+VARCHAR var[180];
+@end example
+is converted into
+@example
+struct varchar_var @{ int len; char arr[180]; @} var;
+@end example
+
+
+@item Include statements
+@cindex Include statement
+An include statement looks like:
+@example
+exec sql include filename;
+@end example
+It is converted into
+@example
+#include <filename.h>
+@end example
+
+@item Connect statement
+@cindex Connect statement
+A connect statements looks like:
+@example
+exec sql connect 'databasename';
+@end example
+That statement is converted into
+@example
+ECPGconnect("databasename");
+@end example
+
+@item Open cursor statement
+@cindex Open cursor statement
+An open cursor statement looks like:
+@example
+exec sql open blablabla;
+@end example
+and that is ignore and not copied from the output.
+
+@item Commit statement
+@cindex Commit statement
+A commit statement looks like
+@example
+exec sql commit;
+@end example
+and is translated on the output to
+@example
+ECPGcommit(__LINE__);
+@end example
+
+@item Rollback statement
+@cindex Rollback statement
+A rollback statement looks like
+@example
+exec sql rollback;
+@end example
+and is translated on the output to
+@example
+ECPGrollback(__LINE__);
+@end example
+
+@item Other statements
+Other SQL statements are other statements that start with
+@code{exec sql} and ends with @code{;}. Everything inbetween is treated
+as an sql statement and parsed for variable substitution.
+
+Variable substitution occur when a symbol starts with a colon
+(@code{:}). Then a variable with that name is found among the variables
+that were previously declared within a declare section and depending on
+whether or not the SQL statements knows it to be a variable for input or
+output the pointers to the variables are written to the output to allow
+for access by the function.
+
+For every variable that is part of the SQL request the function gets
+another five arguments.
+@enumerate
+@item The type as a special symbol
+@item A pointer to the value
+@item The size of the variable if it is a varchar
+@item Number of elements in the array (for array fetches)
+@item The offset to the next element in the array (for array fetches)
+@end enumerate
+Since the array fetches are not implemented yet the two last arguments
+are not really important. They could perhaps have been left out.
+
+@end itemize
+
+
+@node A complete example, The library, The preprocessor, How it works
+@comment node-name, next, previous, up
+@section A complete example
+Here is a complete example describing the output of the preprocessor:
+@example
+exec sql begin declare section;
+int index;
+int result;
+exec sql end declare section;
+...
+ exec sql select res into :result from mytable where index = :index;
+@end example
+is translated into:
+@example
+/* These two include files are added by the preprocessor */
+#include <ecpgtype.h>
+#include <ecpglib.h>
+/* exec sql begin declare section */
+
+ int index;
+ int result;
+/* exec sql end declare section */
+
+...
+ ECPGdo(__LINE__, "select res from mytable where index = ;;",
+ ECPGt_int,&index,0,0,sizeof(int),
+ ECPGt_EOIT,
+ ECPGt_int,&result,0,0,sizeof(int),
+ ECPGt_EORT );
+@end example
+(the indentation in this manual is added for readability and not
+something that the preprocessor can do.)
+
+
+@node The library, , A complete example, How it works
+@comment node-name, next, previous, up
+@section The library
+The most important function in the library is the @code{ECPGdo}
+function. It takes a variable amount of arguments. Hopefully we wont run
+into machines with limits on the amount of variables that can be
+accepted by a varchar function. This could easily add up to 50 or so
+arguments.
+
+The arguments are:
+@table @asis
+@item A line number
+This is a line number for the original line used in error messages only.
+@item A string
+This is the sql request that is to be issued. This request is modified
+by the input variables, i.e. the variables that where not known at
+compile time but are to be entered in the request. Where the variables
+should go the string contains @code{;;}.
+@item Input variables
+As described in the section about the preprocessor every input variable
+gets five arguments.
+@item ECPGt_EOIT
+An enum telling that there are no more input variables.
+@item Output variables
+As described in the section about the preprocessor every input variable
+gets five arguments. These variables are filled by the function.
+@item ECPGt_EORT
+An enum telling that there are no more variables.
+@end table
+
+All the SQL statements are performed in one transaction unless you issue
+a commit transaction. This works so that the first transaction or the
+first after a commit or rollback always begins a transaction.
+
+To be completed: entries describing the other entries.
+
+@node Limitations, Porting from other DBMSs, How it works, Top
+@chapter Limitations
+@comment node-name, next, previous, up
+
+I separate the limitations in two different groups. Those that are of
+the kind that I have not gotten around to it yet and those that I will
+never bother to look at.
+
+@menu
+* What can be done with this concept::
+* What will never be included and why::
+@end menu
+
+@node What can be done with this concept, What will never be included and why, Limitations, Limitations
+@comment node-name, next, previous, up
+@section What can be done with this concept
+
+This is a list of things that I have plans to include in some future.
+
+@table @asis
+
+@item no restriction to strings only
+The PQ interface, and most of all the PQexec function, that is used by
+the ecpg relies on that the request is built up as a string. In some
+cases, like when the data contains the null character, this will be a
+serious problem.
+
+@item line numbering
+The preprocessor should generate output with directions to the compiler
+to generate debugging code including the file name and line numbers of
+the input to the preprocessor.
+
+@item error codes
+There should be different error numbers for the different errors instead
+of just -1 for them all.
+
+@item library functions
+to_date et al.
+
+@item records
+@cindex records
+Possibility to define records or @code{struct}s in the declare section
+in a way that the record can be filled from one row in the database.
+
+This is a simpler way to handle an entire row at a time.
+
+@item array operations
+@cindex array operations
+Oracle has array operations that enhances speed. When implementing it in
+@code{ecpg} it is done for compatibility reasons only. For them to
+improve speed would require a lot more insight in the postgres internal
+mechanisms than I possess.
+
+@item indicator variables
+@cindex indicator variables
+@cindex @code{VARCHAR2}
+Oracle has indicator variables that tell if a value is @code{null} or if
+it is empty. This largely simplifies array operations and provides for a
+way to hack around some design flaws in the handling of @code{VARCHAR2}
+@footnote{like that an empty string isn't distinguishable from a
+@code{null} value}. I am not sure if this is an Oracle extension or part
+of the ANSI standard.
+
+@item typedefs
+@cindex typedef
+As well as complex types like records and arrays, typedefs would be
+a good thing to take care of.
+
+@item conversion of scripts
+@cindex conversion of scripts
+To set up a database you need a few scripts with table definitions and
+other configuration parameters. If you have these scripts for an old
+database you would like to just apply them to get a postgres database
+that works in the same way.
+
+The functionality could be accomplished with some conversion scripts.
+Speed will never be accomplished in this way. To do this you need a
+bigger insight in the database construction and the use of the database
+than could be realised in a script.
+
+@end table
+
+
+@node What will never be included and why, , What can be done with this concept, Limitations
+@comment node-name, next, previous, up
+@section What will never be included and why
+
+@table @asis
+
+@item oracles single tasking possibility
+@cindex single tasking
+Oracle version 7.0 on AIX 3 uses the OS-supported locks on the shared
+memory segments and allows the application designer to link an
+application in a so called single tasking way. Instead of starting one
+client process per application process both the database part and the
+application part is run in the same process. In later versions of oracle
+this is no longer supported.
+
+This would require a total redesign of the postgres access model and
+that effort can not justify the performance gained.
+
+@end table
+
+
+@node Porting from other DBMSs, Installation, Limitations, Top
+@chapter Porting from other DBMSs
+@comment node-name, next, previous, up
+
+To be written by persons that knows the different DBMSs and that
+actually does port something...
+
+@node Installation, Index, Porting from other DBMSs, Top
+@comment node-name, next, previous, up
+@chapter Installation
+@cindex installation
+
+Step by step installation (if everything goes ok):
+
+@enumerate
+@item Fetch everything and unpack
+
+If you are reading this documentation you have probably managed this
+step already.
+
+@item @code{./configure --with-postgres=/path/to/postgres}
+
+This is to be done in the ecpg directory, i.e. the directory containing
+the @file{configure} file.
+
+The @file{/path/to/postgres} is the path to the installed postgres. It
+points out the directory where the include, lib and bin directories
+reside. The include directory is used when building the library and all
+three of them become residents for ecpg include files, library and
+binaries.
+
+@item @code{make all}
+
+@item As the postgres user @code{make install}
+
+The postgres user is the owner of the postgres include, lib and bin
+directories. The installation procedure installs its files there
+alongside the postgres files.
+@item Done.
+
+@end enumerate
+
+
+@node Index, , Installation, Top
+@unnumbered Index
+
+@printindex cp
+
+@contents