diff --git a/dev/BulkLoader.php b/dev/BulkLoader.php index 6b581ac23..18a7e954a 100644 --- a/dev/BulkLoader.php +++ b/dev/BulkLoader.php @@ -124,15 +124,24 @@ abstract class BulkLoader extends ViewableData { } /* - * Load the given file via {@link self::processAll()} and {@link self::processRecord()}. + * Load the given file via {@link self::processAll()} and {@link self::processRecord()}. Optionally truncates (clear) the table before it imports. * * @return BulkLoader_Result See {@link self::processAll()} */ - public function load($filepath, $memory_limit='512M') { + public function load($filepath, $memory_limit='512M', $clear_table_before_import=false) { ini_set('max_execution_time', 3600); increase_memory_limit_to($memory_limit); + if ($clear_table_before_import) { + $objectSet = DataObject::get($this->objectClass); //get all instances of the to be imported data object + if (!empty($objectSet)) { + foreach($objectSet as $obj) { + $obj->delete(); //deleting objects ensures that versions are also deleted (truncating would just delete the main table); performance is slower, however + } + } + } + return $this->processAll($filepath); } diff --git a/tests/dev/CsvBulkLoaderTest.php b/tests/dev/CsvBulkLoaderTest.php index d5c70350d..af0d506f7 100644 --- a/tests/dev/CsvBulkLoaderTest.php +++ b/tests/dev/CsvBulkLoaderTest.php @@ -31,6 +31,21 @@ class CsvBulkLoaderTest extends SapphireTest { fclose($file); } + + /** + * Test plain import with clear_table_before_import + */ + function testClearTableBeforeImport() { + $loader = new CsvBulkLoader('CsvBulkLoaderTest_Player'); + $filepath = Director::baseFolder() . '/sapphire/tests/dev/CsvBulkLoaderTest_PlayersWithHeader.csv'; + $results1 = $loader->load($filepath, '512MB', false); //leave existing data there on first CSV import + $this->assertEquals(4, $results1->Count(), 'Test correct count of imported data on first load'); + + $results2 = $loader->load($filepath, '512MB', true); //delete existing data before doing second CSV import + $resultDataObject = DataObject::get('CsvBulkLoaderTest_Player'); //get all instances of the loaded DataObject from the database and count them + + $this->assertEquals(4, $resultDataObject->Count(), 'Test if existing data is deleted before new data is added'); + } /** * Test import with manual column mapping