diff --git a/src/sbbs3/js_sqlite.c b/src/sbbs3/js_sqlite.c
index c7bce08a5d5c6b88cdea707601deeb140f9d7b2c..044cabdd8de3741ef86788d7eb45ae1231e73e2e 100644
--- a/src/sbbs3/js_sqlite.c
+++ b/src/sbbs3/js_sqlite.c
@@ -1,9 +1,7 @@
-/* jsp_sqlite.c */
+/* js_sqlite.c */
 
 /* Synchronet JavaScript "Sqlite" Object */
 
-/* $Id: js_sqlite.c,v 1.99 2006/07/21 04:26:17 deuce Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -18,39 +16,26 @@
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
  * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
+ * ftp://vert.synchro.net, ftp://git.synchro.net and ftp://ftp.synchro.net	*
  *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
- * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ * Original source by Ragnarok. Heavily modified by Digital Man with ample 	*
+ * help from nelgin.														*
  ****************************************************************************/
 
 #include "sbbs.h"
 #include "sqlite3.h"
 #ifdef JAVASCRIPT
 
-// #include "jsdate.h"	/* Yes, I know this is a private header file */
-
 typedef struct
 {
-	sqlite3*	db; /* pointer to sqlite db */
-	char	name[MAX_PATH+1]; /* db filename */
-	char*	stmt; /* sql query */
-	BOOL	external;	/* externally created, don't close */
-	BOOL	debug; 
-    char*   errormsg; /* last error message */
-//	jsval *		argv = JS_ARGV(cx, arglist);
-//	jsval		rval = JSVAL_VOID;
+	sqlite3* db;    /* pointer to sqlite db */
+	char name[MAX_PATH + 1];  /* db filename */
+	char* stmt;   /* sql query */
+	BOOL debug;
+	char* errormsg;   /* last error message */
 
 } private_t;
 
@@ -59,324 +44,294 @@ static const char* getprivate_failure = "line %d %s JS_GetPrivate failed";
 static void dbprintf(BOOL error, private_t* p, char* fmt, ...)
 {
 	va_list argptr;
-	char sbuf[1024];
+	char    sbuf[1024];
 
-	if(p==NULL || (!p->debug && !error))
+	if (p == NULL || (!p->debug && !error))
 		return;
 
-    va_start(argptr,fmt);
-    vsnprintf(sbuf,sizeof(sbuf),fmt,argptr);
-	sbuf[sizeof(sbuf)-1]=0;
-    va_end(argptr);
-	lprintf(LOG_DEBUG,"Sqlite: %s" , sbuf);
-	//lprintf(LOG_DEBUG,"%04u File %s%s",p->fp ? fileno(p->fp) : 0,error ? "ERROR: ":"",sbuf);
+	va_start(argptr, fmt);
+	vsnprintf(sbuf, sizeof(sbuf), fmt, argptr);
+	sbuf[sizeof(sbuf) - 1] = 0;
+	va_end(argptr);
+	lprintf(LOG_DEBUG, "Sqlite: %s", sbuf);
 }
 
 
 /* Sqlite Object Methods */
 
-//js_open(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 static JSBool
 js_open(JSContext *cx, uintN argc, jsval *arglist)
 {
-	int         rc;
-//	jsint		bufsize=2*1024;
-//	JSString*	str;
-	private_t*	p;
-//	jsval		*rval;
-	JSObject *	obj = JS_THIS_OBJECT(cx, arglist);
-
-//	*rval = JSVAL_FALSE;
-	JS_SET_RVAL(cx,arglist,JSVAL_FALSE);
-
-	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
-		JS_ReportError(cx,getprivate_failure,WHERE);
-		return(JS_FALSE);
+	int        rc;
+	private_t* p;
+	JSObject * obj = JS_THIS_OBJECT(cx, arglist);
+
+	JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+
+	if ((p = (private_t*)JS_GetPrivate(cx, obj)) == NULL) {
+		JS_ReportError(cx, getprivate_failure, WHERE);
+		return JS_FALSE;
 	}
 
-	if(p->db!=NULL)  {
-        dbprintf(FALSE,p, "db already open");
-		// *rval = JSVAL_TRUE;
-        JS_SET_RVAL(cx,arglist,JSVAL_TRUE);
-		return(JS_TRUE);
-    }
-    else {
-        dbprintf(FALSE, p , "trying open");
-        rc = sqlite3_open(p->name,&p->db);
-    
-        if( rc ) {
-            sqlite3_close(p->db);
-            // *rval = JSVAL_FALSE;
-			JS_SET_RVAL(cx,arglist,JSVAL_FALSE);
-            p->errormsg = "can't open the database (path/permissions incorrect?)";
-            dbprintf(FALSE, p, "can't open: %s",p->name);
-            return (JS_TRUE);
-        }
-    }
-    dbprintf(FALSE,p , "opened!");
-    //*rval = JSVAL_TRUE;
-	JS_SET_RVAL(cx,arglist,JSVAL_TRUE);
-	return(JS_TRUE);
+	if (p->db != NULL)  {
+		dbprintf(FALSE, p, "db already open");
+		JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
+		return JS_TRUE;
+	}
+	else {
+		dbprintf(FALSE, p, "trying open");
+		rc = sqlite3_open(p->name, &p->db);
+
+		if (rc) {
+			sqlite3_close(p->db);
+			JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+			p->errormsg = "can't open the database (path/permissions incorrect?)";
+			dbprintf(FALSE, p, "can't open: %s", p->name);
+			return JS_TRUE;
+		}
+	}
+	dbprintf(FALSE, p, "opened!");
+	JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
+	return JS_TRUE;
 }
 
 
-//js_close(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 static JSBool
 js_close(JSContext *cx, uintN argc, jsval *arglist)
 {
-	private_t*	p;
-	// jsval		*rval;
-	JSObject *	obj = JS_THIS_OBJECT(cx, arglist);
+	private_t* p;
+	JSObject * obj = JS_THIS_OBJECT(cx, arglist);
+
+	if ((p = (private_t*)JS_GetPrivate(cx, obj)) == NULL) {
+		JS_ReportError(cx, getprivate_failure, WHERE);
+		return JS_FALSE;
+	}
 
-	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
-		JS_ReportError(cx,getprivate_failure,WHERE);
-		return(JS_FALSE);
+	if (p->db == NULL) {
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		return JS_TRUE;
 	}
+	sqlite3_close(p->db);
 
-	if(p->db==NULL) {
-        //*rval = JSVAL_FALSE;
-		JS_SET_RVAL(cx,arglist,JSVAL_FALSE);
-		return(JS_TRUE);
-    }
-    sqlite3_close(p->db);
-    
-	dbprintf(FALSE, p, "closed: %s" , p->name);
-    
-	p->db=NULL; 
-    //*rval = JSVAL_TRUE;
-	JS_SET_RVAL(cx,arglist,JSVAL_TRUE);
-	return(JS_TRUE);
+	dbprintf(FALSE, p, "closed: %s", p->name);
+
+	p->db = NULL;
+	JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
+	return JS_TRUE;
 }
-//js_exec(JSContext *cx, JSObject *parent, uintN argc, jsval *argv, jsval *rval)
 static JSBool
 js_exec(JSContext *cx, uintN argc, jsval *arglist)
-{ 
-    int rc,i;
-	private_t*	    p;
-    JSString*       str;
-    JSObject*       Record; // record object
-    JSObject*       Result; // array of records
-    sqlite3_stmt    *ppStmt;
-	jsval           val;
-    jsuint          idx;
-//    char*           column_name; // column name of Record
-	size_t			stmt_sz = 0;
-//	jsval			*rval;
-	jsval *			argv = JS_ARGV(cx, arglist);
-	JSObject *		parent = JS_THIS_OBJECT(cx, arglist);
-    
-	if((p=(private_t*)JS_GetPrivate(cx,parent))==NULL) {
-		JS_ReportError(cx,getprivate_failure,WHERE);
-		return(JS_FALSE);
+{
+	int           rc, i;
+	private_t*    p;
+	JSString*     str;
+	JSObject*     Record;   // record object
+	JSObject*     Result;   // array of records
+	sqlite3_stmt *ppStmt;
+	jsval         val;
+	jsuint        idx;
+	size_t        stmt_sz = 0;
+	jsval *       argv = JS_ARGV(cx, arglist);
+	JSObject *    parent = JS_THIS_OBJECT(cx, arglist);
+
+	if ((p = (private_t*)JS_GetPrivate(cx, parent)) == NULL) {
+		JS_ReportError(cx, getprivate_failure, WHERE);
+		return JS_FALSE;
 	}
-    // use the parameter as query
-    if (argc > 0) {
-        dbprintf (FALSE, p, "exec has stmt");
-        str = JS_ValueToString(cx, argv[0]);
-        if(str != NULL) {
-            // p->stmt = JS_GetStringBytes(str);
+	// use the parameter as query
+	if (argc > 0) {
+		dbprintf (FALSE, p, "exec has stmt");
+		str = JS_ValueToString(cx, argv[0]);
+		if (str != NULL) {
 			JSSTRING_TO_RASTRING(cx, str, p->stmt, &stmt_sz, NULL);
-            dbprintf (FALSE, p, "exec param: %s", p->stmt);
-        }
-    }
-	if(p->db==NULL) {
-        dbprintf(TRUE, p, "database is not opened");
-        // *rval = JSVAL_FALSE;
-		JS_SET_RVAL(cx,arglist,JSVAL_FALSE);
-		return(JS_TRUE);
-    }
-
-    dbprintf(FALSE, p, "create Result object");
-   	if((Result=JS_NewArrayObject(cx, 0, NULL))==NULL) 
-		return(JS_FALSE);
-
-    if (p->stmt == NULL) {
-        dbprintf(FALSE, p, "empy statement");
-        p->errormsg = "empty statement";
-        // *rval = JSVAL_FALSE;
-		JS_SET_RVAL(cx,arglist,JSVAL_FALSE);
-        return(JS_TRUE);
-    }
-        
-
-    dbprintf (FALSE,p, "prepare: %s",p->stmt);
-    rc = sqlite3_prepare(p->db, p->stmt, -1, &ppStmt, NULL);
-
-    if (rc == SQLITE_OK) {
-        while (sqlite3_step(ppStmt) == SQLITE_ROW) {
-            dbprintf(FALSE, p, "create record object");
-            if((Record=JS_NewObject(cx, NULL, NULL, NULL))==NULL) 
-                return(JS_FALSE);
-            
-            for (i=0; i<sqlite3_column_count(ppStmt); i++) {
-                
-                switch (sqlite3_column_type(ppStmt,i)) {
-                    case SQLITE_INTEGER:
-                        val = INT_TO_JSVAL(sqlite3_column_int(ppStmt,i)); 
-                        break;
-                    case SQLITE_TEXT:
-                        val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, (const char *)sqlite3_column_text(ppStmt,i)));
-                        break;
-                    case SQLITE_BLOB:
-                        break;
-                    }
-                
-                if(!JS_SetProperty(cx, Record, sqlite3_column_name(ppStmt,i), &val))
-                    return(JS_FALSE);
-            }
-            dbprintf (FALSE, p , "adding element to the Result");
-            val = OBJECT_TO_JSVAL(Record);
-            idx = -1 ;
-            
-   			if(!JS_GetArrayLength(cx, Result, &idx))
-				return(JS_FALSE);
-
-            if (!JS_SetElement(cx, Result, idx, &val))
-                return(JS_FALSE);
-        }
-        dbprintf(FALSE, p , "end prepare");
-        //*rval = OBJECT_TO_JSVAL(Result);
-		JS_SET_RVAL(cx,arglist,OBJECT_TO_JSVAL(Result));
-        return(JS_TRUE);
-    }
-    else {
-        p->errormsg = (char* ) sqlite3_errmsg(p->db);
-        //*rval = JSVAL_FALSE;
-		JS_SET_RVAL(cx,arglist,JSVAL_FALSE);
-        dbprintf(FALSE, p , "prepare error: %s", sqlite3_errmsg(p->db));
-        return(JS_TRUE);
-    }
+			dbprintf (FALSE, p, "exec param: %s", p->stmt);
+		}
+	}
+	if (p->db == NULL) {
+		dbprintf(TRUE, p, "database is not opened");
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		return JS_TRUE;
+	}
+
+	dbprintf(FALSE, p, "create Result object");
+	if ((Result = JS_NewArrayObject(cx, 0, NULL)) == NULL)
+		return JS_FALSE;
+
+	if (p->stmt == NULL) {
+		dbprintf(FALSE, p, "empy statement");
+		p->errormsg = "empty statement";
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		return JS_TRUE;
+	}
+
+
+	dbprintf (FALSE, p, "prepare: %s", p->stmt);
+	rc = sqlite3_prepare(p->db, p->stmt, -1, &ppStmt, NULL);
+
+	if (rc == SQLITE_OK) {
+		while (sqlite3_step(ppStmt) == SQLITE_ROW) {
+			dbprintf(FALSE, p, "create record object");
+			if ((Record = JS_NewObject(cx, NULL, NULL, NULL)) == NULL)
+				return JS_FALSE;
+
+			for (i = 0; i < sqlite3_column_count(ppStmt); i++) {
+
+				switch (sqlite3_column_type(ppStmt, i)) {
+					case SQLITE_INTEGER:
+						val = INT_TO_JSVAL(sqlite3_column_int(ppStmt, i));
+						break;
+					case SQLITE_TEXT:
+						val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, (const char *)sqlite3_column_text(ppStmt, i)));
+						break;
+					case SQLITE_BLOB:
+						break;
+				}
+
+				if (!JS_SetProperty(cx, Record, sqlite3_column_name(ppStmt, i), &val))
+					return JS_FALSE;
+			}
+			dbprintf (FALSE, p, "adding element to the Result");
+			val = OBJECT_TO_JSVAL(Record);
+			idx = -1;
+
+			if (!JS_GetArrayLength(cx, Result, &idx))
+				return JS_FALSE;
+
+			if (!JS_SetElement(cx, Result, idx, &val))
+				return JS_FALSE;
+		}
+		dbprintf(FALSE, p, "end prepare");
+		JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(Result));
+		return JS_TRUE;
+	}
+	else {
+		p->errormsg = (char* ) sqlite3_errmsg(p->db);
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		dbprintf(FALSE, p, "prepare error: %s", sqlite3_errmsg(p->db));
+		return JS_TRUE;
+	}
 }
 
 /* Sqlite Object Properites */
 enum {
-	 SQLITE_PROP_NAME		
-	,SQLITE_PROP_STMT
-    ,SQLITE_PROP_DEBUG
-    ,SQLITE_PROP_ERRORMSG
+	SQLITE_PROP_NAME
+	, SQLITE_PROP_STMT
+	, SQLITE_PROP_DEBUG
+	, SQLITE_PROP_ERRORMSG
 };
 
 
 static JSBool js_sqlite_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp)
 {
-    jsint       tiny;
-	private_t*	p;
-    int32       intval=0;
-    JSString*	js_str;
-    char*		strval=NULL;
-	size_t		js_str_sz = 0;
-	jsval		idval;
-
-	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
-		JS_ReportError(cx,getprivate_failure,WHERE);
-		return(JS_FALSE);
+	jsint      tiny;
+	private_t* p;
+	int32      intval = 0;
+	JSString*  js_str;
+	size_t     js_str_sz = 0;
+	jsval      idval;
+
+	if ((p = (private_t*)JS_GetPrivate(cx, obj)) == NULL) {
+		JS_ReportError(cx, getprivate_failure, WHERE);
+		return JS_FALSE;
 	}
- 
+
 	JS_IdToValue(cx, id, &idval);
-    tiny = JSVAL_TO_INT(idval);
+	tiny = JSVAL_TO_INT(idval);
 
-	if(JSVAL_IS_NUMBER(*vp))
+	if (JSVAL_IS_NUMBER(*vp))
 		JS_ValueToInt32(cx, *vp, &intval);
-    else if (JSVAL_IS_BOOLEAN(*vp))
-        JS_ValueToBoolean(cx,*vp,&intval);
-	else if(JSVAL_IS_STRING(*vp)) {
-		if((js_str = JS_ValueToString(cx, *vp))==NULL)
-			return(JS_FALSE);
-//		strval=JS_GetStringBytes(js_str);
-//		JSSTRING_TO_ASTRING(cx, js_str, strval, 128, NULL);
-		JSSTRING_TO_RASTRING(cx, js_str, strval, &js_str_sz, NULL);
-	}
+	else if (JSVAL_IS_BOOLEAN(*vp))
+		JS_ValueToBoolean(cx, *vp, &intval);
+
+	dbprintf(FALSE, p, "setting property %d", tiny);
 
-	dbprintf(FALSE, p, "setting property %d",tiny);
-    
-	switch(tiny) {
-        case SQLITE_PROP_NAME:
-            SAFECOPY(p->name, strval);
-            break;
-        case SQLITE_PROP_STMT:
-            p->stmt = strval;
-            break;
+	switch (tiny) {
+		case SQLITE_PROP_STMT:
+			if ((js_str = JS_ValueToString(cx, *vp)) == NULL)
+				return JS_FALSE;
+			JSSTRING_TO_RASTRING(cx, js_str, p->stmt, &js_str_sz, NULL);
+			break;
 		case SQLITE_PROP_DEBUG:
-            p->debug = intval;
+			p->debug = intval;
 			break;
 	}
 
-	return(JS_TRUE);
+	return JS_TRUE;
 }
 
 static JSBool js_sqlite_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 {
-	private_t*	p;
-    jsint       tiny;
-	JSString*	js_str=NULL;
-	jsval		idval;
-
-	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
-		JS_ReportError(cx,getprivate_failure,WHERE);
-		return(JS_FALSE);
+	private_t* p;
+	jsint      tiny;
+	JSString*  js_str = NULL;
+	jsval      idval;
+
+	if ((p = (private_t*)JS_GetPrivate(cx, obj)) == NULL) {
+		JS_ReportError(cx, getprivate_failure, WHERE);
+		return JS_FALSE;
 	}
 
 	JS_IdToValue(cx, id, &idval);
-    tiny = JSVAL_TO_INT(idval);
+	tiny = JSVAL_TO_INT(idval);
 
-	dbprintf(FALSE, p, "getting property %d",tiny);
+	dbprintf(FALSE, p, "getting property %d", tiny);
 
-	switch(tiny) {
+	switch (tiny) {
 		case SQLITE_PROP_NAME:
-			if((js_str=JS_NewStringCopyZ(cx, p->name))==NULL)
-				return(JS_FALSE);
+			if ((js_str = JS_NewStringCopyZ(cx, p->name)) == NULL)
+				return JS_FALSE;
 			*vp = STRING_TO_JSVAL(js_str);
 			break;
 		case SQLITE_PROP_STMT:
-			if((js_str=JS_NewStringCopyZ(cx, p->stmt))==NULL)
-				return(JS_FALSE);
+			if ((js_str = JS_NewStringCopyZ(cx, p->stmt)) == NULL)
+				return JS_FALSE;
 			*vp = STRING_TO_JSVAL(js_str);
 			break;
 		case SQLITE_PROP_DEBUG:
 			*vp = BOOLEAN_TO_JSVAL(p->debug);
 			break;
 		case SQLITE_PROP_ERRORMSG:
-			if((js_str=JS_NewStringCopyZ(cx, p->errormsg))==NULL)
-				return(JS_FALSE);
+			if ((js_str = JS_NewStringCopyZ(cx, p->errormsg)) == NULL)
+				return JS_FALSE;
 			*vp = STRING_TO_JSVAL(js_str);
 			break;
 	}
 
-	return(JS_TRUE);
+	return JS_TRUE;
 }
 
-#define SQLITE_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
+#define SQLITE_PROP_FLAGS JSPROP_ENUMERATE | JSPROP_READONLY
 
 static jsSyncPropertySpec js_sqlite_properties[] = {
 /*		 name				,tinyid					,flags,				ver	*/
-	{	"name"				,SQLITE_PROP_NAME			,JSPROP_ENUMERATE|JSPROP_READONLY,	310},
-    {	"stmt"				,SQLITE_PROP_STMT			,JSPROP_ENUMERATE,	310},
-	{	"debug"				,SQLITE_PROP_DEBUG	    	,JSPROP_ENUMERATE,	310},
-	{	"errormsg"			,SQLITE_PROP_ERRORMSG		,JSPROP_ENUMERATE|JSPROP_READONLY,	310},
+	{   "name", SQLITE_PROP_NAME, JSPROP_ENUMERATE | JSPROP_READONLY,  310},
+	{   "stmt", SQLITE_PROP_STMT, JSPROP_ENUMERATE,  310},
+	{   "debug", SQLITE_PROP_DEBUG, JSPROP_ENUMERATE,  310},
+	{   "errormsg", SQLITE_PROP_ERRORMSG, JSPROP_ENUMERATE | JSPROP_READONLY,  310},
 	{0}
 };
 
 #ifdef BUILD_JSDOCS
-static char* sqlite_prop_desc[] = {
-	 "filename specified in constructor - <small>READ ONLY</small>"
-    ,"string sql statement"
-	,"set to <i>true</i> to enable debug log output"
-	,"get the last error message - <small>READ ONLY</small>"
-	,NULL
+static char*            sqlite_prop_desc[] = {
+	"filename specified in constructor - <small>READ ONLY</small>"
+	, "string sql statement"
+	, "set to <i>true</i> to enable debug log output"
+	, "get the last error message - <small>READ ONLY</small>"
+	, NULL
 };
 #endif
 
 
 static jsSyncMethodSpec js_sqlite_functions[] = {
-	{"open",			js_open,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("Open the database")
-	,JSDOCSTR("open the sqlite3 database")
-	,310},		
-	{"close",			js_close,			0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("close database")
-	,310},		
-	{"exec",			js_exec,			0,	JSTYPE_BOOLEAN, JSDOCSTR("")
-	,JSDOCSTR("exec the sql query on database")
-	,310},
+	{"open",            js_open,            1,  JSTYPE_BOOLEAN, JSDOCSTR("Open the database")
+	 , JSDOCSTR("open the sqlite3 database")
+	 , 310},
+	{"close",           js_close,           0,  JSTYPE_VOID,    JSDOCSTR("")
+	 , JSDOCSTR("close database")
+	 , 310},
+	{"exec",            js_exec,            0,  JSTYPE_BOOLEAN, JSDOCSTR("")
+	 , JSDOCSTR("exec the sql query on database")
+	 , 310},
 	{0}
 };
 
@@ -385,14 +340,13 @@ static jsSyncMethodSpec js_sqlite_functions[] = {
 static void js_finalize_sqlite(JSContext *cx, JSObject *obj)
 {
 	private_t* p;
-	
-	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
+
+	if ((p = (private_t*)JS_GetPrivate(cx, obj)) == NULL)
 		return;
 
-	if(p->external==JS_FALSE && p->db!=NULL)
+	if (p->db != NULL)
 		sqlite3_close(p->db);
-    //sqlite3_free(p->errormsg);
-    
+
 	dbprintf(FALSE, p, "finalize Sqlite object");
 
 	free(p->stmt);
@@ -402,84 +356,82 @@ static void js_finalize_sqlite(JSContext *cx, JSObject *obj)
 }
 
 static JSClass js_sqlite_class = {
-     "Sqlite"				/* name			*/
-    ,JSCLASS_HAS_PRIVATE	/* flags		*/
-	,JS_PropertyStub		/* addProperty	*/
-	,JS_PropertyStub		/* delProperty	*/
-	,js_sqlite_get			/* getProperty	*/
-	,js_sqlite_set			/* setProperty	*/
-	,JS_EnumerateStub		/* enumerate	*/
-	,JS_ResolveStub			/* resolve		*/
-	,JS_ConvertStub			/* convert		*/
-	,js_finalize_sqlite		/* finalize		*/
+	"Sqlite"                /* name			*/
+	, JSCLASS_HAS_PRIVATE    /* flags		*/
+	, JS_PropertyStub        /* addProperty	*/
+	, JS_PropertyStub        /* delProperty	*/
+	, js_sqlite_get          /* getProperty	*/
+	, js_sqlite_set          /* setProperty	*/
+	, JS_EnumerateStub       /* enumerate	*/
+	, JS_ResolveStub         /* resolve		*/
+	, JS_ConvertStub         /* convert		*/
+	, js_finalize_sqlite     /* finalize		*/
 };
 
 /* Sqlite Constructor (creates database object) */
 
-//js_sqlite_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv)
 static JSBool
 js_sqlite_constructor(JSContext* cx, uintN argc, jsval *arglist)
 {
-	JSString*	str;
-	private_t*	p;
-	jsval *		argv = JS_ARGV(cx, arglist);
+	JSString*  str;
+	private_t* p;
+	jsval *    argv = JS_ARGV(cx, arglist);
 	JSObject*  obj;
-	
+
 
 	obj = JS_NewObject(cx, &js_sqlite_class, NULL, NULL);
 	JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(obj));
 
-	if((str = JS_ValueToString(cx, argv[0]))==NULL) {
-		JS_ReportError(cx,"No filename specified");
-		return(JS_FALSE);
+	if ((str = JS_ValueToString(cx, argv[0])) == NULL) {
+		JS_ReportError(cx, "No filename specified");
+		return JS_FALSE;
 	}
 
-	if((p=(private_t*)calloc(1,sizeof(private_t)))==NULL) {
-		JS_ReportError(cx,"calloc failed");
-		return(JS_FALSE);
+	if ((p = (private_t*)calloc(1, sizeof(private_t))) == NULL) {
+		JS_ReportError(cx, "calloc failed");
+		return JS_FALSE;
 	}
 
 	p->errormsg = "";
 
-//	SAFECOPY(p->name,JS_GetStringBytes(str));
 	JSSTRING_TO_STRBUF(cx, str, p->name, sizeof(p->name), NULL);
 
-	if(!JS_SetPrivate(cx, obj, p)) {
+	if (!JS_SetPrivate(cx, obj, p)) {
 		dbprintf(TRUE, p, "JS_SetPrivate failed\n");
-		return(JS_FALSE);
+		return JS_FALSE;
 	}
 
-	if(!js_DefineSyncProperties(cx, obj, js_sqlite_properties)) {
+	if (!js_DefineSyncProperties(cx, obj, js_sqlite_properties)) {
 		dbprintf(TRUE, p, "js_DefineSyncProperties failed\n");
-		return(JS_FALSE);
+		return JS_FALSE;
 	}
 
-	if(!js_DefineSyncMethods(cx, obj, js_sqlite_functions /*, FALSE - only needs 3 parameters */)) {
+	if (!js_DefineSyncMethods(cx, obj, js_sqlite_functions /*, FALSE - only needs 3 parameters */)) {
 		dbprintf(TRUE, p, "js_DefineSyncMethods failed\n");
-		return(JS_FALSE);
+		return JS_FALSE;
 	}
 
 #ifdef BUILD_JSDOCS
-	js_DescribeSyncObject(cx,obj,"Can used to manipulate sqlite database"
-			,310
-			);
-	js_DescribeSyncConstructor(cx,obj,"To create a new Sqlite object: <tt>var f = new Sqlite(<i>filename</i>)</tt>");
+	js_DescribeSyncObject(cx, obj, "Can used to manipulate sqlite database"
+	                      , 310
+	                      );
+	js_DescribeSyncConstructor(cx, obj, "To create a new Sqlite object: <tt>var f = new Sqlite(<i>filename</i>)</tt>");
 	js_CreateArrayOfStrings(cx, obj, "_property_desc_list", sqlite_prop_desc, JSPROP_READONLY);
 #endif
 
 	dbprintf(FALSE, p, "object constructed\n");
-	return(JS_TRUE);
+	return JS_TRUE;
 }
 
 JSObject* js_CreateSqliteClass(JSContext* cx, JSObject* parent)
 {
 	return JS_InitClass(cx, parent, NULL
-		,&js_sqlite_class
-		,js_sqlite_constructor
-		,1		/* number of constructor args */
-		,NULL	/* props, set in constructor */
-		,NULL	/* funcs, set in constructor */
-		,NULL,NULL);
+	                    , &js_sqlite_class
+	                    , js_sqlite_constructor
+	                    , 1 /* number of constructor args */
+	                    , NULL /* props, set in constructor */
+	                    , NULL /* funcs, set in constructor */
+	                    , NULL, NULL);
 }
 
-#endif	/* JAVASCRIPT */
+#endif  /* JAVASCRIPT */