diff --git a/bigquery/api/src/undelete_table.php b/bigquery/api/src/undelete_table.php new file mode 100644 index 0000000000..1fd1f18e8d --- /dev/null +++ b/bigquery/api/src/undelete_table.php @@ -0,0 +1,77 @@ + $projectId]); + $dataset = $bigQuery->dataset($datasetId); + + // Choose an appropriate snapshot point as epoch milliseconds. + // For this example, we choose the current time as we're about to delete the + // table immediately afterwards + $snapshotEpoch = date_create()->format('Uv'); + + // Delete the table. + $dataset->table($tableId)->delete(); + + // Construct the restore-from table ID using a snapshot decorator. + $snapshotId = "{$tableId}@{$snapshotEpoch}"; + + // Restore the deleted table + $restoredTable = $dataset->table($restoredTableId); + $copyConfig = $dataset->table($snapshotId)->copy($restoredTable); + $job = $bigQuery->runJob($copyConfig); + + // check if the job is complete + $job->reload(); + if (!$job->isComplete()) { + throw new \Exception('Job has not yet completed', 500); + } + // check if the job has errors + if (isset($job->info()['status']['errorResult'])) { + $error = $job->info()['status']['errorResult']['message']; + printf('Error running job: %s' . PHP_EOL, $error); + } else { + print('Snapshot restored successfully' . PHP_EOL); + } +} +# [END bigquery_undelete_table] +require_once __DIR__ . '/../../../testing/sample_helpers.php'; +\Google\Cloud\Samples\execute_sample(__FILE__, __NAMESPACE__, $argv); diff --git a/bigquery/api/test/bigqueryTest.php b/bigquery/api/test/bigqueryTest.php index d96258bc43..2b128b7dca 100644 --- a/bigquery/api/test/bigqueryTest.php +++ b/bigquery/api/test/bigqueryTest.php @@ -99,8 +99,8 @@ public function testCreateAndDeleteTable() { $tempTableId = sprintf('test_table_%s', time()); $fields = json_encode([ - ['name' => 'name', 'type' => 'string', 'mode' => 'nullable'], - ['name' => 'title', 'type' => 'string', 'mode' => 'nullable'] + ['name' => 'name', 'type' => 'string', 'mode' => 'nullable'], + ['name' => 'title', 'type' => 'string', 'mode' => 'nullable'] ]); $output = $this->runFunctionSnippet('create_table', [ self::$datasetId, @@ -352,8 +352,8 @@ public function testAddColumnLoadAppend() { $tableId = $this->createTempTable(); $output = $this->runFunctionSnippet('add_column_load_append', [ - self::$datasetId, - $tableId + self::$datasetId, + $tableId ]); $this->assertStringContainsString('name', $output); @@ -365,14 +365,32 @@ public function testAddColumnQueryAppend() { $tableId = $this->createTempTable(); $output = $this->runFunctionSnippet('add_column_query_append', [ - self::$datasetId, - $tableId + self::$datasetId, + $tableId ]); $this->assertStringContainsString('name', $output); $this->assertStringContainsString('title', $output); $this->assertStringContainsString('description', $output); } + public function testUndeleteTable() + { + // Create a base table + $sourceTableId = $this->createTempTable(); + + // run the sample + $restoredTableId = uniqid('restored_'); + $output = $this->runFunctionSnippet('undelete_table', [ + self::$datasetId, + $sourceTableId, + $restoredTableId, + ]); + + $restoredTable = self::$dataset->table($restoredTableId); + $this->assertStringContainsString('Snapshot restored successfully', $output); + $this->verifyTable($restoredTable, 'Brent Shaffer', 3); + } + private function runFunctionSnippet($sampleName, $params = []) { array_unshift($params, self::$projectId); @@ -386,8 +404,8 @@ private function createTempEmptyTable() { $tempTableId = sprintf('test_table_%s_%s', time(), rand()); $fields = json_encode([ - ['name' => 'name', 'type' => 'string', 'mode' => 'nullable'], - ['name' => 'title', 'type' => 'string', 'mode' => 'nullable'] + ['name' => 'name', 'type' => 'string', 'mode' => 'nullable'], + ['name' => 'title', 'type' => 'string', 'mode' => 'nullable'] ]); $this->runFunctionSnippet('create_table', [ self::$datasetId,