package com.sun.btrace.samples;
import static com.sun.btrace.BTraceUtils.*;
import java.sql.Statement;
import java.util.Map;
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.aggregation.*;
import com.sun.btrace.annotations.*;
/**
 * Skrypt BTrace sucy do wywietlania czasw dla wszystkich wykonanych instrukcji JDBC dla danego zdarzenia. Zastosuj parametr --full, aby wywietli histogram.
 */
@BTrace
public class JdbcAnyQuery {
    private static Map<Statement, String> preparedStatementDescriptions
        = newWeakMap();
    private static Aggregation histogram =
        newAggregation(AggregationFunction.QUANTIZE);
    private static Aggregation average =
        newAggregation(AggregationFunction.AVERAGE);
    private static Aggregation max =
        newAggregation(AggregationFunction.MAXIMUM);
    private static Aggregation min =
        newAggregation(AggregationFunction.MINIMUM);
    private static Aggregation count =
        newAggregation(AggregationFunction.COUNT);
    private static boolean full = $(2) != null &&
        strcmp("--full", $(2)) == 0;
    @TLS
    private static long timeStampNanos;
    @OnMethod(clazz = "+java.sql.Statement", method = "/execute.*/")
    public static void onExecute(AnyType[] args) {
        timeStampNanos = timeNanos();
    }
    @OnMethod(clazz = "+java.sql.Statement", method = "/execute.*/", location = 
    (@Location(Kind.RETURN))
    public static void onExecuteReturn() {
      AggregationKey key = newAggregationKey("Generic Query");
        int duration = (int) (timeNanos() - timeStampNanos) / 1000;
        addToAggregation(count, key, duration);
        addToAggregation(average, key, duration);
        addToAggregation(histogram, key, duration);
        addToAggregation(max, key, duration);
        addToAggregation(min, key, duration);
    }
    @OnEvent(value="reset")
    public static void onReset() {
       println ("Data reset");
       clearAggregation(count);
       clearAggregation(min);
       clearAggregation(max);
       clearAggregation(average);
       clearAggregation(histogram);
    }
    @OnEvent()
    public static void onEvent() {
        println("Results. All times are in microseconds");
        println("---------------------------------------------");
        printAggregation("Count", count);
        printAggregation("Min", min);
        printAggregation("Max", max);
        printAggregation("Average", average);
        if (full) {
            printAggregation("Histogram", histogram);
        }
        println("---------------------------------------------");
      }
    }

