int Web_LogFilter()

in src/generic/log.c [769:963]


int Web_LogFilter(ClientData clientData,
		  Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[])
{

    LogData *logData;
    int idx;

    static TCLCONST char *subCommands[] = {
	WEB_LOG_SUBCMD_ADD,
	WEB_LOG_SUBCMD_DELETE,
	WEB_LOG_SUBCMD_NAMES,
	WEB_LOG_SUBCMD_LEVELS,
	NULL
    };
    enum subCommands
    { ADD, DELETE, NAMES, LEVELS };

    /* --------------------------------------------------------------------------
     * check for internal data
     * ----------------------------------------------------------------------- */
    WebAssertData(interp, clientData, "Web_LogFilter", TCL_ERROR)
	logData = (LogData *) clientData;

    /* --------------------------------------------------------------------------
     * enough arguments ?
     * ----------------------------------------------------------------------- */
    if (objc < 2) {
	Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?");
	return TCL_ERROR;
    }

    /* ------------------------------------------------------------------------
     * check subcommand
     * --------------------------------------------------------------------- */
    if (Tcl_GetIndexFromObj(interp, objv[1], subCommands, "option", 0, &idx)
	!= TCL_OK) {
	return TCL_ERROR;
    }

    switch ((enum subCommands) idx) {
    case ADD:{

	    /* ------------------------------------------------------------------------
	     * web::loglevel add sytnax is as follows:
	     * web::loglevel add level
	     * 0              1   2
	     * --------------------------------------------------------------------- */
	    LogLevel *logLevel = NULL;
	    char *name = NULL;

	    /* ------------------------------------------------------------------------
	     * enough arguments ?
	     * --------------------------------------------------------------------- */
	    if (objc != 3) {
	        Tcl_WrongNumArgs(interp, 2, objv, "level");
		return TCL_ERROR;
	    }

	    /* ------------------------------------------------------------------------
	     * parse level
	     * --------------------------------------------------------------------- */
	    logLevel =
		parseLogLevel(interp, Tcl_GetString(objv[2]), "user", -1);
	    if (logLevel == NULL) {
		WebFreeIfNotNull(name);
		return TCL_ERROR;
	    }
	    logLevel->keep = logData->keep;

	    /* ------------------------------------------------------------------------
	     * and add to list
	     * --------------------------------------------------------------------- */
	    name = insertIntoFilterList(logData, logLevel);
	    if (name == NULL) {
		Tcl_SetResult(interp, "cannot append new log filter to list", NULL);
		destroyLogLevel(logLevel, NULL);
		return TCL_ERROR;
	    }
	    Tcl_SetResult(interp, name, Tcl_Free);
	    return TCL_OK;
	    break;
	}
    case NAMES:{

	    Tcl_ResetResult(interp);

	    if (logData->listOfFilters != NULL) {
	      int i;
	      LogLevel **logLevels = logData->listOfFilters;
	      for (i = 0; i < logData->filterSize; i++) {
		if (logLevels[i] != NULL) {
		  char * name = createLogName(LOG_FILTER_PREFIX, i);
		  if (name != NULL) {
		    Tcl_AppendElement(interp, name);
		    Tcl_Free(name);
		  }
		}
	      }
	    }
	    return TCL_OK;
	    break;
	}

    case LEVELS:{

	    LogLevel *logLevel = NULL;
	    int namesIsFirst = TCL_OK;

	    Tcl_SetResult(interp, "", NULL);

	    if (logData->listOfFilters != NULL) {
	      int i;
	      LogLevel ** logLevels = logData->listOfFilters;
	      for (i = 0; i < logData->filterSize; i++) {
		if (logLevels[i] != NULL) {
		  char * name = createLogName(LOG_FILTER_PREFIX, i);
		    if (namesIsFirst == TCL_ERROR)
			Tcl_AppendResult(interp, "\n", NULL);
		    else
			namesIsFirst = TCL_ERROR;
		    logLevel = logLevels[i];
		    Tcl_AppendResult(interp,
				     name, " ",
				     logLevel->facility, ".",
				     getSeverityName(logLevel->minSeverity),
				     "-",
				     getSeverityName(logLevel->maxSeverity),
				     NULL);
		    Tcl_Free(name);
		}
	      }
	    }
	    return TCL_OK;
	    break;
	}
    case DELETE:{

	    /*      0              1      2 */
	    /*      web::loglevel delete logLevel1 */

	    switch (objc) {
	    case 3: {
	      LogLevel ** logLevels = logData->listOfFilters;
	      if (!strcmp("-requests", Tcl_GetString(objv[2]))) {
		/* special case: delete all levels NOT created during web::initializer */
		int i;
		for (i = 0; i < logData->filterSize; i++) {
		  if (logLevels[i] != NULL && !logLevels[i]->keep) {
		    destroyLogLevel(logLevels[i], interp);
		    logLevels[i] = NULL;
		  }
		}
		return TCL_OK;
	      } else {
		int inx = getIndexFromLogName(LOG_FILTER_PREFIX"%d", Tcl_GetString(objv[2]));
		if (inx < 0 
		    || inx >= logData->filterSize
		    || logLevels[inx] == NULL) {
		  Tcl_SetResult(interp, "no such log filter \"", NULL);
		  Tcl_AppendResult(interp, Tcl_GetString(objv[2]), "\"",
				   NULL);
		  return TCL_ERROR;
		}
		destroyLogLevel(logLevels[inx], interp);
		logLevels[inx] = NULL;
		return TCL_OK;
		break;
	      }
	    }
	    case 2:
		/* -----------------------------------------------------
		 * no argument --> resets the list
		 * ----------------------------------------------------- */
		if (logData->listOfFilters != NULL) {
		  int i;
		  LogLevel ** logLevels = logData->listOfFilters;
		  for (i = 0; i < logData->filterSize; i++) {
		    if (logLevels[i] != NULL) {
		      destroyLogLevel(logLevels[i], interp);
		      logLevels[i] = NULL;
		    }
		  }
		}
		return TCL_OK;
		break;
	    default:
		Tcl_WrongNumArgs(interp, 1, objv, "delete ?filtername?");
		return TCL_ERROR;
	    }
	    break;
        }
    default:
	return TCL_OK;
    }
}