Forum OpenACS Development: Re: Win32-OpenACS Version 1.8

Collapse
Posted by Gustaf Neumann on
Dear Maurizio,
actually, there were four different errors in the log file:

a) ORACLE_HOME not set

[21/Apr/2008:21:07:50][5000.4828][-conn:0-] Error: Error sourcing c:/aolserver/servers/openacs/packages/acs-bootstrap-installer/installer/install.tcl:

(read trace on "env(env)")
invoked from within
"file join $env(ORACLE_HOME) bin sqlplus"

i can't say how serious this is, since surprisingly, most stuff is loaded correctly. With this problem, "db_source_sql_file" is be broken.

Do you have the environment variable ORACLE_HOME set?

b) incorrect path:

[21/Apr/2008:21:12:34][2460.5568][-conn:0-] Notice: Loading data file c:/aolserver/servers/openacs/packages/ref-timezones/sql/oracl
e/00-timezones.ctl...
[21/Apr/2008:21:12:35][2460.5568][-conn:0-] Notice: SQL*Loader: Release 10.2.0.3.0 - Production on Mon Apr 21 21:12:35 2008

[21/Apr/2008:21:12:35][2460.5568][-conn:0-] Notice: Copyright (c) 1982, 2005, Oracle. All rights reserved.
[21/Apr/2008:21:12:35][2460.5568][-conn:0-] Error: apm_package_install: Error installing Reference Data - Timezone version 5.4.1: SQL*Loader-500: Unable to open file (s2cs.)
SQL*Loader-553: file not found
SQL*Loader-509: System error: The system cannot find the file specified.
SQL*Loader-500: Unable to open file (s2cs.)
SQL*Loader-553: file not found
SQL*Loader-509: System error: The system cannot find the file specified.
while executing
"close $fd"
(procedure "db_load_sql_data" line 32)
invoked from within
"db_load_sql_data -callback $callback $path/$file_path"
(procedure "apm_package_install_data_model" line 52)
invoked from within
"apm_package_install_data_model -callback $callback -data_model_files $data_model_files $spec_file_path"
invoked from within

Here "db_load_sql_data" fails, which loads CSV formatted data. In the concrete case, it fails to load Timezone data, which has no immediate problem on loading the packages, but will cause troubles later. I would suggest that you add an "ns_log notice ..." statement to output the "file" which it tries to open, which the code assumes that it exists.

Most likely, you should see the same error under postgres.

(c) tsearch 2

21/Apr/2008:21:18:48][4860.3732][-conn:4-] Notice:  ********** STARTING BEFORE-INSTALL CALLBACK ****************
[21/Apr/2008:21:18:48][4860.3732][-conn:4-] Error: nsoracle.c:3905:: error in `OCIStmtExecute ()': ORA-00942: table or view do
es not exist

SQL: select typname from !>>>!pg_type where typname='tsvector'
[21/Apr/2008:21:18:48][4860.3732][-conn:4-] Error: apm_package_install: Error installing Tsearch2 Driver version 5.4.1: nsoracle.c:3905
:: error in `OCIStmtExecute ()': ORA-00942: table or view does not exist

Don't install tsearch2 under Oracle, this is postgres only. For Oracle, there is the "intermedia" driver for full text search. Last time i tried to install that under Oracle, it did not work out of the box, but worked after some more tweaks, but i was not sure if that was a local installation problem. I think that people at UNED work on that issue for the forthcoming release, so i would suggest that you wait for this.

d) categories:

[21/Apr/2008:21:19:29][4860.3732][-conn:4-] Notice: --try en:categories-portlet -> 0, ::818 ::xowiki::Package->resolve_request (395ms, 0ms)
[21/Apr/2008:21:19:29][4860.3732][-conn:4-] Error: nsoracle.c:3905:: error in `OCIStmtExecute ()': ORA-00904: "WIDGET": invalid identifier

SQL:

select tree_id, subtree_category_id, assign_single_p,
require_category_p, !>>>!widget
from category_tree_map
where object_id = :object_id

This is the error, you saw in XoWiki, but this is a problem with categories. We had some discussing already about the column "widget" that was introduced lately http://openacs.org/forums/message-view?message_id=1470107

It seems to me, as if the installed data model does NOT contain the column "widget" in the category_tree_map, but the query does. Maybe an incomplete rollback, since it seems to work under postgres?

What version of categories do you use?

The good news is that XoWiki seems to work well.
-gustaf

Collapse
Posted by Maurizio Martignano on
Dear Gustaf,
thanks for your help. My answers/comments here below.

a) ORACLE_HOME not set

[MM] True. In the first run this variable wasn't set. But then I fixed this problem and I restarted the server.

b) incorrect path:

[MM] This a real problem. It seams that Timezone package requires some changes. Is this an Oracle or a Windows vrs. Linux problem?

(c) tsearch 2

[MM] Correct, my mistake. No need to install this.

d) categories:

[MM] This is another real problem. Categories seem to be working with Postgresql while they don't with Oracle.

The end result of points b) and d) is that XoWiki shows some error messages (though not directly generated by XoWiki itself).

The problem I see is that not all the packages/extensions work in the same way when running on Oracle or on Postgresql.

Cheers and once again many thanks,
Maurizio

Collapse
Posted by Gustaf Neumann on
Dear Maurizio,

Concerning (b): please add the log statement as indicated in my last posting to see which files are searched where.

concerning (d): please tell me the version of categories you are using.

btw, xotcl has only problems with (d), when categories are used. But this is just a nit, we want to get a full working system.

Collapse
Posted by Maurizio Martignano on
Dear Gustaf,
about point (b) the function seems to attempt the proper file (i.e. the file name is correct).
What I noticed is that there's a difference between the Postgresql and Oracle caes about how the file names are built.... may be this is the cause of the problem.....

please have a look at the following code:

d_proc -public db_load_sql_data {{
-dbn ""
-callback apm_ns_write_callback
} file } {

Loads a CSV formatted file into a table using PostgreSQL's COPY command or
Oracle's SQL*Loader utility. The file name format consists of a sequence
number used to control the order in which tables are loaded, and the table
name with "-" replacing "_". This is a bit of a kludge but greatly speeds
the loading of large amounts of data, such as is done when various "ref-*"
packages are installed.

@param dbn The database name to use. If empty_string, uses the default database.
@file Filename in the format dd-table-name.ctl where 'dd' is a sequence number
used to control the order in which data is loaded. This file is an
RDBMS-specific data loader control file.

} {

switch [db_driverkey $dbn] {

oracle {
global env

set user_pass [db_get_sql_user -dbn $dbn]
set tmpnam [ns_tmpnam]

set fd [open $file r]
set file_contents [read $fd]
close $fd

set file_contents [subst $file_contents]

set fd1 [open "${tmpnam}.ctl" w]
puts $fd1 $file_contents
close $fd1

cd [file dirname $file]

set fd [open "|[file join $env(ORACLE_HOME) bin sqlldr] userid=$user_pass control=$tmpnam" "r"]

while { [gets $fd line] >= 0 } {
# Don't bother writing out lines which are purely whitespace.
if { ![string is space $line] } {
apm_callback_and_log $callback "[ad_quotehtml $line]\n"
}
}
close $fd
}

postgresql {
global tcl_platform

set pguser [db_get_username]
if { ![string equal $pguser ""] } {
set pguser "-U $pguser"
}

set pgport [db_get_port]
if { ![string equal $pgport ""] } {
set pgport "-p $pgport"
}

set pgpass [db_get_password]
if { ![string equal $pgpass ""] } {
set pgpass "<$pgpass"
}

if { [string equal [db_get_dbhost] "localhost"] || [string equal [db_get_dbhost] ""] } {
set pghost ""
} else {
set pghost "-h [db_get_dbhost]"
}

set fd [open $file r]
set copy_command [subst -nobackslashes [read $fd]]
close $fd
set copy_file [ns_mktemp /tmp/psql-copyfile-XXXXXX]
set fd [open $copy_file "CREAT EXCL WRONLY" 0600]
puts $fd $copy_command
close $fd

if { $tcl_platform(platform) == "windows" } {
set fp [open "|[file join [db_get_pgbin] psql] -f $copy_file $pghost $pgport $pguser [db_get_database]" "r"]
} else {
set fp [open "|[file join [db_get_pgbin] psql] -f $copy_file $pghost $pgport $pguser [db_get_database] $pgpass" "r"]
}

while { [gets $fp line] >= 0 } {
# Don't bother writing out lines which are purely whitespace.
if { ![string is space $line] } {
apm_callback_and_log $callback "[ad_quotehtml $line]\n"
}
}

# PSQL dumps errors and notice information on stderr, and has no option to turn
# this off. So we have to chug through the "error" lines looking for those that
# really signal an error.

set errno [ catch {
close $fp
} error]

# remove the copy file.
file delete -force $copy_file

if { $errno == 2 } {
return $error
}

# Just filter out the "NOTICE" lines, so we get the stack dump along with real
# ERRORs. This could be done with a couple of opaque-looking regexps...

set error_found 0
foreach line [split $error "\n"] {
if { [string first NOTICE $line] == -1 } {
append error_lines "$line\n"
set error_found [expr { $error_found || [string first ERROR $line] != -1 || \
[string first FATAL $line] != -1 } ]
}
}

if { $error_found } {
global errorCode
return -code error -errorinfo $error_lines -errorcode $errorCode $error_lines
}

}

nsodbc {
error "db_load_sql_data is not supported for this database."
}
default {
error "db_load_sql_data is not supported for this database."
}
}
}

About point (d) the version of Categories I'm using is 1.1.2d3 .

Hope it helps,
Maurizio

Collapse
Posted by Gustaf Neumann on
concerning db_load_sql_data:

Seems as if the following sequence leads to the problem

set fd [open "|[file join $env(ORACLE_HOME) bin sqlldr] userid=$user_pass control=$tmpnam" "r"]

...

close $fd

Do you have the sqlldr under [file join $env(ORACLE_HOME) bin sqlldr]?
Are the provded parameters ok (e.g. the $tmpnam)?

Concerning (d): You are using the head version of categories, where it seems, that the column "widget" was not added in the Oracle version. Although i hate add something to CVS, which i cannot test, i added the column in the Oracle creation procs. Please get the head version from CVS and test it with Oracle. If the error is gone, i will apply the same fix to the oacs-5-4 branch, which has apparently the same problem.

Collapse
Posted by Maurizio Martignano on
Dear Gustaf,
success!!!

1. The first problem was due to $tmpnam (which was wrong: in Vista you can't write files wherever you want).
To fix it I had to introduce the following change:

# set tmpnam [ns_tmpnam]
set tmpnam [ns_mktemp /tmp/ctl-XXXXXX]

2. Your correction to the categories Oracle creation procs worked.

Thanks a lot for your help!

Cheers,
Maurizio

Collapse
Posted by Gustaf Neumann on
Dear Maurizio,

i count current 77 occurrences of ns_tmpnam in OpenACS and its packages. These places will have the same problem, so the fix is not sufficient in the general case. Since ns_tmpnam is implemented in C, it is most probably the best solution to address the problem in the aolserver implementation. Again, as i do not have a WIN32 environment, please test the following replacement of NsTclTmpNamObjCmd() in aolserver/nsd/tclfile.c. With this fix, set tmpnam [ns_tmpnam] should be ok again.

best
-gustaf neumann

int
NsTclTmpNamObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
{
#ifdef WIN32
/*
The WIN32 implmentation of tmpnam() ignores the environment
variable TMP and generates filenames for the root
directory. Unfortunately, new WIN versions (Vista) don't allow
this. The suggested replacement is _tempnam().

The first argument of _tempnam() is the default directory, in case
the environment variable TMP is not set or points to a directory
that does not exist.
*/
char *buf = _tempnam("/tmp", NULL);

if (buf == NULL) {
Tcl_SetResult(interp, "could not generate temporary filename.", TCL_STATIC);
return TCL_ERROR;
}
/*
The documentation says that _tempnam() allocates memory via
malloc(); to be sure, that the "right" free() is used, we do
not use TCL_DYNAMIC but the TCL_VOLATILE followed by the manual
free().
*/
Tcl_SetResult(interp, buf, TCL_VOLATILE);
free(buf);
#else
char buf[L_tmpnam];

if (tmpnam(buf) == NULL) {
Tcl_SetResult(interp, "could not generate temporary filename.", TCL_STATIC);
return TCL_ERROR;
}
Tcl_SetResult(interp, buf, TCL_VOLATILE);
#endif
return TCL_OK;
}