func getPrepared(a httpRequestArgs) (*plan.Prepared, errors.Error) { prepared_field, err := a.getValue(PREPARED) if err != nil || prepared_field == nil { return nil, err } // Monitoring API: track prepared statement access return plan.TrackPrepared(prepared_field) }
func (this *Server) getPrepared(request Request, namespace string) (*plan.Prepared, errors.Error) { prepared := request.Prepared() if prepared == nil { parse := time.Now() stmt, err := n1ql.ParseStatement(request.Statement()) if err != nil { return nil, errors.NewParseSyntaxError(err, "") } prep := time.Now() prepared, err = planner.BuildPrepared(stmt, this.datastore, this.systemstore, namespace, false) if err != nil { return nil, errors.NewPlanError(err, "") } // In order to allow monitoring to track prepared statement executed through // N1QL "EXECUTE", set request.prepared - because, as of yet, it isn't! // // HACK ALERT - request does not currently track the request type // and even if it did, and prepared.(*plan.Prepared) is set, it // does not carry a name or text. // This should probably done in build.go and / or build_execute.go, // but for now this will do. exec, ok := stmt.(*algebra.Execute) if ok && exec.Prepared() != nil { prep, _ := plan.TrackPrepared(exec.Prepared()) request.SetPrepared(prep) } if logging.LogLevel() >= logging.TRACE { request.Output().AddPhaseTime("plan", time.Since(prep)) request.Output().AddPhaseTime("parse", prep.Sub(parse)) } } if logging.LogLevel() >= logging.DEBUG { // log EXPLAIN for the request logExplain(prepared) } return prepared, nil }