You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(4) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(54) |
Feb
(71) |
Mar
(93) |
Apr
(48) |
May
(53) |
Jun
(33) |
Jul
(19) |
Aug
(39) |
Sep
(35) |
Oct
(36) |
Nov
(33) |
Dec
(13) |
| 2004 |
Jan
(10) |
Feb
(1) |
Mar
(17) |
Apr
(9) |
May
(40) |
Jun
(132) |
Jul
(133) |
Aug
(178) |
Sep
(104) |
Oct
(31) |
Nov
(80) |
Dec
(18) |
| 2005 |
Jan
(54) |
Feb
(9) |
Mar
(35) |
Apr
(2) |
May
(20) |
Jun
(3) |
Jul
(45) |
Aug
(202) |
Sep
(2) |
Oct
(26) |
Nov
|
Dec
(4) |
| 2006 |
Jan
|
Feb
(7) |
Mar
(8) |
Apr
(66) |
May
(9) |
Jun
(40) |
Jul
(4) |
Aug
(4) |
Sep
|
Oct
|
Nov
(1) |
Dec
(4) |
| 2007 |
Jan
(2) |
Feb
(14) |
Mar
(4) |
Apr
(1) |
May
(5) |
Jun
(5) |
Jul
|
Aug
(8) |
Sep
(3) |
Oct
(7) |
Nov
|
Dec
|
| 2008 |
Jan
(6) |
Feb
|
Mar
(1) |
Apr
(8) |
May
(46) |
Jun
(4) |
Jul
(1) |
Aug
|
Sep
(9) |
Oct
(3) |
Nov
|
Dec
(5) |
| 2009 |
Jan
(9) |
Feb
(2) |
Mar
(3) |
Apr
|
May
(6) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(11) |
| 2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(3) |
Jul
(10) |
Aug
(5) |
Sep
(1) |
Oct
(13) |
Nov
|
Dec
(4) |
| 2012 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(4) |
Jun
|
Jul
|
Aug
|
Sep
(5) |
Oct
|
Nov
|
Dec
|
| 2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(2) |
Dec
|
| 2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(5) |
|
From: <do...@us...> - 2008-05-04 01:59:02
|
Update of /cvsroot/aolserver/aolserver.com/wp In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv29097/wp Log Message: Directory /cvsroot/aolserver/aolserver.com/wp added to the repository |
|
From: <do...@us...> - 2008-05-04 00:30:10
|
Update of /cvsroot/aolserver/aolserver.com In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv23598 Modified Files: .htaccess index.php Removed Files: lists.php sftools.php Log Message: Moving content into WordPress. Index: .htaccess =================================================================== RCS file: /cvsroot/aolserver/aolserver.com/.htaccess,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** .htaccess 7 Mar 2002 21:16:45 -0000 1.2 --- .htaccess 4 May 2008 00:30:01 -0000 1.3 *************** *** 5,6 **** --- 5,39 ---- ErrorDocument 500 /error/500.html php_value include_path /home/groups/a/ao/aolserver/htdocs + + RewriteEngine On + RewriteOptions MaxRedirects=3 + + # RewriteRule ^http://wiki.aolserver.(com|net|org)/(.*)$ http://panoptic.com/wiki/aolserver/$2 [R,QSA] + # RewriteRule ^wiki/?$ http://panoptic.com/wiki/aolserver/AOLserver_Wiki [R,QSA] + # RewriteRule ^wiki(.*)$ http://panoptic.com/wiki/aolserver$1 [R,QSA] + + RewriteRule ^http://wiki.aolserver.(com|net|org)/(.*)$ http://dev.aolserver.com/$2 [L,R,QSA] + RewriteRule ^wiki/?$ http://dev.aolserver.com/wiki/AOLserver_Wiki [L,R,QSA] + RewriteRule ^wiki(.*)$ http://dev.aolserver.com/wiki$1 [L,R,QSA] + + RewriteRule ^docs/tcl(.*)$ /man/4.0/tcl$1 [L,R] + + RewriteRule ^downloads/(.*)$ http://prdownloads.sourceforge.net/aolserver/$1?download [L,R] + RewriteRule ^files/(aolserver-4.0.7-win32.zip)$ http://prdownloads.sourceforge.net/aolserver/$1?download [L,R] + RewriteRule ^files/(aolserver-4.1.0-win32.zip)$ http://prdownloads.sourceforge.net/aolserver/$1?download [L,R] + + RewriteRule ^sf/?$ http://sourceforge.net/projects/aolserver [L,R] + RewriteRule ^(sf/)?bugs/?$ http://sourceforge.net/tracker/?group_id=3152&atid=103152 [L,R] + RewriteRule ^sf/bug/(.*)$ http://sourceforge.net/tracker/index.php?func=detail&group_id=3152&atid=103152&aid=$1 [L,R] + RewriteRule ^sf/rfe/(.*)$ http://sourceforge.net/tracker/index.php?func=detail&group_id=3152&atid=353152&aid=$1 [L,R] + RewriteRule ^sf/files/? http://sourceforge.net/project/showfiles.php?group_id=3152 [L,R] + RewriteRule ^sf/cvs/\*checkout\*/(.*)$ http://aolserver.cvs.sourceforge.net/*checkout*/aolserver/$1 [L,R] + RewriteRule ^sf/cvs/?(.*)$ http://aolserver.cvs.sourceforge.net/aolserver/$1 [L,R] + + # BEGIN WordPress + <IfModule mod_rewrite.c> + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.php [L] + </IfModule> + # END WordPress Index: index.php =================================================================== RCS file: /cvsroot/aolserver/aolserver.com/index.php,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** index.php 9 Feb 2005 05:06:27 -0000 1.10 --- index.php 4 May 2008 00:30:02 -0000 1.11 *************** *** 1,16 **** <?php ! $title = "AOLserver"; ! $content = <<<END ! <h2><img src="images/triangle.gif" height="32" width="39"> ! What is AOLserver</h2> ! ! <p>AOLserver is America Online's <a href="http://www.sourceforge.net/projects/aolserver">Open-Source</a> web server. AOLserver is the backbone of the largest and busiest production environments in the world. AOLserver is a multithreaded, Tcl-enabled web server used for large scale, dynamic web sites.</p> ! ! <h2>Site Search</h2> ! <?php include 'google.inc'; ?> ! ! <h2>Latest News</h2> ! <?php include 'projnews.inc'; ?> ! END; ! include 'layout.inc'; ?> --- 1,5 ---- <?php ! /* Short and sweet */ ! define('WP_USE_THEMES', true); ! require('./wp/wp-blog-header.php'); ?> --- lists.php DELETED --- --- sftools.php DELETED --- |
|
From: <do...@us...> - 2008-05-04 00:30:04
|
Update of /cvsroot/aolserver/aolserver.com/chat In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv23598/chat Removed Files: index.php Log Message: Moving content into WordPress. --- index.php DELETED --- |
|
From: <gne...@us...> - 2008-04-24 07:13:41
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv5697 Modified Files: tclfile.c Log Message: Fix ns_tmpnam for WIN32 environments to return a path in the TMP directory. Index: tclfile.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/tclfile.c,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** tclfile.c 17 Aug 2006 19:45:37 -0000 1.25 --- tclfile.c 24 Apr 2008 07:13:40 -0000 1.26 *************** *** 569,572 **** --- 569,606 ---- 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; + } + /* + Change back-slash characters into slash characters, as all other + paths are slash separated. Even some programs under Windows + do not allow back-slahed paths (e.g. Oracle's SqlLdr). + */ + for (i = 0; i < strlen(buf); i++) { + if (buf[i] == '\\') buf[i] = '/'; + } + /* + 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]; *************** *** 576,579 **** --- 610,614 ---- } Tcl_SetResult(interp, buf, TCL_VOLATILE); + #endif return TCL_OK; } |
|
From: <do...@us...> - 2008-04-19 12:36:45
|
Update of /cvsroot/aolserver/nsfreetds In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv11355 Modified Files: ChangeLog Log Message: Added parameters for 'clientcharset', 'language', 'packetsize' and 'tdsversion'. See nsfreetds.html for documentation. Index: ChangeLog =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/ChangeLog,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ChangeLog 18 Apr 2008 01:39:25 -0000 1.5 --- ChangeLog 19 Apr 2008 12:36:46 -0000 1.6 *************** *** 1,2 **** --- 1,8 ---- + 2008-04-19 Dossy Shiobara <do...@pa...> + + * nsfreetds.c (1.9), nsfreetds.html (1.1): Added parameters for + 'clientcharset', 'language', 'packetsize' and 'tdsversion'. See + nsfreetds.html for documentation. + 2008-04-17 Dossy Shiobara <do...@pa...> |
|
From: <do...@us...> - 2008-04-19 12:35:31
|
Update of /cvsroot/aolserver/nsfreetds In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv10954 Modified Files: nsfreetds.c Added Files: nsfreetds.html Log Message: Added parameters for 'clientcharset', 'language', 'packetsize' and 'tdsversion'. See nsfreetds.html for documentation. --- NEW FILE: nsfreetds.html --- <html> <head> <title>nsfreetds</title> </head> <body bgcolor="#ffffff"> <h2>nsfreetds -- TDS (Sybase, MS SQL Server) database driver using FreeTDS</h2> <p>$Header: /cvsroot/aolserver/nsfreetds/nsfreetds.html,v 1.1 2008/04/19 12:35:35 dossy Exp $</p> <ul> <li><a href="#Theory_of_Operation">Theory of Operation</a></li> <li><a href="#Known_Issues">Known Issues</a></li> <li><a href="#Configuration_Options">Configuration Options</a></li> <li><a href="#Sample_Configuration">Sample Configuration</a></li> </ul> <h3><a name="Theory_of_Operation">Theory of Operation</a></h3> <p>The nsfreetds module provides the database driver to nsdb for connecting to TDS-based databases such as Sybase or Microsoft's SQL Server, using the <a href="http://www.freetds.org/">FreeTDS</a> library.</p> <h3><a name="Known_Issues">Known Issues</a></h3> <p>As nsfreetds relies on FreeTDS for its underlying protocol implementation, any issues with FreeTDS will affect nsfreetds operation.</p> <h3><a name="Configuration_Options">Configuration Options</a></h3> <p>The following options are available for configuring a nsfreetds database pool:</p> <table border="1"> <tr> <th>Option</th> <th>Type</th> <th>Default</th> <th>Description</th> </tr> <tr> <td>clientcharset</td> <td>string</td> <td>iso_1</td> <td>The client character set to use when connecting to the database. The default is "iso_1" but may need to be set to "UTF-8". This setting is case-sensitive.</td> </tr> <tr> <td>language</td> <td>string</td> <td>us_english</td> <td>Controls the language for the session. Valid language names are listed in <b>syslanguages</b>.</td> </tr> <tr> <td>packetsize</td> <td>integer</td> <td>512</td> <td>Controls the size of TDS packets. Note: A TDS packet that is longer than 512 bytes is split on the 512 byte boundary and the "more packets" bit is set. [<a href="http://www.freetds.org/tds.html#packet">#</a>]</td> </tr> <tr> <td>tdsversion</td> <td>decimal</td> <td>8.0</td> <td>Selects the version of the TDS protocol to use when connecting to the database. The default is TDS 8.0.</td> </tr> </table> <h3><a name="Sample_Configuration">Sample Configuration</a></h3> <pre> # # TDS database pools -- nsfreetds # ns_section "ns/server/${servername}/modules" ns_param nsdb ${bindir}/nsdb.so ns_section "ns/server/${servername}/db" ns_param defaultpool test ns_param pools * ns_section "ns/db/drivers" ns_param nsfreetds ${bindir}/nsfreetds.so ns_section "ns/db/pools" ns_param test "nsfreetds" ns_section "ns/db/pool/test" ns_param driver nsfreetds ns_param connections 10 ns_param user USERNAME ns_param password PASSWORD ns_param datasource HOSTNAME:PORT:DATABASENAME ns_param tdsversion 8.0 ns_param clientcharset UTF-8 ns_param language us_english ns_param packetsize 512 </pre> </body> </html> Index: nsfreetds.c =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/nsfreetds.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** nsfreetds.c 18 Apr 2008 01:38:18 -0000 1.8 --- nsfreetds.c 19 Apr 2008 12:35:35 -0000 1.9 *************** *** 72,77 **** #include <assert.h> - - #define MAX_IDENTIFIER 256 #define DRIVER_VERSION "Panoptic FreeTDS Driver v0.4" --- 72,75 ---- *************** *** 160,165 **** TDSSOCKET *tds; TDSCONNECTION *connect_info; ! const char *locale = NULL; ! char *charset = NULL; void **ctxArray; --- 158,165 ---- TDSSOCKET *tds; TDSCONNECTION *connect_info; ! char *path; ! // const char *locale = NULL; ! char *charset, *language, *tdsversion; ! int tds_major = 8, tds_minor = 0, packetsize = 512; void **ctxArray; *************** *** 186,189 **** --- 186,208 ---- } + path = Ns_ConfigGetPath(NULL, NULL, "db", "pool", handle->poolname, NULL); + if (!(charset = Ns_ConfigGetValue(path, "clientcharset"))) { + charset = "iso_1"; + } + if (!(language = Ns_ConfigGetValue(path, "language"))) { + language = "us_english"; + } + if (!Ns_ConfigGetInt(path, "packetsize", &packetsize) + || packetsize < 512) { + packetsize = 512; + } + if (!(tdsversion = Ns_ConfigGetValue(path, "tdsversion"))) { + if (sscanf(tdsversion, "%u.%u", &tds_major, &tds_minor) != 2) { + Ns_Log(Notice, "nsfreetds: DbOpen(%s): could not parse \"tdsversion\" database pool parameter '%s'.", + handle->datasource, tdsversion); + return NS_ERROR; + } + } + if (context->locale && !context->locale->date_fmt) { /* set default in case there's no locale file */ *************** *** 194,197 **** --- 213,218 ---- context->err_handler = Ns_FreeTDS_Err_Handler; + + #if 0 setlocale(LC_ALL, ""); locale = setlocale(LC_ALL, NULL); *************** *** 203,210 **** charset = "iso_1"; } ! tds_set_version(login, 8, 0); /* FIXME: Use ns_param tdsversion */ ! tds_set_app(login, DbName()); ! tds_set_library(login, "TDS-Library"); tds_set_server(login, handle->datasource); --- 224,232 ---- charset = "iso_1"; } + #endif ! tds_set_version(login, tds_major, tds_minor); ! tds_set_app(login, Ns_InfoServerName()); ! tds_set_library(login, DbName()); tds_set_server(login, handle->datasource); *************** *** 212,221 **** tds_set_passwd(login, handle->password); ! tds_set_host(login, "myhost"); /* FIXME: aolserver instance name? */ tds_set_client_charset(login, charset); ! tds_set_language(login, "us_english"); ! tds_set_packet(login, 512); ! tds = tds_alloc_socket(context, 512); if (!tds) { Ns_Log(Notice, "nsfreetds: DbOpen(%s): tds_alloc_socket() failed.", --- 234,243 ---- tds_set_passwd(login, handle->password); ! tds_set_host(login, Ns_InfoHostname()); tds_set_client_charset(login, charset); ! tds_set_language(login, language); ! tds_set_packet(login, packetsize); ! tds = tds_alloc_socket(context, packetsize); if (!tds) { Ns_Log(Notice, "nsfreetds: DbOpen(%s): tds_alloc_socket() failed.", *************** *** 252,258 **** void **ctxArray = (void **) handle->context; ! if (handle->verbose) { Ns_Log(Notice, "nsfreetds: DbClose(%s) called.", handle->datasource); - } tds_free_socket(GET_TDS(handle)); --- 274,279 ---- void **ctxArray = (void **) handle->context; ! if (handle->verbose) Ns_Log(Notice, "nsfreetds: DbClose(%s) called.", handle->datasource); tds_free_socket(GET_TDS(handle)); *************** *** 336,340 **** srclen = col->column_cur_size; - // Ns_Log(Notice, "nsfreetds: DbGetRow(%s): src = {%s}", handle->datasource, src); if ((destlen = tds_convert(GET_TDS(handle)->tds_ctx, ctype, (const TDS_CHAR *) src, (unsigned) srclen, --- 357,360 ---- |
|
From: <do...@us...> - 2008-04-18 01:39:21
|
Update of /cvsroot/aolserver/nsfreetds In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv9943 Modified Files: ChangeLog Log Message: nsfreetds.c (1.8): Updated nsfreetds to work with FreeTDS 0.64. Discovered that in order to specify client character set requires TDS 8.0 with SQL Server 2005. nsfreetds.adp (1.5): Cleaned up HTML markup. Datasource list is now dynamic from server config. Makefile (1.8): Removed 'snapshot' target, really belongs elsewhere. INSTALL (1.5), README (1.6): Updated documentation. Index: ChangeLog =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/ChangeLog,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ChangeLog 27 Aug 2004 20:36:37 -0000 1.4 --- ChangeLog 18 Apr 2008 01:39:25 -0000 1.5 *************** *** 1,2 **** --- 1,16 ---- + 2008-04-17 Dossy Shiobara <do...@pa...> + + * nsfreetds.c (1.8): Updated nsfreetds to work with FreeTDS 0.64. + Discovered that in order to specify client character set requires + TDS 8.0 with SQL Server 2005. + + * nsfreetds.adp (1.5): Cleaned up HTML markup. Datasource list is + now dynamic from server config. + + * Makefile (1.8): Removed 'snapshot' target, really belongs + elsewhere. + + * INSTALL (1.5), README (1.6): Updated documentation. + 2004-08-27 tag nsfreetds_v0_r4 |
|
From: <do...@us...> - 2008-04-18 01:38:12
|
Update of /cvsroot/aolserver/nsfreetds In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv9565 Modified Files: nsfreetds.c Log Message: Updated nsfreetds to work with FreeTDS 0.64. Discovered that in order to specify client character set requires TDS 8.0 with SQL Server 2005. Index: nsfreetds.c =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/nsfreetds.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** nsfreetds.c 27 Aug 2004 19:39:44 -0000 1.7 --- nsfreetds.c 18 Apr 2008 01:38:18 -0000 1.8 *************** *** 10,13 **** --- 10,14 ---- * - AOLserver 4.0.8a, FreeTDS 0.61, Linux 2.6.7 glibc 2.3. * - AOLserver 4.1.0a, FreeTDS 0.61, Linux 2.6.7 glibc 2.3. + * - AOLserver 4.0.10, FreeTDS 0.64, Debian 4.0 (etch). * * This driver was derived from the nsmysql driver. *************** *** 60,64 **** #define GET_TDS(handle) ((TDSSOCKET *) handle->connection) ! #define GET_TDS_RESULTS(handle) ((TDSRESULTINFO *) GET_TDS(handle)->res_info) --- 61,65 ---- #define GET_TDS(handle) ((TDSSOCKET *) handle->connection) ! #define GET_TDS_RESULTS(handle) ((TDSRESULTINFO *) GET_TDS(handle)->current_results) *************** *** 92,97 **** long Ns_FreeTDS_Rows_Affected(Ns_DbHandle *handle); ! int Ns_FreeTDS_Msg_Handler(TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMSGINFO *msg); ! int Ns_FreeTDS_Err_Handler(TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMSGINFO *msg); static Ns_DbProc dbProcs[] = { --- 93,98 ---- long Ns_FreeTDS_Rows_Affected(Ns_DbHandle *handle); ! int Ns_FreeTDS_Msg_Handler(const TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMESSAGE *msg); ! int Ns_FreeTDS_Err_Handler(const TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMESSAGE *msg); static Ns_DbProc dbProcs[] = { *************** *** 158,165 **** TDSCONTEXT *context; TDSSOCKET *tds; ! TDSCONNECTINFO *connect_info; const char *locale = NULL; char *charset = NULL; ! void *ctxArray[2]; assert(handle != NULL); --- 159,166 ---- TDSCONTEXT *context; TDSSOCKET *tds; ! TDSCONNECTION *connect_info; const char *locale = NULL; char *charset = NULL; ! void **ctxArray; assert(handle != NULL); *************** *** 178,182 **** } ! context = tds_alloc_context(); if (!context) { Ns_Log(Notice, "nsfreetds: DbOpen(%s): tds_alloc_context() failed.", --- 179,183 ---- } ! context = tds_alloc_context(NULL); if (!context) { Ns_Log(Notice, "nsfreetds: DbOpen(%s): tds_alloc_context() failed.", *************** *** 203,206 **** --- 204,208 ---- } + tds_set_version(login, 8, 0); /* FIXME: Use ns_param tdsversion */ tds_set_app(login, DbName()); tds_set_library(login, "TDS-Library"); *************** *** 211,215 **** tds_set_host(login, "myhost"); /* FIXME: aolserver instance name? */ ! tds_set_charset(login, charset); tds_set_language(login, "us_english"); tds_set_packet(login, 512); --- 213,217 ---- tds_set_host(login, "myhost"); /* FIXME: aolserver instance name? */ ! tds_set_client_charset(login, charset); tds_set_language(login, "us_english"); tds_set_packet(login, 512); *************** *** 227,242 **** connect_info = tds_read_config_info(NULL, login, context->locale); if (!connect_info || tds_connect(tds, connect_info) == TDS_FAIL) { ! tds_free_connect(connect_info); Ns_Log(Notice, "nsfreetds: DbOpen(%s): tds_connect() failed.", handle->datasource); return NS_ERROR; } ! tds_free_connect(connect_info); ctxArray[0] = login; ctxArray[1] = context; handle->connection = (void *) tds; ! handle->context = (void *) ctxArray; handle->connected = NS_TRUE; --- 229,245 ---- connect_info = tds_read_config_info(NULL, login, context->locale); if (!connect_info || tds_connect(tds, connect_info) == TDS_FAIL) { ! tds_free_connection(connect_info); Ns_Log(Notice, "nsfreetds: DbOpen(%s): tds_connect() failed.", handle->datasource); return NS_ERROR; } ! tds_free_connection(connect_info); + ctxArray = (void **) calloc(2, sizeof(void *)); ctxArray[0] = login; ctxArray[1] = context; handle->connection = (void *) tds; ! handle->context = ctxArray; handle->connected = NS_TRUE; *************** *** 247,251 **** DbClose(Ns_DbHandle *handle) { ! void **ctxArray; if (handle->verbose) { --- 250,254 ---- DbClose(Ns_DbHandle *handle) { ! void **ctxArray = (void **) handle->context; if (handle->verbose) { *************** *** 253,263 **** } - DbCancel(handle); - - ctxArray = (void **) handle->context; - tds_free_socket(GET_TDS(handle)); tds_free_login((TDSLOGIN *) ctxArray[0]); tds_free_context((TDSCONTEXT *) ctxArray[1]); handle->connected = NS_FALSE; --- 256,263 ---- } tds_free_socket(GET_TDS(handle)); tds_free_login((TDSLOGIN *) ctxArray[0]); tds_free_context((TDSCONTEXT *) ctxArray[1]); + free(ctxArray); handle->connected = NS_FALSE; *************** *** 273,281 **** TDS_INT rowtype; TDS_INT computeid; ! TDSCOLINFO *col; int ctype; CONV_RESULT dres; ! unsigned char *src; ! TDS_INT srclen; if (handle->verbose) --- 273,281 ---- TDS_INT rowtype; TDS_INT computeid; ! TDSCOLUMN *col; int ctype; CONV_RESULT dres; ! unsigned char *src, *dest; ! TDS_INT srclen, destlen; if (handle->verbose) *************** *** 283,287 **** if (! handle->fetchingRows) { ! Ns_Log(Error, "nsfreetds: DbGetRow(%s): No rows waiting to fetch.", handle->datasource); Ns_DbSetException(handle, "NSDB", "no rows waiting to fetch."); --- 283,287 ---- if (! handle->fetchingRows) { ! Ns_Log(Error, "nsfreetds: DbGetRow(%s): No rows waiting to fetch.", handle->datasource); Ns_DbSetException(handle, "NSDB", "no rows waiting to fetch."); *************** *** 305,343 **** } ! rc = tds_process_row_tokens(GET_TDS(handle), &rowtype, &computeid); if (rc == TDS_FAIL) { ! Ns_Log(Error, "nsfreetds: DbGetRow(%s): tds_process_row_tokens() returned TDS_FAIL", handle->datasource); goto error; ! } else if (rc != TDS_SUCCEED && rc != TDS_NO_MORE_ROWS) { ! Ns_Log(Error, "nsfreetds: DbGetRow(%s): tds_process_row_tokens() unexpected return %d", handle->datasource, rc); goto error; } ! ! if (rc == TDS_NO_MORE_ROWS || !GET_TDS(handle)->res_info) { handle->statement = NULL; handle->fetchingRows = 0; return NS_END_DATA; } ! for (i = 0; i < numcols; i++) { ! if (tds_get_null(GET_TDS_RESULTS(handle)->current_row, i)) { Ns_SetPutValue(row, i, ""); continue; } - col = GET_TDS_RESULTS(handle)->columns[i]; ctype = tds_get_conversion_type(col->column_type, col->column_size); - src = &(GET_TDS_RESULTS(handle)->current_row[col->column_offset]); if (is_blob_type(col->column_type)) ! src = (unsigned char*) ((TDSBLOBINFO *) src)->textvalue; srclen = col->column_cur_size; ! ! if (tds_convert(GET_TDS(handle)->tds_ctx, ctype, (TDS_CHAR*) src, (unsigned) srclen, SYBVARCHAR, &dres) < 0) { continue; } ! Ns_SetPutValue(row, i, dres.c); ! free(dres.c); } --- 305,355 ---- } ! rc = tds_process_tokens(GET_TDS(handle), &rowtype, &computeid, ! TDS_STOPAT_ROWFMT | TDS_RETURN_DONE | TDS_RETURN_ROW | ! TDS_RETURN_COMPUTE); ! if (rc == TDS_FAIL) { ! Ns_Log(Error, "nsfreetds: DbGetRow(%s): tds_process_row_tokens() returned TDS_FAIL.", handle->datasource); goto error; ! } else if (rc != TDS_SUCCEED && rc != TDS_NO_MORE_RESULTS) { ! Ns_Log(Error, "nsfreetds: DbGetRow(%s): tds_process_row_tokens() unexpected return: %d", handle->datasource, rc); goto error; } ! if (rc == TDS_NO_MORE_RESULTS || !GET_TDS_RESULTS(handle) || ! (rowtype != TDS_ROW_RESULT && rowtype != TDS_COMPUTE_RESULT)) { handle->statement = NULL; handle->fetchingRows = 0; return NS_END_DATA; } ! for (i = 0; i < numcols; i++) { ! col = GET_TDS_RESULTS(handle)->columns[i]; ! if (col->column_cur_size < 0) { Ns_SetPutValue(row, i, ""); continue; } ctype = tds_get_conversion_type(col->column_type, col->column_size); src = &(GET_TDS_RESULTS(handle)->current_row[col->column_offset]); if (is_blob_type(col->column_type)) ! src = (unsigned char *) ((TDSBLOB *) src)->textvalue; srclen = col->column_cur_size; ! ! // Ns_Log(Notice, "nsfreetds: DbGetRow(%s): src = {%s}", handle->datasource, src); ! if ((destlen = tds_convert(GET_TDS(handle)->tds_ctx, ctype, ! (const TDS_CHAR *) src, (unsigned) srclen, ! SYBVARCHAR, &dres)) < 0) { ! // Ns_Log(Notice, "nsfreetds: DbGetRow(%s): tds_convert(column_type = 0x%x, ctype = 0x%x) < 0 (%d)", handle->datasource, col->column_type, ctype, destlen); continue; } ! dest = (unsigned char *) malloc(destlen + 1); ! memcpy(dest, src, destlen); ! dest[destlen] = '\0'; ! ! // Ns_Log(Notice, "nsfreetds: DbGetRow(%s): tds_convert(ctype = 0x%x) = {%s}", handle->datasource, ctype, dest); ! Ns_SetPutValue(row, i, (char *) dest); ! free(dest); ! // free(dres.c); } *************** *** 348,351 **** --- 360,364 ---- } + static int DbFlush(Ns_DbHandle *handle) *************** *** 379,384 **** DbExec(Ns_DbHandle *handle, char *sql) { ! int rc, status; ! TDS_INT resulttype; assert(handle != NULL); --- 392,398 ---- DbExec(Ns_DbHandle *handle, char *sql) { ! int rc, status; ! TDS_INT resulttype; ! TDS_INT computeid; assert(handle != NULL); *************** *** 396,401 **** --- 410,420 ---- * Flush previous query in case there was one. */ + DbFlush(handle); + /* + * Execute SQL query. + */ + rc = tds_submit_query(GET_TDS(handle), sql); if (rc != TDS_SUCCEED) { *************** *** 406,421 **** /* * FIXME: There can be multiple result sets. Currently, we * are fetching only the first. */ ! rc = tds_process_result_tokens(GET_TDS(handle), &resulttype); if (rc == TDS_FAIL) { ! Ns_Log(Error, "nsfreetds: DbExec(%s): tds_process_result_tokens() returned TDS_FAIL.", handle->datasource); return NS_ERROR; } else if (rc != TDS_SUCCEED && rc != TDS_NO_MORE_RESULTS) { ! Ns_Log(Error, "nsfreetds: DbExec(%s): tds_process_result_tokens() unexpected return.", handle->datasource); return NS_ERROR; } - if (rc == TDS_NO_MORE_RESULTS) { handle->statement = NULL; --- 425,444 ---- /* + * Process query response. + * * FIXME: There can be multiple result sets. Currently, we * are fetching only the first. */ ! ! rc = tds_process_tokens(GET_TDS(handle), &resulttype, &computeid, ! TDS_TOKEN_RESULTS); ! if (rc == TDS_FAIL) { ! Ns_Log(Error, "nsfreetds: DbExec(%s): tds_process_tokens() returned TDS_FAIL.", handle->datasource); return NS_ERROR; } else if (rc != TDS_SUCCEED && rc != TDS_NO_MORE_RESULTS) { ! Ns_Log(Error, "nsfreetds: DbExec(%s): tds_process_tokens() unexpected return: %d", handle->datasource, rc); return NS_ERROR; } if (rc == TDS_NO_MORE_RESULTS) { handle->statement = NULL; *************** *** 437,460 **** } ! static Ns_Set * DbBindRow(Ns_DbHandle *handle) { ! unsigned int i, numcols; if (handle->verbose) Ns_Log(Notice, "nsfreetds: DbBindRow(%s) called.", handle->datasource); numcols = GET_TDS_RESULTS(handle)->num_cols; if (handle->verbose) Ns_Log(Notice, "nsfreetds: DbBindRow(%s, numcols) = %u", ! handle->datasource, numcols); for (i = 0; i < numcols; i++) { ! Ns_SetPut((Ns_Set *) handle->row, ! GET_TDS_RESULTS(handle)->columns[i]->column_name, NULL); } ! return (Ns_Set *) handle->row; } --- 460,490 ---- } ! static Ns_Set * DbBindRow(Ns_DbHandle *handle) { ! Ns_Set *row = (Ns_Set *) handle->row; ! unsigned int i, numcols = 0; if (handle->verbose) Ns_Log(Notice, "nsfreetds: DbBindRow(%s) called.", handle->datasource); + if (!GET_TDS_RESULTS(handle)) { + Ns_Log(Error, "nsfreetds: DbBindRow(%s): No result data for row.", + handle->datasource); + Ns_DbSetException(handle, "NSDB", "no result data for row"); + return NULL; + } + numcols = GET_TDS_RESULTS(handle)->num_cols; if (handle->verbose) Ns_Log(Notice, "nsfreetds: DbBindRow(%s, numcols) = %u", ! handle->datasource, numcols); for (i = 0; i < numcols; i++) { ! Ns_SetPut(row, GET_TDS_RESULTS(handle)->columns[i]->column_name, NULL); } ! return row; } *************** *** 492,503 **** int ! Ns_FreeTDS_Err_Handler(TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMSGINFO *msg) { Ns_DbHandle *handle = (Ns_DbHandle *) tds->parent; ! Ns_Log(Error, "nsfreetds: Ns_FreeTDS_Err_Handler(%s): ERR(%u:%u) %s", ! handle->datasource, msg->msg_number, msg->line_number, msg->message); ! ! Ns_DbSetException(handle, "NSDB", msg->message); return 0; --- 522,531 ---- int ! Ns_FreeTDS_Msg_Handler(const TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMESSAGE *msg) { Ns_DbHandle *handle = (Ns_DbHandle *) tds->parent; ! Ns_Log(Notice, "nsfreetds: Ns_FreeTDS_Msg_Handler(%s): %s", ! handle->datasource, msg->message); return 0; *************** *** 505,514 **** int ! Ns_FreeTDS_Msg_Handler(TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMSGINFO *msg) { Ns_DbHandle *handle = (Ns_DbHandle *) tds->parent; ! Ns_Log(Notice, "nsfreetds: Ns_FreeTDS_Msg_Handler(%s): %s", ! handle->datasource, msg->message); return 0; --- 533,544 ---- int ! Ns_FreeTDS_Err_Handler(const TDSCONTEXT *ctx, TDSSOCKET *tds, TDSMESSAGE *msg) { Ns_DbHandle *handle = (Ns_DbHandle *) tds->parent; ! Ns_Log(Error, "nsfreetds: Ns_FreeTDS_Err_Handler(%s): ERR(%u:%u) %s", ! handle->datasource, NULL, msg->line_number, msg->message); ! ! Ns_DbSetException(handle, "NSDB", msg->message); return 0; |
|
From: <do...@us...> - 2008-04-18 01:38:02
|
Update of /cvsroot/aolserver/nsfreetds In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv9518 Modified Files: nsfreetds.adp Log Message: Cleaned up HTML markup. Datasource list is now dynamic from server config. Index: nsfreetds.adp =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/nsfreetds.adp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** nsfreetds.adp 4 Jun 2002 04:42:57 -0000 1.4 --- nsfreetds.adp 18 Apr 2008 01:38:08 -0000 1.5 *************** *** 1,52 **** ! <% # $Id$ %> <% ! set form [ns_getform] ! set action {} ! if {$form != {}} { ! set action [ns_set get $form action] ! } ! if [string match $action {Execute Query}] { ! ns_puts { ! <font face="Arial, Helvetica, sans-serif" size="2"> ! <form method="POST" action="nsfreetds.adp"> ! <p><input type="submit" value="New Query"> </form> <p>(If this is the only thing you see on the page, most likely there ! was an error thrown in the server.log.) ! } - - set datasource [ns_set get $form datasource] - set stored_proc [string trim [ns_set get $form stored_proc]] - set sql [string trim [ns_set get $form sql]] ! if [catch {set db [ns_db gethandle $datasource]} err] { ! ns_puts "<p>Error connecting to datasource." ! ns_adp_return ! } ! ns_db verbose $db 1 ! ns_puts [subst { ! <p>Time: [ns_fmttime [ns_time]] ! <p>Datasource: [switch -exact $datasource { ! JDBC { return "Test Sybase Server at 192.138.151.39" } ! }] ! <p>SQL: ! <font size="3"> ! <blockquote><xmp>$sql</xmp></blockquote> ! </font> ! <p>Results: ! <p> ! <font size="3"> ! <blockquote><xmp>}] if [string match $stored_proc true] { --- 1,63 ---- ! <html> <% ! # $Id$ ! %> ! <head> ! <title>nsfreetds.adp</title> ! </head> ! <body> ! <style type="text/css"> ! body { ! font-family: Arial, Helvetica, sans-serif; ! font-size: 86%; ! } ! pre, xmp { ! font-size: 110%; ! } ! </style> ! ! <% ! set datasources {} ! set cfg [ns_configsection "ns/db/pools"] ! set datasources [ns_set array $cfg] ! ns_set free $cfg ! ! set action [ns_queryget action] ! ! if {$action eq {Execute Query}} { ! ns_adp_puts { ! <form method="post"> ! <p><input type="submit" value="New Query"></p> </form> <p>(If this is the only thing you see on the page, most likely there ! was an error thrown in the server.log.)</p> } ! set datasource [ns_queryget datasource] ! set stored_proc [string trim [ns_queryget stored_proc]] ! set sql [string trim [ns_queryget sql]] ! if {[catch {set db [ns_db gethandle $datasource]} err]} { ! ns_adp_puts "<p>Error connecting to datasource.</p>" ! ns_adp_return ! } ! ns_db verbose $db 1 ! ns_adp_puts [subst { ! <p>Time: [ns_fmttime [ns_time]]</p> ! <p>Datasource: $datasource</p> ! <p>SQL:</p> ! <p><blockquote><xmp>$sql</xmp></blockquote></p> ! <p>Results:</p> ! ! <p><blockquote><xmp>}] if [string match $stored_proc true] { *************** *** 60,67 **** if {$err} { ! ns_puts "error: $results" } else { if [string match $results NS_DML] { ! ns_puts "DDL or DML statement, no results." } else { set row [ns_db bindrow $db] --- 71,78 ---- if {$err} { ! ns_adp_puts "error: $results" } else { if [string match $results NS_DML] { ! ns_adp_puts "DDL or DML statement, no results." } else { set row [ns_db bindrow $db] *************** *** 69,75 **** while {[ns_db getrow $db $row]} { set size [ns_set size $row] ! ns_puts "Row $row_num ..." for {set i 0} {$i < $size} {incr i} { ! ns_puts "Column [expr $i + 1]: [ns_set key $row $i] = [ns_set value $row $i]" } incr row_num --- 80,86 ---- while {[ns_db getrow $db $row]} { set size [ns_set size $row] ! ns_adp_puts "Row $row_num ..." for {set i 0} {$i < $size} {incr i} { ! ns_adp_puts "Column [expr $i + 1]: [ns_set key $row $i] = [ns_set value $row $i]" } incr row_num *************** *** 78,102 **** } ! ns_puts [subst {</xmp></blockquote> ! </font> ! ! <p>Rows affected: [ns_freetds rows_affected $db] ! </font> }] ! } else { ! ns_puts { ! <font face="Arial, Helvetica, sans-serif" size="2"> ! <form method="post" action="nsfreetds.adp"> ! <input type="hidden" name="action" value="Execute Query"> ! <p>Datasource: ! <select name="datasource"> ! <option value="JDBC">Test Sybase Server at 192.138.151.39</option> ! </select> ! <p>SQL: (Stored Procedure? <input type="checkbox" name="stored_proc" value="true">)<br> ! <textarea name="sql" cols="60" rows="20" wrap="hard"> SELECT db_name() dbname, user_name() username, --- 89,115 ---- } ! ns_adp_puts [subst {</xmp></blockquote></p> ! <p>Rows affected: [ns_freetds rows_affected $db]</p> }] ! } else { ! ns_adp_puts { ! <form method="post"> ! <input type="hidden" name="action" value="Execute Query"> ! <p>Datasource: <select name="datasource"> ! } ! foreach {key value} $datasources { ! ns_adp_puts [format {<option value="%s">%s: %s</option>} \ ! [ns_quotehtml $key] [ns_quotehtml $key] [ns_quotehtml $value]] ! } ! ! ns_adp_puts { ! </select></p> ! <p> ! SQL: (Stored Procedure? <input type="checkbox" name="stored_proc" value="true">)<br> ! <textarea name="sql" cols="60" rows="20" wrap="hard"> SELECT db_name() dbname, user_name() username, *************** *** 120,131 **** convert(varchar(10), null) varchar_null, convert(text, null) text_null ! </textarea> ! <p><input type="submit" value="Execute Query"> </form> - - </font> } } %> - --- 133,141 ---- convert(varchar(10), null) varchar_null, convert(text, null) text_null ! </textarea></p> ! <p><input type="submit" value="Execute Query"></p> </form> } } %> |
|
From: <do...@us...> - 2008-04-18 01:37:57
|
Update of /cvsroot/aolserver/nsfreetds In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv9162 Modified Files: Makefile Log Message: Removed 'snapshot' target, really belongs elsewhere. Index: Makefile =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/Makefile,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Makefile 7 Nov 2003 02:53:08 -0000 1.7 --- Makefile 18 Apr 2008 01:38:00 -0000 1.8 *************** *** 3,9 **** # ! ifndef NSHOME ! NSHOME = ../aolserver ! endif # --- 3,8 ---- # ! AOLSERVER = ../aolserver ! NSHOME = $(AOLSERVER) # *************** *** 37,44 **** CFLAGS = -I$(FREETDS_HOME)/include - include $(NSHOME)/include/Makefile.module - ifneq (,$(findstring gcc,$(LDSO))) MODLIBS := -Wl,-R$(FREETDS_HOME)/lib $(MODLIBS) --- 36,41 ---- *************** *** 46,76 **** MODLIBS := -R$(FREETDS_HOME)/lib $(MODLIBS) endif - - - ifndef tag - - snapshot: - @echo "**" - @echo "** Specify tag= to create a snapshot for a particular tag." - @echo "**" - - else - - PACKAGE = nsfreetds - - ifeq (,$(name)) - name = $(PACKAGE)-$(tag) - endif - - snapshot: - @echo "**" - @echo "** Making snapshot for version $(tag) in $(PACKAGE)-$(tag).tar.gz" - @echo "**" - - cvs export -d $(name) -r$(tag) aolserver/$(PACKAGE) - tar cf - $(name) | gzip -9c > $(name).tar.gz - du -sk $(name) $(name).tar.gz - /bin/rm -rf $(name) - - endif - --- 43,44 ---- |
|
From: <do...@us...> - 2008-04-18 01:37:47
|
Update of /cvsroot/aolserver/nsfreetds In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv9139 Modified Files: INSTALL README Log Message: Updated documentation. Index: INSTALL =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/INSTALL,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** INSTALL 27 Aug 2004 19:39:44 -0000 1.4 --- INSTALL 18 Apr 2008 01:37:53 -0000 1.5 *************** *** 3,9 **** Here is how I configured FreeTDS 0.61: ! $ ./configure --prefix=/usr/local \ ! --with-tdsver=7.0 --enable-msdblib --enable-dbmfix \ ! --enable-threadsafe --enable-sybase-compat Change (or simply remove) --prefix to suit your tastes. --- 3,13 ---- Here is how I configured FreeTDS 0.61: ! $ ./configure --prefix=/usr/local \ ! --with-tdsver=7.0 --enable-msdblib --enable-dbmfix \ ! --enable-threadsafe --enable-sybase-compat ! ! Here is how I configured FreeTDS 0.64: ! ! $ ./configure --prefix=/usr/local Change (or simply remove) --prefix to suit your tastes. *************** *** 11,20 **** Then, to build nsfreetds (if you left --prefix alone): ! $ make ! $ make install ! ! If you modified or removed --prefix, you'll have to tell 'make' where to ! find your FreeTDS installation: ! $ make FREETDS_HOME=/path/to/freetds --- 15,23 ---- Then, to build nsfreetds (if you left --prefix alone): ! $ make ! $ make install ! If you modified or pointed --prefix to a directory other than /usr/local, ! you'll have to tell 'make' where to find your FreeTDS installation: + $ make FREETDS_HOME=/path/to/freetds Index: README =================================================================== RCS file: /cvsroot/aolserver/nsfreetds/README,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** README 27 Aug 2004 19:39:44 -0000 1.5 --- README 18 Apr 2008 01:37:53 -0000 1.6 *************** *** 1,21 **** $Header$ ! For more documentation, consult the nsfreetds page ! on the AOLserver wiki: ! http://panoptic.com/wiki/aolserver/nsfreetds Specifically, read the nsfreetds FAQ: ! http://panoptic.com/wiki/aolserver/nsfreetdsFAQ ! This version of nsfreetds is known to build with FreeTDS 0.61. ! Make sure $env(SYBASE) is set to $FREETDS_HOME (wherever you ! installed FreeTDS) before starting bin/nsd. handle->datasource is case sensitive, at least for Sybase. ! SQL Server 7 needs tds7.0. Sybase 11 works with tds5.0. ! SQL Server 2000 needs tds4.2. --- 1,22 ---- $Header$ ! For more documentation, consult the nsfreetds page on the AOLserver ! wiki: ! http://aolserver.com/wiki/nsfreetds Specifically, read the nsfreetds FAQ: ! http://aolserver.com/wiki/nsfreetds_FAQ ! This version of nsfreetds is known to build with FreeTDS 0.64. ! Make sure $env(SYBASE) is set to $FREETDS_HOME (wherever you installed ! FreeTDS) before starting bin/nsd, if you plan to use a Sybase-style ! "interfaces" file. handle->datasource is case sensitive, at least for Sybase. ! SQL Server 7 needs tds7.0. Sybase 11 works with tds5.0. SQL Server ! 2000 needs tds4.2. SQL Server 2005 should use tds8.0. |
|
From: <gne...@us...> - 2008-03-22 17:43:44
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv28472 Modified Files: fd.c Log Message: - fix for Mac OS X Leopard: setrlimit with RLIM_INFINITY fails and causes Ns_Log to crash (fix was sketched by David Caruso on the aolserver mailing list on Jan 10, 2008) Index: fd.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/fd.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** fd.c 8 Oct 2005 20:20:51 -0000 1.12 --- fd.c 22 Mar 2008 17:43:39 -0000 1.13 *************** *** 126,132 **** } else { if (rl.rlim_cur != rl.rlim_max) { ! rl.rlim_cur = rl.rlim_max; if (setrlimit(RLIMIT_NOFILE, &rl) != 0) { ! Ns_Log(Warning, "fd: setrlimit(RLIMIT_NOFILE, %d) failed: %s", rl.rlim_max, strerror(errno)); } --- 126,140 ---- } else { if (rl.rlim_cur != rl.rlim_max) { ! #if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1040 ! if (rl.rlim_max == RLIM_INFINITY) { ! rl.rlim_cur = OPEN_MAX < rl.rlim_max ? OPEN_MAX : rl.rlim_max; ! } else { ! rl.rlim_cur = rl.rlim_max; ! } ! #else ! rl.rlim_cur = rl.rlim_max; ! #endif if (setrlimit(RLIMIT_NOFILE, &rl) != 0) { ! Ns_Log(Warning, "fd: setrlimit(RLIMIT_NOFILE, %lld) failed: %s", rl.rlim_max, strerror(errno)); } |
|
From: <do...@us...> - 2008-01-24 14:51:08
|
Update of /cvsroot/aolserver/aolserver/nscgi In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv912 Modified Files: Tag: aolserver_v40_bp nscgi.c Log Message: Backported nscgi.c rev 1.34 change to aolserver_v40_bp branch. Index: nscgi.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nscgi/nscgi.c,v retrieving revision 1.23.2.4 retrieving revision 1.23.2.5 diff -C2 -d -r1.23.2.4 -r1.23.2.5 *** nscgi.c 24 Jan 2008 13:31:47 -0000 1.23.2.4 --- nscgi.c 24 Jan 2008 14:32:22 -0000 1.23.2.5 *************** *** 832,842 **** */ ! Ns_DStringAppend(dsPtr, conn->request->url); ! if (conn->request->query != NULL) { ! Ns_DStringVarAppend(dsPtr, "?", conn->request->query, NULL); ! } ! SetUpdate(cgiPtr->env, "REQUEST_URI", dsPtr->string); ! Ns_DStringTrunc(dsPtr, 0); ! SetUpdate(cgiPtr->env, "SCRIPT_NAME", cgiPtr->name); SetUpdate(cgiPtr->env, "SCRIPT_FILENAME", cgiPtr->path); --- 832,836 ---- */ ! SetUpdate(cgiPtr->env, "REQUEST_URI", conn->request->url); SetUpdate(cgiPtr->env, "SCRIPT_NAME", cgiPtr->name); SetUpdate(cgiPtr->env, "SCRIPT_FILENAME", cgiPtr->path); |
|
From: <do...@us...> - 2008-01-24 14:51:08
|
Update of /cvsroot/aolserver/aolserver/nscgi In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv32100 Modified Files: nscgi.c Log Message: Oops, REQUEST_URI should have only been the Request-URI, not including the query string. Index: nscgi.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nscgi/nscgi.c,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** nscgi.c 24 Jan 2008 13:21:12 -0000 1.33 --- nscgi.c 24 Jan 2008 14:29:18 -0000 1.34 *************** *** 749,759 **** */ ! Ns_DStringAppend(dsPtr, conn->request->url); ! if (conn->request->query != NULL) { ! Ns_DStringVarAppend(dsPtr, "?", conn->request->query, NULL); ! } ! SetUpdate(cgiPtr->env, "REQUEST_URI", dsPtr->string); ! Ns_DStringTrunc(dsPtr, 0); ! SetUpdate(cgiPtr->env, "SCRIPT_NAME", cgiPtr->name); SetUpdate(cgiPtr->env, "SCRIPT_FILENAME", cgiPtr->path); --- 749,753 ---- */ ! SetUpdate(cgiPtr->env, "REQUEST_URI", conn->request->url); SetUpdate(cgiPtr->env, "SCRIPT_NAME", cgiPtr->name); SetUpdate(cgiPtr->env, "SCRIPT_FILENAME", cgiPtr->path); |
|
From: <do...@us...> - 2008-01-24 13:31:46
|
Update of /cvsroot/aolserver/aolserver/nscgi In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv11793 Modified Files: Tag: aolserver_v40_bp nscgi.c Log Message: Backported nscgi.c rev 1.33 change to aolserver_v40_bp branch. Index: nscgi.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nscgi/nscgi.c,v retrieving revision 1.23.2.3 retrieving revision 1.23.2.4 diff -C2 -d -r1.23.2.3 -r1.23.2.4 *** nscgi.c 24 Jan 2008 13:28:25 -0000 1.23.2.3 --- nscgi.c 24 Jan 2008 13:31:47 -0000 1.23.2.4 *************** *** 121,124 **** --- 121,126 ---- static int devNull; + static Tcl_ObjCmdProc CgiTclRegisterCgiObjCmd; + static int AddCmds(Tcl_Interp *interp, void *arg); static Ns_OpProc CgiRequest; static void CgiRegister(Mod *modPtr, char *map); *************** *** 136,139 **** --- 138,145 ---- static void SetUpdate(Ns_Set *set, char *key, char *value); + /* + * For AOLserver + */ + int Ns_ModuleVersion = 1; *************** *** 256,259 **** --- 262,267 ---- Ns_DStringFree(&ds); + Ns_TclInitInterps(server, AddCmds, modPtr); + return NS_OK; } *************** *** 263,266 **** --- 271,328 ---- *---------------------------------------------------------------------- * + * AddCmds -- + * + * Add Tcl commands for nscgi + * + * Results: + * NS_OK + * + * Side effects: + * Adds Tcl commands + * + *---------------------------------------------------------------------- + */ + + static int + AddCmds(Tcl_Interp *interp, void *arg) + { + Tcl_CreateObjCommand(interp, "ns_register_cgi", CgiTclRegisterCgiObjCmd, arg, NULL); + return NS_OK; + } + + + /* + *---------------------------------------------------------------------- + * + * CgiTclRegisterCgiObjCmd -- + * + * Implements ns_register_cgi as obj command. + * + * Results: + * Tcl result. + * + * Side effects: + * See docs. + * + *---------------------------------------------------------------------- + */ + + int + CgiTclRegisterCgiObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) + { + Mod *modPtr = (Mod *) arg; + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "map"); + return TCL_ERROR; + } + CgiRegister(modPtr, Tcl_GetString(objv[1])); + return TCL_OK; + } + + + /* + *---------------------------------------------------------------------- + * * CgiRequest - * *************** *** 770,773 **** --- 832,842 ---- */ + Ns_DStringAppend(dsPtr, conn->request->url); + if (conn->request->query != NULL) { + Ns_DStringVarAppend(dsPtr, "?", conn->request->query, NULL); + } + SetUpdate(cgiPtr->env, "REQUEST_URI", dsPtr->string); + Ns_DStringTrunc(dsPtr, 0); + SetUpdate(cgiPtr->env, "SCRIPT_NAME", cgiPtr->name); SetUpdate(cgiPtr->env, "SCRIPT_FILENAME", cgiPtr->path); |
|
From: <do...@us...> - 2008-01-24 13:28:27
|
Update of /cvsroot/aolserver/aolserver/nscgi In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv10608 Modified Files: Tag: aolserver_v40_bp nscgi.c Log Message: Untabified source, no code changes. Index: nscgi.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nscgi/nscgi.c,v retrieving revision 1.23.2.2 retrieving revision 1.23.2.3 diff -C2 -d -r1.23.2.2 -r1.23.2.3 *** nscgi.c 10 May 2005 01:19:50 -0000 1.23.2.2 --- nscgi.c 24 Jan 2008 13:28:25 -0000 1.23.2.3 *************** *** 28,32 **** */ - static const char *RCSID = "@(#) $Header$, compiled: " __DATE__ " " __TIME__; --- 28,31 ---- *************** *** 34,53 **** #include <sys/stat.h> #include <ctype.h> [...1571 lines suppressed...] * * Results: ! * None. * * Side effects: ! * None. * *---------------------------------------------------------------------- --- 1307,1317 ---- * SetUpdate - * ! * Update value in an Ns_Set, translating NULL to "". * * Results: ! * None. * * Side effects: ! * None. * *---------------------------------------------------------------------- |
|
From: <do...@us...> - 2008-01-24 13:21:13
|
Update of /cvsroot/aolserver/aolserver/nscgi In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv6747 Modified Files: nscgi.c Log Message: Added Tcl command "ns_register_cgi" which effectively does the same as "ns_param map" at startup, as it takes the same argument, the map string. Also, REQUEST_URI is now properly set in the env. for CGI executables. Index: nscgi.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nscgi/nscgi.c,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** nscgi.c 24 Jan 2008 03:49:37 -0000 1.32 --- nscgi.c 24 Jan 2008 13:21:12 -0000 1.33 *************** *** 110,113 **** --- 110,119 ---- } Map; + /* + * Local functions defined in this file + */ + + static Tcl_ObjCmdProc CgiTclRegisterCgiObjCmd; + static int AddCmds(Tcl_Interp *interp, void *arg); static Ns_OpProc CgiRequest; static int CgiRegister(Mod *modPtr, char *map); *************** *** 224,227 **** --- 230,240 ---- Ns_MutexSetName2(&modPtr->lock, "nscgi", server); } + + /* + * N.B. What happens next when this module gets loaded more than once? + */ + + Ns_TclInitInterps(server, AddCmds, modPtr); + return NS_OK; } *************** *** 231,234 **** --- 244,300 ---- *---------------------------------------------------------------------- * + * AddCmds -- + * + * Add Tcl commands for nscgi + * + * Results: + * NS_OK + * + * Side effects: + * Adds Tcl commands + * + *---------------------------------------------------------------------- + */ + + static int + AddCmds(Tcl_Interp *interp, void *arg) + { + Tcl_CreateObjCommand(interp, "ns_register_cgi", CgiTclRegisterCgiObjCmd, arg, NULL); + return NS_OK; + } + + /* + *---------------------------------------------------------------------- + * + * CgiTclRegisterCgiObjCmd -- + * + * Implements ns_register_cgi as obj command. + * + * Results: + * Tcl result. + * + * Side effects: + * See docs. + * + *---------------------------------------------------------------------- + */ + + int + CgiTclRegisterCgiObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) + { + Mod *modPtr = (Mod *) arg; + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "map"); + return TCL_ERROR; + } + CgiRegister(modPtr, Tcl_GetString(objv[1])); + return TCL_OK; + } + + + /* + *---------------------------------------------------------------------- + * * CgiRequest - * *************** *** 683,686 **** --- 749,759 ---- */ + Ns_DStringAppend(dsPtr, conn->request->url); + if (conn->request->query != NULL) { + Ns_DStringVarAppend(dsPtr, "?", conn->request->query, NULL); + } + SetUpdate(cgiPtr->env, "REQUEST_URI", dsPtr->string); + Ns_DStringTrunc(dsPtr, 0); + SetUpdate(cgiPtr->env, "SCRIPT_NAME", cgiPtr->name); SetUpdate(cgiPtr->env, "SCRIPT_FILENAME", cgiPtr->path); |
|
From: <do...@us...> - 2008-01-24 03:49:34
|
Update of /cvsroot/aolserver/aolserver/nscgi In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv18070 Modified Files: nscgi.c Log Message: Untabified source, no code changes. Index: nscgi.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nscgi/nscgi.c,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** nscgi.c 13 Apr 2006 19:05:57 -0000 1.31 --- nscgi.c 24 Jan 2008 03:49:37 -0000 1.32 *************** *** 28,32 **** */ - static const char *RCSID = "@(#) $Header$, compiled: " __DATE__ " " __TIME__; --- 28,31 ---- *************** *** 34,51 **** #include <sys/stat.h> #include <ctype.h> [...1477 lines suppressed...] * *---------------------------------------------------------------------- --- 1231,1241 ---- * SetUpdate - * ! * Update value in an Ns_Set, translating NULL to "". * * Results: ! * None. * * Side effects: ! * None. * *---------------------------------------------------------------------- *************** *** 1248,1250 **** Ns_SetUpdate(set, key, value ? value : ""); } - --- 1247,1248 ---- |
|
From: <gne...@us...> - 2007-10-26 23:14:23
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv25463 Modified Files: nsd.h pools.c queue.c Log Message: Keep track of connection thread state. Two new variables are introduced: - starting: keeps the number of currently starting threads - waiting: the number of threads in the cond waiting state These variables help to get a more precise understanding and allow for better knowlege for thread creation (especially under heavy load) Index: nsd.h =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/nsd.h,v retrieving revision 1.118 retrieving revision 1.119 diff -C2 -d -r1.118 -r1.119 *** nsd.h 20 Oct 2007 11:57:19 -0000 1.118 --- nsd.h 26 Oct 2007 23:14:17 -0000 1.119 *************** *** 565,568 **** --- 565,570 ---- int current; int idle; + int waiting; + int starting; int timeout; int maxconns; Index: pools.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/pools.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** pools.c 20 Oct 2007 11:57:19 -0000 1.11 --- pools.c 26 Oct 2007 23:14:17 -0000 1.12 *************** *** 185,188 **** --- 185,201 ---- } } + /* catch unsane values */ + if (poolPtr->threads.max < 1) { + Tcl_SetResult(interp, "maxthreads can't be less than 1", TCL_STATIC); + return TCL_ERROR; + } + if (poolPtr->threads.min > poolPtr->threads.max) { + Tcl_SetResult(interp, "minthreads can't be larger than maxthreads", TCL_STATIC); + return TCL_ERROR; + } + if (poolPtr->threads.timeout < 1) { + Tcl_SetResult(interp, "timeout cannot be less than 1", TCL_STATIC); + return TCL_ERROR; + } if (PoolResult(interp, poolPtr) != TCL_OK) { return TCL_ERROR; *************** *** 480,485 **** int i; ! poolPtr->threads.current = poolPtr->threads.idle = poolPtr->threads.min; for (i = 0; i < poolPtr->threads.min; ++i) { NsCreateConnThread(poolPtr, 1); } --- 493,503 ---- int i; ! poolPtr->threads.current = 0; ! poolPtr->threads.starting = 0; ! poolPtr->threads.waiting = 0; ! poolPtr->threads.idle = 0; ! for (i = 0; i < poolPtr->threads.min; ++i) { + poolPtr->threads.current ++; NsCreateConnThread(poolPtr, 1); } Index: queue.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/queue.c,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** queue.c 22 Oct 2007 22:56:23 -0000 1.43 --- queue.c 26 Oct 2007 23:14:17 -0000 1.44 *************** *** 179,203 **** poolPtr->queue.wait.lastPtr = connPtr; connPtr->nextPtr = NULL; ! if (poolPtr->threads.idle == 0 ! && poolPtr->threads.current < poolPtr->threads.max) { ! ++poolPtr->threads.idle; ! ++poolPtr->threads.current; create = 1; } ! /* ! Note that in situations, where the maximum number of ! connection threads is reached (poolPtr->threads.idle == 0 and create == 0) ! the request is queued without resources to process these. ! One has to take care about processing he entries of the queue, when ! resources become available again. ! */ ! ! ++poolPtr->queue.wait.num; ! Ns_MutexUnlock(&poolPtr->lock); if (create) { NsCreateConnThread(poolPtr, 1); ! } else { Ns_CondSignal(&poolPtr->cond); } } --- 179,213 ---- poolPtr->queue.wait.lastPtr = connPtr; connPtr->nextPtr = NULL; ! ! if (poolPtr->queue.wait.num > 0 ! && poolPtr->threads.current < poolPtr->threads.max) { ! /* ! Create a new thread if no thread is waiting and the number ! of currently starting or running threads is below max. ! */ create = 1; } ! poolPtr->queue.wait.num ++; ! if (create) { + poolPtr->threads.current ++; + Ns_MutexUnlock(&poolPtr->lock); NsCreateConnThread(poolPtr, 1); ! } else if (poolPtr->threads.waiting > 0) { ! /* ! There are threads waiting. Signal to process ! the request. ! */ Ns_CondSignal(&poolPtr->cond); + Ns_MutexUnlock(&poolPtr->lock); + } else { + /* + We might have missed signaling, since we are already using + max resources, and no thread is available. In such a case + the autorecovery at thread exist has to care to process + the outstanding requests + */ + Ns_MutexUnlock(&poolPtr->lock); } } *************** *** 379,382 **** --- 389,396 ---- Ns_MutexLock(&poolPtr->lock); + + poolPtr->threads.starting--; + poolPtr->threads.idle++; + while (poolPtr->threads.maxconns <= 0 || ncons-- > 0) { *************** *** 385,389 **** * arrive in the configured timeout period. */ ! if (poolPtr->threads.current <= poolPtr->threads.min) { timePtr = NULL; --- 399,403 ---- * arrive in the configured timeout period. */ ! if (poolPtr->threads.current <= poolPtr->threads.min) { timePtr = NULL; *************** *** 394,398 **** } ! status = NS_OK; while (!poolPtr->shutdown && status == NS_OK --- 408,412 ---- } ! status = NS_OK; while (!poolPtr->shutdown && status == NS_OK *************** *** 401,405 **** --- 415,421 ---- nothing is queued, we wait for a queue entry */ + poolPtr->threads.waiting++; status = Ns_CondTimedWait(&poolPtr->cond, &poolPtr->lock, timePtr); + poolPtr->threads.waiting--; } *************** *** 420,510 **** connPtr->nextPtr = NULL; connPtr->prevPtr = poolPtr->queue.active.lastPtr; ! if (poolPtr->queue.active.lastPtr != NULL) { ! poolPtr->queue.active.lastPtr->nextPtr = connPtr; ! } ! poolPtr->queue.active.lastPtr = connPtr; ! if (poolPtr->queue.active.firstPtr == NULL) { ! poolPtr->queue.active.firstPtr = connPtr; ! } ! poolPtr->threads.idle--; ! poolPtr->queue.wait.num--; ! Ns_MutexUnlock(&poolPtr->lock); ! ! /* ! * Run the connection. ! */ ! ! Ns_MutexLock(&connlock); ! dataPtr->connPtr = connPtr; ! Ns_MutexUnlock(&connlock); ! Ns_GetTime(&connPtr->times.run); ! ConnRun(connPtr); ! Ns_MutexLock(&connlock); ! dataPtr->connPtr = NULL; ! Ns_MutexUnlock(&connlock); ! /* ! * Remove from the active list and push on the free list. ! */ ! Ns_MutexLock(&poolPtr->lock); ! if (connPtr->prevPtr != NULL) { ! connPtr->prevPtr->nextPtr = connPtr->nextPtr; ! } else { ! poolPtr->queue.active.firstPtr = connPtr->nextPtr; ! } ! if (connPtr->nextPtr != NULL) { ! connPtr->nextPtr->prevPtr = connPtr->prevPtr; ! } else { ! poolPtr->queue.active.lastPtr = connPtr->prevPtr; ! } ! poolPtr->threads.idle++; ! Ns_MutexUnlock(&poolPtr->lock); ! NsFreeConn(connPtr); ! Ns_MutexLock(&poolPtr->lock); } ! /* * Append this thread to list of threads to reap. */ ! Ns_MutexLock(&joinlock); dataPtr->nextPtr = joinPtr; joinPtr = dataPtr; Ns_MutexUnlock(&joinlock); ! /* * Mark this thread as no longer active. */ ! if (poolPtr->shutdown) { ! msg = "shutdown pending"; } - poolPtr->threads.idle--; poolPtr->threads.current--; ! if (poolPtr->threads.current == 0) { ! Ns_CondBroadcast(&poolPtr->cond); ! } ! ! if (((poolPtr->queue.wait.num > 0 && poolPtr->threads.idle == 0) || (poolPtr->threads.current < poolPtr->threads.min) ) && !poolPtr->shutdown) { /* ! We are either exiting from a thread in a situation, where more ! queue entries are still waiting, or ! we have less than minthreads connection threads alive. ! In these situations recreate a connection thread. */ ! poolPtr->threads.current++; ! poolPtr->threads.idle++; Ns_MutexUnlock(&poolPtr->lock); NsCreateConnThread(poolPtr, 0); /* joinThreads == 0 to avoid deadlock */ } else { Ns_MutexUnlock(&poolPtr->lock); } ! Ns_Log(Notice, "exiting: %s", msg); Ns_ThreadExit(dataPtr); --- 436,530 ---- connPtr->nextPtr = NULL; connPtr->prevPtr = poolPtr->queue.active.lastPtr; ! if (poolPtr->queue.active.lastPtr != NULL) { ! poolPtr->queue.active.lastPtr->nextPtr = connPtr; ! } ! poolPtr->queue.active.lastPtr = connPtr; ! if (poolPtr->queue.active.firstPtr == NULL) { ! poolPtr->queue.active.firstPtr = connPtr; ! } ! poolPtr->threads.idle--; ! poolPtr->queue.wait.num--; ! Ns_MutexUnlock(&poolPtr->lock); ! /* ! * Run the connection. ! */ ! Ns_MutexLock(&connlock); ! dataPtr->connPtr = connPtr; ! Ns_MutexUnlock(&connlock); ! ! Ns_GetTime(&connPtr->times.run); ! ConnRun(connPtr); ! Ns_MutexLock(&connlock); ! dataPtr->connPtr = NULL; ! Ns_MutexUnlock(&connlock); ! ! /* ! * Remove from the active list and push on the free list. ! */ ! Ns_MutexLock(&poolPtr->lock); ! if (connPtr->prevPtr != NULL) { ! connPtr->prevPtr->nextPtr = connPtr->nextPtr; ! } else { ! poolPtr->queue.active.firstPtr = connPtr->nextPtr; ! } ! if (connPtr->nextPtr != NULL) { ! connPtr->nextPtr->prevPtr = connPtr->prevPtr; ! } else { ! poolPtr->queue.active.lastPtr = connPtr->prevPtr; ! } ! poolPtr->threads.idle++; ! Ns_MutexUnlock(&poolPtr->lock); ! NsFreeConn(connPtr); ! Ns_MutexLock(&poolPtr->lock); } ! /* * Append this thread to list of threads to reap. */ ! Ns_MutexLock(&joinlock); dataPtr->nextPtr = joinPtr; joinPtr = dataPtr; Ns_MutexUnlock(&joinlock); ! /* * Mark this thread as no longer active. */ ! if (poolPtr->shutdown) { ! msg = "shutdown pending"; } poolPtr->threads.current--; ! poolPtr->threads.idle--; ! if (((poolPtr->queue.wait.num > 0 ! && poolPtr->threads.idle == 0 ! && poolPtr->threads.starting == 0 ! ) || (poolPtr->threads.current < poolPtr->threads.min) ) && !poolPtr->shutdown) { /* ! Recreate a thread when on of the condings hold ! - there are more queue entries are still waiting, ! but no thread is either starting or idle, or ! - there are less than minthreads connection threads alive. */ ! poolPtr->threads.current ++; Ns_MutexUnlock(&poolPtr->lock); NsCreateConnThread(poolPtr, 0); /* joinThreads == 0 to avoid deadlock */ + } else if (poolPtr->queue.wait.num > 0 && poolPtr->threads.waiting > 0) { + /* + Wake up a waiting thread + */ + Ns_CondSignal(&poolPtr->cond); + Ns_MutexUnlock(&poolPtr->lock); } else { Ns_MutexUnlock(&poolPtr->lock); } ! Ns_Log(Notice, "exiting: %s", msg); Ns_ThreadExit(dataPtr); *************** *** 669,672 **** --- 689,695 ---- dataPtr->poolPtr = poolPtr; dataPtr->connPtr = NULL; + Ns_MutexLock(&poolPtr->lock); + poolPtr->threads.starting ++; + Ns_MutexUnlock(&poolPtr->lock); Ns_ThreadCreate(NsConnThread, dataPtr, 0, &dataPtr->thread); } |
|
From: <gne...@us...> - 2007-10-22 22:56:24
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv19325 Modified Files: queue.c Log Message: Remove old code for allowing to run more than maxconn requests in one thread (replaced by thread creation); Maintain min-threads threads when threads are exiting. Index: queue.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/queue.c,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** queue.c 21 Oct 2007 21:38:09 -0000 1.42 --- queue.c 22 Oct 2007 22:56:23 -0000 1.43 *************** *** 379,398 **** Ns_MutexLock(&poolPtr->lock); ! /* ! The last test (poolPtr->queue.wait.num > 0) might lead to situations ! where a single connection thread processes more than maxconns ! connection requests. This condition fixes situations, where the ! driver accepts more connection requests than resources available. ! When e.g. the number of queued requests is higher than connections per threads, ! this might lead to situations, where there server comes to a halt. ! Maybe it is a good idea to limit the number of queued requests or ! to start a new thread automatically, when the current one exists due ! to max conns. However, the test with the queue.wait.num consition ! is better than a hang. ! */ ! while (poolPtr->threads.maxconns <= 0 ! || ncons-- > 0 ! /*|| poolPtr->queue.wait.num > 1*/ ! ) { /* --- 379,383 ---- Ns_MutexLock(&poolPtr->lock); ! while (poolPtr->threads.maxconns <= 0 || ncons-- > 0) { /* *************** *** 504,511 **** } ! if (poolPtr->queue.wait.num > 0 && poolPtr->threads.idle == 0 && !poolPtr->shutdown) { ! /* We are exiting from a thread in a situation, where more ! queue entries are waiting. Since no other mechanism ensures ! that the entries are processed, we recreate a new connection thread. */ poolPtr->threads.current++; --- 489,501 ---- } ! ! if (((poolPtr->queue.wait.num > 0 && poolPtr->threads.idle == 0) ! || (poolPtr->threads.current < poolPtr->threads.min) ! ) && !poolPtr->shutdown) { ! /* ! We are either exiting from a thread in a situation, where more ! queue entries are still waiting, or ! we have less than minthreads connection threads alive. ! In these situations recreate a connection thread. */ poolPtr->threads.current++; |
|
From: <gne...@us...> - 2007-10-21 21:38:12
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv28956/nsd Modified Files: queue.c Log Message: protect poolptr condition by mutex Index: queue.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/queue.c,v retrieving revision 1.41 retrieving revision 1.42 diff -C2 -d -r1.41 -r1.42 *** queue.c 20 Oct 2007 11:57:19 -0000 1.41 --- queue.c 21 Oct 2007 21:38:09 -0000 1.42 *************** *** 503,507 **** Ns_CondBroadcast(&poolPtr->cond); } - Ns_MutexUnlock(&poolPtr->lock); if (poolPtr->queue.wait.num > 0 && poolPtr->threads.idle == 0 && !poolPtr->shutdown) { --- 503,506 ---- *************** *** 510,518 **** that the entries are processed, we recreate a new connection thread. */ - Ns_MutexLock(&poolPtr->lock); poolPtr->threads.current++; poolPtr->threads.idle++; Ns_MutexUnlock(&poolPtr->lock); NsCreateConnThread(poolPtr, 0); /* joinThreads == 0 to avoid deadlock */ } --- 509,518 ---- that the entries are processed, we recreate a new connection thread. */ poolPtr->threads.current++; poolPtr->threads.idle++; Ns_MutexUnlock(&poolPtr->lock); NsCreateConnThread(poolPtr, 0); /* joinThreads == 0 to avoid deadlock */ + } else { + Ns_MutexUnlock(&poolPtr->lock); } |
|
From: <gne...@us...> - 2007-10-20 16:39:23
|
Update of /cvsroot/aolserver/aolserver/tcl In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv22474 Modified Files: util.tcl Log Message: using Tcl 8.4 string comparison operators Index: util.tcl =================================================================== RCS file: /cvsroot/aolserver/aolserver/tcl/util.tcl,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** util.tcl 8 Feb 2002 07:56:16 -0000 1.4 --- util.tcl 20 Oct 2007 16:39:21 -0000 1.5 *************** *** 67,71 **** upvar $formVar form set form [ns_conn form $conn] ! if {[string match "" $form]} { ns_returnbadrequest $conn "Missing HTML FORM data" return 0 --- 67,71 ---- upvar $formVar form set form [ns_conn form $conn] ! if {$form eq ""} { ns_returnbadrequest $conn "Missing HTML FORM data" return 0 *************** *** 75,79 **** proc ns_paren {val} { ! if {$val != ""} { return "($val)" } else { --- 75,79 ---- proc ns_paren {val} { ! if {$val ne ""} { return "($val)" } else { *************** *** 101,105 **** set newhtml "" ! while {$htmlpiece != ""} { if {[string index $htmlpiece 0] == "<"} { regexp {<([^>]*)>(.*)} $htmlpiece m tag htmlpiece --- 101,105 ---- set newhtml "" ! while {$htmlpiece ne ""} { if {[string index $htmlpiece 0] == "<"} { regexp {<([^>]*)>(.*)} $htmlpiece m tag htmlpiece *************** *** 194,198 **** regexp {^([^<]*)(.*)} $htmlpiece m txt htmlpiece ! if {[string match "" $value]} { set value [string trim $txt] } --- 194,198 ---- regexp {^([^<]*)(.*)} $htmlpiece m txt htmlpiece ! if {$value eq ""} { set value [string trim $txt] } *************** *** 284,296 **** set labels {} while {[string index [lindex $args 0] 0] == "-"} { ! if {[lindex $args 0] == "-multi"} { set multi 1 set args [lreplace $args 0 0] } ! if {[lindex $args 0] == "-sort"} { set sort 1 set args [lreplace $args 0 0] } ! if {[lindex $args 0] == "-labels"} { set labels [lindex $args 1] set args [lreplace $args 0 1] --- 284,296 ---- set labels {} while {[string index [lindex $args 0] 0] == "-"} { ! if {[lindex $args 0] eq "-multi"} { set multi 1 set args [lreplace $args 0 0] } ! if {[lindex $args 0] eq "-sort"} { set sort 1 set args [lreplace $args 0 0] } ! if {[lindex $args 0] eq "-labels"} { set labels [lindex $args 1] set args [lreplace $args 0 1] *************** *** 323,327 **** set lvpairs {} for {set i 0} {$i < $len} {incr i} { ! if {[string match "" $labels]} { set label [lindex $values $i] } else { --- 323,327 ---- set lvpairs {} for {set i 0} {$i < $len} {incr i} { ! if {$labels eq ""} { set label [lindex $values $i] } else { |
|
From: <gne...@us...> - 2007-10-20 11:57:22
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv9787 Modified Files: nsd.h pools.c queue.c Log Message: Continuing work on BUG #1615787; instead of performing in boundary situations in the worst case more than the configured maxconns requests, a new connection thread is created automatically after the exit of a thread coming to the end of it work cycle, when jobs are pending and no other thread is able to process these. Index: nsd.h =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/nsd.h,v retrieving revision 1.117 retrieving revision 1.118 diff -C2 -d -r1.117 -r1.118 *** nsd.h 20 Jun 2006 03:21:42 -0000 1.117 --- nsd.h 20 Oct 2007 11:57:19 -0000 1.118 *************** *** 984,988 **** extern int NsTclGetPool(Tcl_Interp *interp, char *pool, Pool **poolPtrPtr); extern Tcl_ObjCmdProc NsTclListPoolsObjCmd; ! extern void NsCreateConnThread(Pool *poolPtr); extern void NsJoinConnThreads(void); extern int NsStartDrivers(void); --- 984,988 ---- extern int NsTclGetPool(Tcl_Interp *interp, char *pool, Pool **poolPtrPtr); extern Tcl_ObjCmdProc NsTclListPoolsObjCmd; ! extern void NsCreateConnThread(Pool *poolPtr, int joinThreads); extern void NsJoinConnThreads(void); extern int NsStartDrivers(void); Index: pools.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/pools.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** pools.c 2 Aug 2005 21:58:52 -0000 1.10 --- pools.c 20 Oct 2007 11:57:19 -0000 1.11 *************** *** 482,486 **** poolPtr->threads.current = poolPtr->threads.idle = poolPtr->threads.min; for (i = 0; i < poolPtr->threads.min; ++i) { ! NsCreateConnThread(poolPtr); } } --- 482,486 ---- poolPtr->threads.current = poolPtr->threads.idle = poolPtr->threads.min; for (i = 0; i < poolPtr->threads.min; ++i) { ! NsCreateConnThread(poolPtr, 1); } } Index: queue.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/queue.c,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** queue.c 19 Oct 2007 18:00:01 -0000 1.40 --- queue.c 20 Oct 2007 11:57:19 -0000 1.41 *************** *** 185,200 **** create = 1; } /* Note that in situations, where the maximum number of connection threads is reached (poolPtr->threads.idle == 0 and create == 0) the request is queued without resources to process these. ! One has to take care about that one restarts the queue, when resources become available again. */ - ++poolPtr->queue.wait.num; Ns_MutexUnlock(&poolPtr->lock); if (create) { ! NsCreateConnThread(poolPtr); } else { Ns_CondSignal(&poolPtr->cond); --- 185,201 ---- create = 1; } + /* Note that in situations, where the maximum number of connection threads is reached (poolPtr->threads.idle == 0 and create == 0) the request is queued without resources to process these. ! One has to take care about processing he entries of the queue, when resources become available again. */ + ++poolPtr->queue.wait.num; Ns_MutexUnlock(&poolPtr->lock); if (create) { ! NsCreateConnThread(poolPtr, 1); } else { Ns_CondSignal(&poolPtr->cond); *************** *** 390,394 **** is better than a hang. */ ! while (poolPtr->threads.maxconns <= 0 || ncons-- > 0 || poolPtr->queue.wait.num > 1) { /* --- 391,398 ---- is better than a hang. */ ! while (poolPtr->threads.maxconns <= 0 ! || ncons-- > 0 ! /*|| poolPtr->queue.wait.num > 1*/ ! ) { /* *************** *** 406,420 **** status = NS_OK; ! ! if (poolPtr->queue.wait.num == 0) { /* nothing is queued, we wait for a queue entry */ ! while (!poolPtr->shutdown ! && status == NS_OK ! && poolPtr->queue.wait.firstPtr == NULL) { ! status = Ns_CondTimedWait(&poolPtr->cond, &poolPtr->lock, timePtr); ! } } if (poolPtr->queue.wait.firstPtr == NULL) { msg = "timeout waiting for connection"; --- 410,422 ---- status = NS_OK; ! while (!poolPtr->shutdown ! && status == NS_OK ! && poolPtr->queue.wait.firstPtr == NULL) { /* nothing is queued, we wait for a queue entry */ ! status = Ns_CondTimedWait(&poolPtr->cond, &poolPtr->lock, timePtr); } + if (poolPtr->queue.wait.firstPtr == NULL) { msg = "timeout waiting for connection"; *************** *** 503,506 **** --- 505,520 ---- Ns_MutexUnlock(&poolPtr->lock); + if (poolPtr->queue.wait.num > 0 && poolPtr->threads.idle == 0 && !poolPtr->shutdown) { + /* We are exiting from a thread in a situation, where more + queue entries are waiting. Since no other mechanism ensures + that the entries are processed, we recreate a new connection thread. + */ + Ns_MutexLock(&poolPtr->lock); + poolPtr->threads.current++; + poolPtr->threads.idle++; + Ns_MutexUnlock(&poolPtr->lock); + NsCreateConnThread(poolPtr, 0); /* joinThreads == 0 to avoid deadlock */ + } + Ns_Log(Notice, "exiting: %s", msg); Ns_ThreadExit(dataPtr); *************** *** 646,650 **** void ! NsCreateConnThread(Pool *poolPtr) { ConnData *dataPtr; --- 660,664 ---- void ! NsCreateConnThread(Pool *poolPtr, int joinThreads) { ConnData *dataPtr; *************** *** 654,658 **** */ ! NsJoinConnThreads(); /* --- 668,674 ---- */ ! if (joinThreads) { ! NsJoinConnThreads(); ! } /* |
|
From: <rm...@us...> - 2007-10-19 18:00:02
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv1579 Modified Files: queue.c Log Message: Previous versions of AOLserver included the threadpool name in the name of the thread. This commit simply adds back that making it easier to figure out what threadpool was used for a request. Index: queue.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/queue.c,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** queue.c 19 Oct 2007 09:46:38 -0000 1.39 --- queue.c 19 Oct 2007 18:00:01 -0000 1.40 *************** *** 367,371 **** Ns_TlsSet(&ctdtls, dataPtr); Ns_MutexLock(&poolPtr->lock); ! sprintf(name, "-conn:%d-", poolPtr->threads.nextid++); Ns_MutexUnlock(&poolPtr->lock); Ns_ThreadSetName(name); --- 367,371 ---- Ns_TlsSet(&ctdtls, dataPtr); Ns_MutexLock(&poolPtr->lock); ! sprintf(name, "-%s:%d-", poolPtr->name, poolPtr->threads.nextid++); Ns_MutexUnlock(&poolPtr->lock); Ns_ThreadSetName(name); |
|
From: <gne...@us...> - 2007-10-19 09:46:44
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv19049 Modified Files: driver.c queue.c Log Message: Better fix for BUG #1615787 in aolserver 4.5. Although the original fix apparently helped for www.openacs.org, it appears to simply change the timing, but did not fix the problem itself. The problem was that under limited resource configurations (e.g. maxthreads 5, maxconnections 3) and heavy traffic, incoming requests were queued but not processed in new connection threads. The situation was especially bad, when the number of queued requests was larger than maxconnections, since after processing n requests the server was idling with a high number of queued requests. New requests were put to the end of the queue while old (maybe already timed-out) requests are being served. The server appeared to hang. The current fix cares for queued requests even when maxconns is exceeded. A maybe better approach is to limit the number of queued requests or to restart automatically threads when a thread exists due to maxconns exceeded. Index: driver.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/driver.c,v retrieving revision 1.56 retrieving revision 1.57 diff -C2 -d -r1.56 -r1.57 *** driver.c 15 Dec 2006 17:26:57 -0000 1.56 --- driver.c 19 Oct 2007 09:46:38 -0000 1.57 *************** *** 949,958 **** /* - * Register an at-ready callback to trigger the poll. - */ - - Ns_RegisterAtReady(TriggerDriver, drvPtr); - - /* * Loop forever until signalled to shutdown and all * connections are complete and gracefully closed. --- 949,952 ---- *************** *** 1314,1318 **** Ns_DStringPrintf(drvPtr->queryPtr, "time %ld:%ld " ! "spins %ld accepts %u queued %u reads %u " "dropped %u overflow %d timeout %u", now.sec, now.usec, --- 1308,1312 ---- Ns_DStringPrintf(drvPtr->queryPtr, "time %ld:%ld " ! "spins %d accepts %u queued %u reads %u " "dropped %u overflow %d timeout %u", now.sec, now.usec, Index: queue.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/queue.c,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** queue.c 13 Apr 2006 19:06:24 -0000 1.38 --- queue.c 19 Oct 2007 09:46:38 -0000 1.39 *************** *** 185,189 **** --- 185,197 ---- create = 1; } + /* + Note that in situations, where the maximum number of + connection threads is reached (poolPtr->threads.idle == 0 and create == 0) + the request is queued without resources to process these. + One has to take care about that one restarts the queue, when + resources become available again. + */ ++poolPtr->queue.wait.num; + Ns_MutexUnlock(&poolPtr->lock); if (create) { *************** *** 370,374 **** Ns_MutexLock(&poolPtr->lock); ! while (poolPtr->threads.maxconns <= 0 || ncons-- > 0) { /* --- 378,394 ---- Ns_MutexLock(&poolPtr->lock); ! /* ! The last test (poolPtr->queue.wait.num > 0) might lead to situations ! where a single connection thread processes more than maxconns ! connection requests. This condition fixes situations, where the ! driver accepts more connection requests than resources available. ! When e.g. the number of queued requests is higher than connections per threads, ! this might lead to situations, where there server comes to a halt. ! Maybe it is a good idea to limit the number of queued requests or ! to start a new thread automatically, when the current one exists due ! to max conns. However, the test with the queue.wait.num consition ! is better than a hang. ! */ ! while (poolPtr->threads.maxconns <= 0 || ncons-- > 0 || poolPtr->queue.wait.num > 1) { /* *************** *** 386,394 **** status = NS_OK; ! while (!poolPtr->shutdown ! && status == NS_OK ! && poolPtr->queue.wait.firstPtr == NULL) { ! status = Ns_CondTimedWait(&poolPtr->cond, &poolPtr->lock, timePtr); ! } if (poolPtr->queue.wait.firstPtr == NULL) { msg = "timeout waiting for connection"; --- 406,420 ---- status = NS_OK; ! ! if (poolPtr->queue.wait.num == 0) { ! /* ! nothing is queued, we wait for a queue entry ! */ ! while (!poolPtr->shutdown ! && status == NS_OK ! && poolPtr->queue.wait.firstPtr == NULL) { ! status = Ns_CondTimedWait(&poolPtr->cond, &poolPtr->lock, timePtr); ! } ! } if (poolPtr->queue.wait.firstPtr == NULL) { msg = "timeout waiting for connection"; |