func (s server) execute(args driver.Request) (driver.Response, int, error) { // Pick up current session state. planMaker := planner{user: args.GetUser()} if err := gogoproto.Unmarshal(args.Session, &planMaker.session); err != nil { return args.CreateReply(), http.StatusBadRequest, err } // Open a pending transaction if needed. if planMaker.session.Txn != nil { txn := client.NewTxn(s.db) txn.Proto = *planMaker.session.Txn if planMaker.session.MutatesSystemDB { txn.SetSystemDBTrigger() } planMaker.txn = txn } // Send the Request for SQL execution and set the application-level error // for each result in the reply. reply := s.execStmts(args.Sql, args.GetParameters(), &planMaker) // Send back the session state even if there were application-level errors. // Add transaction to session state. if planMaker.txn != nil { planMaker.session.Txn = &planMaker.txn.Proto planMaker.session.MutatesSystemDB = planMaker.txn.SystemDBTrigger() } else { planMaker.session.Txn = nil planMaker.session.MutatesSystemDB = false } bytes, err := gogoproto.Marshal(&planMaker.session) if err != nil { return args.CreateReply(), http.StatusInternalServerError, err } reply.Session = bytes return reply, 0, nil }