// Copyright 2015 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package bigquery // TODO(mcgreevy): support dry-run mode when creating jobs. import ( "fmt" "google.golang.org/api/option" "google.golang.org/api/transport" "golang.org/x/net/context" bq "google.golang.org/api/bigquery/v2" ) const prodAddr = "https://www.googleapis.com/bigquery/v2/" // ExternalData is a table which is stored outside of BigQuery. It is implemented by GCSReference. type ExternalData interface { externalDataConfig() bq.ExternalDataConfiguration } const Scope = "https://www.googleapis.com/auth/bigquery" const userAgent = "gcloud-golang-bigquery/20160429" // Client may be used to perform BigQuery operations. type Client struct { service service projectID string } // NewClient constructs a new Client which can perform BigQuery operations. // Operations performed via the client are billed to the specified GCP project. func NewClient(ctx context.Context, projectID string, opts ...option.ClientOption) (*Client, error) { o := []option.ClientOption{ option.WithEndpoint(prodAddr), option.WithScopes(Scope), option.WithUserAgent(userAgent), } o = append(o, opts...) httpClient, endpoint, err := transport.NewHTTPClient(ctx, o...) if err != nil { return nil, fmt.Errorf("dialing: %v", err) } s, err := newBigqueryService(httpClient, endpoint) if err != nil { return nil, fmt.Errorf("constructing bigquery client: %v", err) } c := &Client{ service: s, projectID: projectID, } return c, nil } // Close closes any resources held by the client. // Close should be called when the client is no longer needed. // It need not be called at program exit. func (c *Client) Close() error { return nil } func (c *Client) insertJob(ctx context.Context, conf *insertJobConf) (*Job, error) { job, err := c.service.insertJob(ctx, c.projectID, conf) if err != nil { return nil, err } job.c = c return job, nil }