Patch is attached, works great
Zoran Vasiljevic wrote:
Am 30.12.2005 um 16:02 schrieb Vlad Seryakov:
Is it worth trying?
Yesterday!
Zoran
-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log
files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
naviserver-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/naviserver-devel
--
Vlad Seryakov
571 262-8608 office
[EMAIL PROTECTED]
http://www.crystalballinc.com/vlad/
*** ../../naviserver/nsd/driver.c 2005-11-14 11:00:11.000000000 -0500
--- driver.c 2005-12-30 12:18:05.000000000 -0500
***************
*** 78,83 ****
--- 78,95 ----
} ServerMap;
/*
+ * Support for upload statistics
+ */
+
+ typedef struct UploadMap {
+ unsigned long length;
+ unsigned long size;
+ } UploadMap;
+
+ static Tcl_HashTable uploadTable; /* Hash table of uploads. */
+ static Ns_Mutex uploadLock; /* Lock around upload table. */
+
+ /*
* Static functions defined in this file.
*/
***************
*** 93,98 ****
--- 105,114 ----
static void SockTimeout(Sock *sockPtr, Ns_Time *nowPtr, int timeout);
static int SetServer(Sock *sockPtr);
+ static void UploadDelete(char *url);
+ static void UploadUpdate(char *url, unsigned long length, unsigned long size);
+ static void UploadStats(char *url, unsigned long *length, unsigned long *size);
+
/*
* Static variables defined in this file.
*/
***************
*** 134,139 ****
--- 150,158 ----
NsInitDrivers(void)
{
Tcl_InitHashTable(&hosts, TCL_STRING_KEYS);
+ Ns_MutexInit(&uploadLock);
+ Ns_MutexSetName(&lock, "ns:upload");
+ Tcl_InitHashTable(&uploadTable, TCL_STRING_KEYS);
}
***************
*** 1454,1459 ****
--- 1473,1482 ----
reqPtr->woff += n;
reqPtr->avail += n;
+ if (reqPtr->length > 0 && reqPtr->request) {
+ UploadUpdate(reqPtr->request->url, reqPtr->length, reqPtr->avail);
+ }
+
return SockParse(sockPtr);
}
***************
*** 1627,1632 ****
--- 1650,1663 ----
if (reqPtr->length > 0) {
reqPtr->content[reqPtr->length] = '\0';
+
+ /*
+ * Cleanup upload statistics hash table on upload finish
+ */
+
+ if (reqPtr->request) {
+ UploadDelete(reqPtr->request->url);
+ }
}
return (reqPtr->request ? SOCK_READY : SOCK_ERROR);
}
***************
*** 1688,1690 ****
--- 1719,1792 ----
}
}
}
+
+ static void UploadDelete(char *url)
+ {
+ Tcl_HashEntry *hPtr;
+
+ if (url != NULL) {
+ Ns_MutexLock(&uploadLock);
+ hPtr = Tcl_FindHashEntry(&uploadTable, url);
+ if (hPtr != NULL) {
+ ns_free(Tcl_GetHashValue(hPtr));
+ Tcl_DeleteHashEntry(hPtr);
+ }
+ Ns_MutexUnlock(&uploadLock);
+ }
+ }
+
+ static void UploadUpdate(char *url, unsigned long length, unsigned long size)
+ {
+ int new;
+ Tcl_HashEntry *hPtr;
+ UploadMap *stats;
+
+ if (url != NULL) {
+ Ns_MutexLock(&uploadLock);
+ hPtr = Tcl_CreateHashEntry(&uploadTable, url, &new);
+ if (!new) {
+ stats = Tcl_GetHashValue(hPtr);
+ } else {
+ stats = ns_malloc(sizeof(UploadMap));
+ Tcl_SetHashValue(hPtr, stats);
+ }
+ stats->length = length;
+ stats->size = size;
+ Ns_Log(Notice, "UploadUpdate: %s: length=%lu size=%lu", url, length, size);
+ Ns_MutexUnlock(&uploadLock);
+ }
+ }
+
+ static void UploadStats(char *url, unsigned long *length, unsigned long *size)
+ {
+ Tcl_HashEntry *hPtr;
+ UploadMap *stats;
+
+ Ns_MutexLock(&uploadLock);
+ hPtr = Tcl_FindHashEntry(&uploadTable, url);
+ if (hPtr != NULL) {
+ stats = Tcl_GetHashValue(hPtr);
+ *length = stats->length;
+ *size = stats->size;
+ }
+ Ns_MutexUnlock(&uploadLock);
+ }
+
+
+ int
+ NsTclUploadStatsObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
+ {
+ char buf[64];
+ UploadMap stats = { 0, 0 };
+
+ if (objc != 2) {
+ Tcl_WrongNumArgs(interp, 1, objv, "url");
+ return TCL_ERROR;
+ }
+
+ UploadStats(Tcl_GetString(objv[1]), &stats.length, &stats.size);
+ sprintf(buf, "%lu %lu", stats.length, stats.size);
+ Tcl_AppendResult(interp, buf, NULL);
+ return NS_OK;
+ }
+
*** ../../naviserver/nsd/tclcmds.c 2005-12-30 09:35:03.000000000 -0500
--- tclcmds.c 2005-12-30 12:01:59.000000000 -0500
***************
*** 195,201 ****
NsTclVarObjCmd,
NsTclWriteContentObjCmd,
NsTclWriteFpObjCmd,
! NsTclWriteObjCmd;
extern Tcl_CmdProc
NsTclAdpDebugCmd,
--- 195,202 ----
NsTclVarObjCmd,
NsTclWriteContentObjCmd,
NsTclWriteFpObjCmd,
! NsTclWriteObjCmd,
! NsTclUploadStatsObjCmd;
extern Tcl_CmdProc
NsTclAdpDebugCmd,
***************
*** 341,346 ****
--- 342,348 ----
{"ns_uudecode", NULL, NsTclHTUUDecodeObjCmd},
{"ns_uuencode", NULL, NsTclHTUUEncodeObjCmd},
{"ns_writefp", NULL, NsTclWriteFpObjCmd},
+ {"ns_upload_stats", NULL, NsTclUploadStatsObjCmd},
/*
* Add more basic Tcl commands here.