func startup(cn *pool.Conn, user, password, database string) error { writeStartupMsg(cn.Wr, user, database) if err := cn.Wr.Flush(); err != nil { return err } for { c, msgLen, err := readMessageType(cn) if err != nil { return err } switch c { case backendKeyDataMsg: processId, err := readInt32(cn) if err != nil { return err } secretKey, err := readInt32(cn) if err != nil { return err } cn.ProcessId = processId cn.SecretKey = secretKey case parameterStatusMsg: if err := logParameterStatus(cn, msgLen); err != nil { return err } case authenticationOKMsg: if err := authenticate(cn, user, password); err != nil { return err } case readyForQueryMsg: _, err := cn.ReadN(msgLen) if err != nil { return err } return nil case errorResponseMsg: e, err := readError(cn) if err != nil { return err } return e default: return fmt.Errorf("pg: unknown startup message response: %q", c) } } }