def Build(self, json_text): """Builds a Bigquery JsonObject message from JSON text. Args: json_text: the JSON text, expected to represent an object Returns: The message in the Bigquery API messages module representing that object. Raises: bigquery.ClientError if the JSON text is not the valid representation of a JSON object """ try: json_proto = extra_types.JsonProtoDecoder(json_text) util.Typecheck(json_proto, extra_types.JsonObject, 'JSON value is not an object.') except ValueError as e: raise bigquery.ClientError(str(e)) except exceptions.TypecheckError as e: raise bigquery.ClientError(str(e)) except exceptions.InvalidDataError as e: raise bigquery.ClientError(str(e)) # Convert the top-level extra_types.JsonObject into a # self._bigquery_messages.JsonObject. This is a shallow conversion: Both # JsonObject classes represent their property values as # extra_types.JsonValue objects. bigquery_properties = [ self._bigquery_messages.JsonObject.AdditionalProperty( key=proto_property.key, value=proto_property.value) for proto_property in json_proto.properties ] return self._bigquery_messages.JsonObject( additionalProperties=bigquery_properties)
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace, All the arguments that were provided to this command invocation. Returns: None """ try: if args.file: with open(args.file, 'r') as json_file: return self._DoAddRows(json_file, args) else: return self._DoAddRows(sys.stdin, args) except IOError as e: raise bigquery.ClientError(e)
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace, All the arguments that were provided to this command invocation. Raises: bigquery.Error: if no job id was provided and no jobs were running. bigquery.TimeoutError: on time out. Returns: A Job message for the job we were waiting for. """ apitools_client = self.context[commands.APITOOLS_CLIENT_KEY] bigquery_messages = self.context[commands.BIGQUERY_MESSAGES_MODULE_KEY] resource_parser = self.context[commands.BIGQUERY_REGISTRY_KEY] project_id = properties.VALUES.core.project.Get(required=True) try: max_wait = int(args.max_wait) if args.max_wait else sys.maxint except ValueError: raise bigquery.ClientError('Invalid wait time: {0}'.format( args.max_wait)) if args.job_id: job_resource = resource_parser.Parse(args.job_id, collection='bigquery.jobs') job_reference = message_conversions.JobResourceToReference( bigquery_messages, job_resource) else: project = bigquery.Project(project_id) running_jobs = [ job for job in project.GetCurrentJobsGenerator() if job.state in ('PENDING', 'RUNNING') ] if len(running_jobs) != 1: raise bigquery.Error( 'No job ID provided, found {0} running jobs'.format( len(running_jobs))) job_reference = running_jobs[0].jobReference start_time = bigquery.CurrentTimeInSec() job = None progress_reporter = job_progress.ProgressReporter( job_progress.STATUS_REPORTING_CHANGES if args. changed_status_only else job_progress.STATUS_REPORTING_PERIODIC) # Create an iterator for polling intervals that yields 1,1,1,1,1,1,1,1, # 2,5,8,11,14,17,20,23,26,29, 30,30,30,... polling_intervals = itertools.chain(itertools.repeat(1, 8), xrange(2, 30, 3), itertools.repeat(30)) total_wait_so_far = 0 current_status = 'UNKNOWN' while total_wait_so_far < max_wait: try: request = bigquery_messages.BigqueryJobsGetRequest( projectId=job_reference.projectId, jobId=job_reference.jobId) job = apitools_client.jobs.Get(request) current_status = job.status.state if current_status == 'DONE': progress_reporter.Print(job_reference.jobId, total_wait_so_far, current_status) break except apitools_base.HttpError as server_error: try: raise bigquery.Error.ForHttpError(server_error) except bigquery.CommunicationError as e: # Communication errors while waiting on a job are okay. log.status.Print( 'Transient error during job status check: {0}'.format( e)) except bigquery.BackendError as e: # Temporary server errors while waiting on a job are okay. log.status.Print( 'Transient error during job status check: {0}'.format( e)) # Every second of this polling interval, update the display of the time # waited so far: seconds_in_interval = polling_intervals.next() total_wait_so_far = bigquery.CurrentTimeInSec() - start_time for _ in xrange(seconds_in_interval): progress_reporter.Print(job_reference.jobId, total_wait_so_far, current_status) bigquery.Wait(1) total_wait_so_far = bigquery.CurrentTimeInSec() - start_time else: raise bigquery.TimeoutError( ('Wait timed out. Operation not finished, in state {0}'.format( current_status)), None, []) progress_reporter.Done() return job