Index: openacs-4/packages/acs-core-docs/www/db-api-detailed.html =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-core-docs/www/db-api-detailed.html,v diff -u -r1.40 -r1.40.2.1 --- openacs-4/packages/acs-core-docs/www/db-api-detailed.html 16 Feb 2005 00:21:02 -0000 1.40 +++ openacs-4/packages/acs-core-docs/www/db-api-detailed.html 26 Aug 2005 00:02:29 -0000 1.40.2.1 @@ -1,22 +1,22 @@ -
By Jon Salz. Revised and expanded by Roberto Mello (rmello at fslc dot usu dot edu), July 2002.
+By Jon Salz. Revised and expanded by Roberto Mello (rmello at fslc dot usu dot edu), July 2002.
OpenACS docs are written by the named authors, and may be edited by OpenACS documentation staff. -Tcl procedures: /packages/acs-kernel/10-database-procs.tcl
Tcl initialization: /packages/acs-kernel/database-init.tcl
Tcl procedures: /packages/acs-kernel/10-database-procs.tcl
Tcl initialization: /packages/acs-kernel/database-init.tcl
One of OpenACS's great strengths is that code written for it is very close to the database. It is very easy to interact with the database from anywhere within OpenACS. Our goal is to develop a coherent API for database access which makes this even easier.
There were four significant problems with the way OpenACS previously used the -database (i.e., directly through the ns_db interface):
Handle management. We required code to pass database
+database (i.e., directly through the ns_db
interface):
Handle management. We required code to pass database handles around, and for routines which needed to perform database access but didn't receive a database handle as input, it was difficult to know from which of the three "magic pools" (main, subquery, and log) to allocate a new handle. -
Nested transactions. In our Oracle driver, begin -transaction really means "turn auto-commit mode off" and -end transaction means "commit the current transaction and +
Nested transactions. In our Oracle driver, begin
+transaction
really means "turn auto-commit mode off" and
+end transaction
means "commit the current transaction and
turn auto-commit mode on." Thus if transactional code needed to call a
routine which needed to operate transactionally, the semantics were
non-obvious. Consider:
@@ -34,25 +34,25 @@ }
-This would insert greeble #33 and do all the stuff in foo
-transactionally, but the end transaction in foo
+This would insert greeble #33 and do all the stuff in foo
+transactionally, but the end transaction
in foo
would actually cause a commit, and greeble #50 would later be inserted in
auto-commit mode. This could cause subtle bugs: e.g., in the case that the
insert for greeble #50 failed, part of the "transaction" would have
already have been committed!. This is not a good thing.
-
Unorthodox use of variables. The standard mechanism for +
Unorthodox use of variables. The standard mechanism for
mapping column values into variables involved the use of the
-set_variables_after_query routine, which relies on an uplevel
-variable named selection (likewise for
-set_variables_after_subquery and subselection).
+set_variables_after_query
routine, which relies on an uplevel
+variable named selection
(likewise for
+set_variables_after_subquery
and subselection
).
-
Hard-coded reliance on Oracle. It's difficult to +
Hard-coded reliance on Oracle. It's difficult to
write code supporting various different databases (dynamically using the
appropriate dialect based on the type of database being used, e.g., using
-DECODE on Oracle and CASE ... WHEN on
+DECODE
on Oracle and CASE ... WHEN
on
Postgres).
The Database Access API addresses the first three problems by:
making use of database handles transparent
wrapping common database operations (including transaction management) in @@ -66,9 +66,9 @@
To be clear, SQL abstraction is not fully implemented in OpenACS 3.3.1. The statement names supplied to each call are not used by the API at all. The API's design for SQL abstraction is in fact incomplete; -unresolved issues include:
how to add WHERE clause criteria dynamically
how to build a dynamic ORDER BY clause (Ben Adida has a +unresolved issues include:
how to add WHERE
clause criteria dynamically
how to build a dynamic ORDER BY
clause (Ben Adida has a
proposed solution for this)
how to define a statement's formal interface (i.e., what bind
-variables it expects, what columns its SELECT clause must
+variables it expects, what columns its SELECT
clause must
contain if it's a query) without actually implementing the statement in a
specific SQL dialect
So why is the incremental change of adding statement naming to the API worth @@ -77,8 +77,8 @@ design. Therefore, we know that the effort will not be wasted, and taking advantage of the new support for bind variables will already require code that uses 3.3.0 version of the API to be updated. -
-set_variables_after_query is gone! (Well, it's still there, +
+set_variables_after_query
is gone! (Well, it's still there,
but you'll never need to use it.) The new API routines set local
variables automatically. For instance:
@@ -87,7 +87,7 @@ doc_body_append "Hello, $first_names $last_name!"
-Like ns_db 1row, this will bomb if the query doesn't return
+Like ns_db 1row
, this will bomb if the query doesn't return
any rows (no such user exists). If this isn't what you want, you can
write:
@@ -109,9 +109,9 @@ }
-That's right, db_foreach is now like ns_db
-select plus a while loop plus
-set_variables_after_query plus an if statement
+That's right, db_foreach
is now like ns_db
+select
plus a while
loop plus
+set_variables_after_query
plus an if
statement
(containing code to be executed if no rows are returned).
@@ -122,7 +122,7 @@ doc_body_append "There aren't any users with last names beginnings with S!" } -
The new API keeps track of which handles are in use, and automatically allocates new handles when they are necessary (e.g., to perform subqueries while a select is active). For example: @@ -148,10 +148,10 @@
A new handle isn't actually allocated and released for every selection,
of course - as a performance optimization, the API keeps old handles around
-until db_release_unused_handles is invoked (or the script
+until db_release_unused_handles
is invoked (or the script
terminates).
-
Note that there is no analogue to ns_db gethandle - the -handle is always automatically allocated the first time it's needed.
Introduction
+
Note that there is no analogue to ns_db gethandle
- the
+handle is always automatically allocated the first time it's needed.
Introduction
Most SQL statements require that the code invoking the statement pass along data associated with that statement, usually obtained from the user. For instance, in order to delete a WimpyPoint presentation, a Tcl script might @@ -161,10 +161,10 @@ delete from wp_presentations where presentation_id = some_presentation_id
-where some_presentation_id is a number which is a valid
+where some_presentation_id
is a number which is a valid
presentation ID of the presentation I want to delete. It's easy to write
code handling situations like this since SQL statements can include
-bind variables, which represent placeholders for actual
+bind variables, which represent placeholders for actual
data. A bind variable is specified as a colon followed by an identifier, so
the statement above can be coded as:
@@ -175,15 +175,15 @@
When this SQL statement is invoked, the value for the bind variable
-:some_presentation_id is pulled from the Tcl variable
-$some_presentation_id (in the caller's environment). Note
+:some_presentation_id
is pulled from the Tcl variable
+$some_presentation_id
(in the caller's environment). Note
that bind variables are not limited to one per statement; you can use an
arbitrary number, and each will pull from the correspondingly named Tcl
-variable. (Alternatively, you can also specify an list or ns_set
+variable. (Alternatively, you can also specify an list or ns_set
providing bind variables' values; see Usage.)
The value of a bind variable is taken literally by the database driver, so
there is never any need to put single-quotes around the value for a bind
-variable, or to use db_quote to escape single-quotes contained
+variable, or to use db_quote
to escape single-quotes contained
in the value. The following works fine, despite the apostrophe:
set exclamation "That's all, folks!" @@ -192,12 +192,12 @@
Note that you can use a bind variable in a SQL statement only where you
could use a literal (a number or single-quoted string). Bind variables cannot
be placeholders for things like SQL keywords, table names, or column names,
-so the following will not work, even if $table_name is set
+so the following will not work, even if $table_name
is set
properly:
select * from :table_name -
Why Bind Variables Are Useful
+
Why Bind Variables Are Useful
Why bother with bind variables at all - why not just write the Tcl statement above like this:
@@ -208,10 +208,10 @@
(Note the use of double-quotes to allow the variable reference to
-$some_presentation_id to be interpolated in.) This will work,
+$some_presentation_id
to be interpolated in.) This will work,
but consider the case where some devious user causes
-some_presentation_id to be set to something like '3 or
-1 = 1', which would result in the following statement being
+some_presentation_id
to be set to something like '3 or
+1 = 1'
, which would result in the following statement being
executed:
@@ -221,18 +221,18 @@ This deletes every presentation in the database! Using bind variables eliminates this gaping security hole: since bind variable values are taken literally. Oracle will attempt to delete presentations whose presentation ID -is literally '3 or 1 = 1' (i.e., no presentations, since -'3 or 1 = 1' can't possibly be a valid integer -primary key for wp_presentations. In general, since Oracle +is literally'3 or 1 = 1'
(i.e., no presentations, since +'3 or 1 = 1'
can't possibly be a valid integer +primary key forwp_presentations
. In general, since Oracle always considers the values of bind variables to be literals, it becomes more difficult for users to perform URL surgery to trick scripts into running dangerous queries and DML. -Usage
Every db_* command accepting a SQL command as an argument -supports bind variables. You can either
specify the -bind switch to provide a set with bind variable -values, or
specify the -bind switch to explicitly provide a list of +
Usage
Every
db_*
command accepting a SQL command as an argument +supports bind variables. You can either
specify the
-bind
switch to provide a set with bind variable +values, orspecify the
-bind
switch to explicitly provide a list of bind variable names and values, ornot specify a bind variable list at all, in which case Tcl variables are used as bind variables.
-The default behavior (i.e., if the -bind switch is omitted) is +The default behavior (i.e., if the
-bind
switch is omitted) is that these procedures expect to find local variables that correspond in name to the referenced bind variables, e.g.:@@ -252,9 +252,9 @@ }-The value of the local Tcl variable user_id (123456) is bound to -the user_id bind variable. -
The -bind switch can takes the name of an ns_set +The value of the local Tcl variable
user_id
(123456) is bound to +theuser_id
bind variable. +The
-bind
switch can takes the name of anns_set
containing keys for each bind variable named in the query, e.g.:set bind_vars [ns_set create] @@ -273,7 +273,7 @@ }-Alternatively, as an argument to -bind you can specify a list of +Alternatively, as an argument to
-bind
you can specify a list of alternating name/value pairs for bind variables:@@ -288,14 +288,14 @@ # of "administrator" } -+
When processing a DML statement, Oracle coerces empty strings into -null. (This coercion does not occur in the -WHERE clause of a query, i.e. -col = '' and -col is null are not equivalent.) +
null
. (This coercion does not occur in the +WHERE
clause of a query, i.e. +col = ''
and +col is null
are not equivalent.)As a result, when using bind variables, the only way to make Oracle set a -column value to null is to set the corresponding bind variable +column value to
null
is to set the corresponding bind variable to the empty string, since a bind variable whose value is the string "null" will be interpreted as the literal string "null".These Oracle quirks complicate the process of writing clear and abstract @@ -321,13 +321,13 @@
Since databases other than Oracle do not coerce empty strings into -null, this code has different semantics depending on the +
null
, this code has different semantics depending on the underlying database (i.e., the row that gets inserted may not have null as its column values), which defeats the purpose of SQL abstraction.Therefore, the Database Access API provides a database-independent way to -represent null (instead of the Oracle-specific idiom of the -empty string): db_null.
Use it instead of the empty string whenever you want to set a column value -explicitly to null, e.g.:
+representnull
(instead of the Oracle-specific idiom of the +empty string):db_null
.Use it instead of the empty string whenever you want to set a column value +explicitly to
null
, e.g.:set bar [db_null] set baz [db_null] @@ -336,15 +336,15 @@ # # sets the values for both the "bar" and "baz" columns to null -We now require that each SQL statement be assigned a logical name for the statement that is unique to the procedure or page in which it is defined. This is so that (eventually) we can implement logically named statements with alternative SQL for non-Oracle databases (e.g., Postgres). More on this later. -
-Normally, db_foreach, db_0or1row, and -db_1row places the results of queries in Tcl variables, so you +
+Normally,
db_foreach
,db_0or1row
, and +db_1row
places the results of queries in Tcl variables, so you can say:@@ -356,10 +356,10 @@ However, sometimes this is not sufficient: you may need to examine the rows returned, to dynamically determine the set of columns returned by the query, or to avoid collisions with existing variables. You can use the --column_array and -column_set switches to -db_foreach, db_0or1row, and db_1row to +-column_array
and-column_set
switches to +db_foreach
,db_0or1row
, anddb_1row
to instruct the database routines to place the results in a Tcl array or -ns_set, respectively, where the keys are the column names and +ns_set
, respectively, where the keys are the column names and the values are the column values. For example:@@ -373,28 +373,28 @@will write something like: -
first_names is Jon. last_name is Salz.
first_names is Lars. last_name is Pind.
first_names is Michael. last_name is Yoon.
-Note that you never have to use ns_db anymore (including -ns_db gethandle)! Just start doing stuff, and (if you want) call -db_release_unused_handles when you're done as a hint to +
first_names is Jon. last_name is Salz.
first_names is Lars. last_name is Pind.
first_names is Michael. last_name is Yoon.
+Note that you never have to use
ns_db
anymore (including +ns_db gethandle
)! Just start doing stuff, and (if you want) call +db_release_unused_handles
when you're done as a hint to release the database handle. -
- db_null +
db_null
-db_null +db_null
Returns a value which can be used in a bind variable to represent the SQL -value null. See Nulls and Bind Variables +value
null
. See Nulls and Bind Variables above.- -db_foreach +
db_foreach
-db_foreach statement-name sql [ -bind bind_set_id | -bind bind_value_list ] \ +db_foreach statement-name sql [ -bind bind_set_id | -bind bind_value_list ] \ [ -column_array array_name | -column_set set_name ] \ code_block [ if_no_rows if_no_rows_block ] -Performs the SQL query sql, executing -code_block once for each row with variables set to -column values (or a set or array populated if -column_array or -column_set is specified). If the query returns no rows, executes -if_no_rows_block (if provided).
Example:
+Performs the SQL query
sql
, executing +code_block
once for each row with variables set to +column values (or a set or array populated if-column_array
or +column_set
is specified). If the query returns no rows, executes +if_no_rows_block
(if provided).Example:
db_foreach select_foo "select foo, bar from greeble" { doc_body_append "<li>foo=$foo; bar=$bar\n" @@ -403,72 +403,72 @@ }-The code block may contain break statements (which terminate the -loop and flush the database handle) and continue statements -(which continue to the next row of the loop).
- db_1row
-db_1row statement-name sql [ -bind bind_set_id | -bind bind_value_list ] \ +The code block may containbreak
statements (which terminate the +loop and flush the database handle) andcontinue
statements +(which continue to the next row of the loop).db_1row
+db_1row statement-name sql [ -bind bind_set_id | -bind bind_value_list ] \ [ -column_array array_name | -column_set set_name ] -Performs the SQL query sql, setting variables to +
Performs the SQL query
sql
, setting variables to column values. Raises an error if the query does not return exactly 1 row.Example:
db_1row select_foo "select foo, bar from greeble where greeble_id = $greeble_id" # Bombs if there's no such greeble! # Now $foo and $bar are set. -- db_0or1row
-db_0or1row statement-name sql [ -bind bind_set_id | -bind bind_value_list ] \ +db_0or1row
+db_0or1row statement-name sql [ -bind bind_set_id | -bind bind_value_list ] \ [ -column_array array_name | -column_set set_name ] -Performs the SQL query sql. If a row is returned, +
Performs the SQL query
sql
. If a row is returned, sets variables to column values and returns 1. If no rows are returned, -returns 0. If more than one row is returned, throws an error.- db_string
-db_string statement-name sql [ -default default ] [ -bind bind_set_id | -bind bind_value_list ] +returns 0. If more than one row is returned, throws an error.db_string
+db_string statement-name sql [ -default default ] [ -bind bind_set_id | -bind bind_value_list ]Returns the first column of the result of SQL query -sql. If sql doesn't return a -row, returns default (or throws an error if -default is unspecified). Analogous to -database_to_tcl_string and -database_to_tcl_string_or_null. +
sql
. Ifsql
doesn't return a +row, returnsdefault
(or throws an error if +default
is unspecified). Analogous to +database_to_tcl_string
and +database_to_tcl_string_or_null
. -- db_nextval
-db_nextval sequence-name +db_nextval
+db_nextval sequence-nameReturns the next value for the sequence sequence-name (using a -SQL statement like SELECT sequence-name.nextval FROM -DUAL). If sequence pooling is enabled for the sequence, transparently +SQL statement like
SELECT
sequence-name
.nextval FROM +DUAL
). If sequence pooling is enabled for the sequence, transparently uses a value from the pool if available to save a round-trip to the database. -- db_list
-db_list statement-name sql [ -bind bind_set_id | -bind bind_value_list ] +db_list
+db_list statement-name sql [ -bind bind_set_id | -bind bind_value_list ]Returns a Tcl list of the values in the first column of the result of SQL -query sql. If sql doesn't +query
sql
. Ifsql
doesn't return any rows, returns an empty list. Analogous to -database_to_tcl_list. +database_to_tcl_list
. -- db_list_of_lists
-db_list_of_lists statement-name sql [ -bind bind_set_id | -bind bind_value_list ] +db_list_of_lists
+db_list_of_lists statement-name sql [ -bind bind_set_id | -bind bind_value_list ]Returns a Tcl list, each element of which is a list of all column values -in a row of the result of SQL query sql. If -sql doesn't return any rows, returns an empty list. -(Analogous to database_to_tcl_list_list.) +in a row of the result of SQL query
sql
. If +sql
doesn't return any rows, returns an empty list. +(Analogous todatabase_to_tcl_list_list
.) -- db_list_of_ns_sets
-db_list_of_ns_sets statement-name sql [ -bind bind_set_id | -bind bind_value_list ] +db_list_of_ns_sets
+db_list_of_ns_sets statement-name sql [ -bind bind_set_id | -bind bind_value_list ]Returns a list of ns_sets with the values of each column of each row - returned by the sql query specified. -
- db_dml
-db_dml statement-name sql \ + returned by thesql
query specified. +db_dml
+db_dml statement-name sql \ [ -bind bind_set_id | -bind bind_value_list ] \ [ -blobs blob_list | -clobs clob_list | -blob_files blob_file_list | -clob_files clob_file_list ] -Performs the DML or DDL statement sql.
If a length-n list of blobs or clobs is provided, then the SQL +
Performs the DML or DDL statement
sql
.If a length-n list of blobs or clobs is provided, then the SQL should return n blobs or clobs into the bind variables -:1, :2, ... :n. -blobs or clobs, if specified, +
:1
,:2
, ... :n
. +blobs
orclobs
, if specified, should be a list of individual BLOBs or CLOBs to insert; -blob_files or clob_files, if +blob_files
orclob_files
, if specified, should be a list of paths to files containing the data to -insert. Only one of -blobs, -clobs, --blob_files, and -clob_files may be provided.Example:
+insert. Only one of-blobs
,-clobs
, +-blob_files
, and-clob_files
may be provided.Example:
db_dml insert_photos " insert photos(photo_id, image, thumbnail_image) @@ -477,37 +477,37 @@ " -blob_files [list "/var/tmp/the_photo" "/var/tmp/the_thumbnail"]-This inserts a new row into the photos table, with the contents -of the files /var/tmp/the_photo and -/var/tmp/the_thumbnail in the image and -thumbnail columns, respectively. +This inserts a new row into the
photos
table, with the contents +of the files/var/tmp/the_photo
and +/var/tmp/the_thumbnail
in theimage
and +thumbnail
columns, respectively.- -db_write_clob, -db_write_blob, -db_blob_get_file +
db_write_clob
, +db_write_blob
, +db_blob_get_file
-db_write_clob statement-name sql [ -bind bind_set_id | -bind bind_value_list ] +db_write_clob statement-name sql [ -bind bind_set_id | -bind bind_value_list ] -db_write_blob statement-name sql [ -bind bind_set_id | -bind bind_value_list ] +db_write_blob statement-name sql [ -bind bind_set_id | -bind bind_value_list ] -db_blob_get_file statement-name sql [ -bind bind_set_id | -bind bind_value_list ] -Analagous to ns_ora write_clob/write_blob/blob_get_file. +db_blob_get_file statement-name sql [ -bind bind_set_id | -bind bind_value_list ] +
Analagous to
ns_ora write_clob/write_blob/blob_get_file
. -- db_release_unused_handles
-db_release_unused_handles -
Releases any allocated, unused database handles.
- db_transaction
-db_transaction code_block [ on_error { code_block } ] -Executes code_block transactionally. Nested -transactions are supported (end transaction is transparently -ns_db dml'ed when the outermost transaction completes). The -db_abort_transaction command can be used to abort all levels of -transactions. It is possible to specify an optional on_error +
db_release_unused_handles
+db_release_unused_handles +
Releases any allocated, unused database handles.
db_transaction
+db_transaction code_block [ on_error { code_block } ] +Executes
code_block
transactionally. Nested +transactions are supported (end transaction
is transparently +ns_db dml
'ed when the outermost transaction completes). The +db_abort_transaction
command can be used to abort all levels of +transactions. It is possible to specify an optionalon_error
code block that will be executed if some code in code_block throws -an exception. The variable errmsg will be bound in that scope. -If there is no on_error code, any errors will be propagated.Example:
+an exception. The variableerrmsg
will be bound in that scope. +If there is noon_error
code, any errors will be propagated.Example:
proc replace_the_foo { col } { db_transaction { @@ -536,33 +536,33 @@ print_the_foo ; # Writes out "foo is 8" -- db_abort_transaction +
db_abort_transaction
-db_abort_transaction +db_abort_transactionAborts all levels of a transaction. That is if this is called within several nested transactions, all of them are terminated. Use this insetead of -db_dml "abort" "abort transaction". +
db_dml "abort" "abort transaction"
. -- db_multirow
-db_multirow [ -local ] [ -append ] [ -extend column_list ] \ +db_multirow
+db_multirow [ -local ] [ -append ] [ -extend column_list ] \ var-name statement-name sql \ [ -bind bind_set_id | -bind bind_value_list ] \ code_block [ if_no_rows if_no_rows_block ]- Performs the SQL query sql, saving results in variables + Performs the SQL query
sql
, saving results in variables of the form - var_name:1, var_name:2, etc, - setting var_name:rowcount to the total number - of rows, and setting var_name:columns to a +var_name:1
,var_name:2
, etc, + settingvar_name:rowcount
to the total number + of rows, and settingvar_name:columns
to a list of column names.Each row also has a column, rownum, automatically added and set to the row number, starting with 1. Note that this will override any column in the SQL statement named 'rownum', also if you're using the Oracle rownum pseudo-column.
- If the -local is passed, the variables defined + If the
-local
is passed, the variables defined by db_multirow will be set locally (useful if you're compiling dynamic templates in a function or similar situations).@@ -575,19 +575,19 @@ multirow.
You may also add additional, computed columns to the multirow, using the - -extend { col_1 col_2 ... } switch. This is +
-extend { col_1 col_2 ... }
switch. This is useful for things like constructing a URL for the object retrieved by the query.If you're constructing your multirow through multiple queries with the same set of columns, but with different rows, you can use the - -append switch. This causes the rows returned by this query +
-append
switch. This causes the rows returned by this query to be appended to the rows already in the multirow, instead of starting a clean multirow, as is the normal behavior. The columns must match the columns in the original multirow, or an error will be thrown.- Your code block may call continue in order to skip a row - and not include it in the multirow. Or you can call break + Your code block may call
continue
in order to skip a row + and not include it in the multirow. Or you can callbreak
to skip this row and quit looping.@@ -602,18 +602,18 @@ } { set user_url [acs_community_member_url -user_id $user_id] } -
- db_resultrows
-db_resultrows +
db_resultrows
+db_resultrows
Returns the number of rows affected or returned by the previous statement. -
- db_with_handle
-db_with_handle var code_block -Places a database handle into the variable var and -executes code_block. This is useful when you don't -want to have to use the new API (db_foreach, -db_1row, etc.), but need to use database handles explicitly.
Example:
+db_with_handle
+db_with_handle var code_block +Places a database handle into the variable
var
and +executescode_block
. This is useful when you don't +want to have to use the new API (db_foreach
, +db_1row
, etc.), but need to use database handles explicitly.Example:
proc lookup_the_foo { foo } { db_with_handle db { @@ -632,92 +632,92 @@ }- - - + +
db_name -
- + + - - db_name - + +db_name
+Returns the name of the database, as returned by the driver.
- - - + +
db_type -
- + + - - db_type - + +db_type
+Returns the RDBMS type (i.e. oracle, postgresql) this OpenACS installation is using. The nsv ad_database_type is set up during the bootstrap process.
- - - + +
db_compatible_rdbms_p -
- + + - db_compatible_rdbms_p db_type + db_compatible_rdbms_p db_typeReturns 1 if the given db_type is compatible with the current RDBMS.
- - - + +
db_package_supports_rdbms_p -
- + + - db_package_supports_rdbms_p db_type_list + db_package_supports_rdbms_p db_type_listReturns 1 if db_type_list contains the current RDMBS type. A package intended to run with a given RDBMS must note this in it's package info file regardless of whether or not it actually uses the database.
- - - + +
db_legacy_package_p -
- + + - db_legacy_package_p db_type_list + db_legacy_package_p db_type_listReturns 1 if the package is a legacy package. We can only tell for certain if it explicitly supports Oracle 8.1.6 rather than the OpenACS more general oracle.
- - - + +
db_version -
- + + - db_version + db_versionReturns the RDBMS version (i.e. 8.1.6 is a recent Oracle version; 7.1 a recent PostgreSQL version.
- - - + +
db_current_rdbms -
- + + - db_current_rdbms + db_current_rdbmsReturns the current rdbms type and version.
- - - + +
db_known_database_types -
- + + - db_known_database_types + db_known_database_typesReturns a list of three-element lists describing the database engines known to OpenACS. Each sublist contains the internal database name (used in file