Merge pull request #18 from 30x/ISSUE-65161406

[ISSUE-65161406] Use transactions. Remove temp files for failed bundle-downloading
diff --git a/bundle.go b/bundle.go
index 468760c..b4729cf 100644
--- a/bundle.go
+++ b/bundle.go
@@ -172,10 +172,19 @@
 		}
 	}
 
+	cleanTempFile := func(file string) {
+		if os.Remove(file) != nil {
+			log.Warnf("Unable to remove temp file %s", file)
+		}
+	}
+
 	downloadedFile, err := downloadFromURI(r.client, r.blobServerURL, r.blobId)
 
 	if err != nil {
 		log.Errorf("Unable to download blob file blobId=%s err:%v", r.blobId, err)
+		if downloadedFile != "" {
+			go cleanTempFile(downloadedFile)
+		}
 		return err
 	}
 
@@ -184,10 +193,13 @@
 	err = r.bm.dbMan.updateLocalFsLocation(r.blobId, downloadedFile)
 	if err != nil {
 		log.Errorf("updateLocalFsLocation failed: blobId=%s", r.blobId)
+		if downloadedFile != "" {
+			go cleanTempFile(downloadedFile)
+		}
 		return err
 	}
 
-	log.Debugf("bundle downloaded: blobId=%s", r.blobId)
+	log.Debugf("bundle downloaded: blobId=%s filename=%s", r.blobId, downloadedFile)
 
 	// TODO send changed deployments to subscribers (API call with "block")
 	//r.bm.apiMan.addChangedDeployment(dep.ID)
diff --git a/data.go b/data.go
index 607c0ab..f3e59ef 100644
--- a/data.go
+++ b/data.go
@@ -77,7 +77,12 @@
 }
 
 func (dbc *dbManager) initDb() error {
-	_, err := dbc.getDb().Exec(`
+	tx, err := dbc.getDb().Begin()
+	if err != nil {
+		return err
+	}
+	defer tx.Rollback()
+	_, err = tx.Exec(`
 	CREATE TABLE IF NOT EXISTS apid_blob_available (
 		id text primary key,
    		local_fs_location text NOT NULL
@@ -86,7 +91,10 @@
 	if err != nil {
 		return err
 	}
-
+	err = tx.Commit()
+	if err != nil {
+		return err
+	}
 	log.Debug("Database table apid_blob_available created.")
 	return nil
 }
@@ -190,19 +198,21 @@
 }
 
 func (dbc *dbManager) updateLocalFsLocation(blobId, localFsLocation string) error {
-
-	stmt, err := dbc.getDb().Prepare(`
+	txn, err := dbc.getDb().Begin()
+	if err != nil {
+		return err
+	}
+	defer txn.Rollback()
+	_, err = txn.Exec(`
 		INSERT OR IGNORE INTO apid_blob_available (
 		id,
 		local_fs_location
-		) VALUES (?, ?);`)
+		) VALUES (?, ?);`, blobId, localFsLocation)
 	if err != nil {
-		log.Errorf("PREPARE updateLocalFsLocation failed: %v", err)
+		log.Errorf("INSERT apid_blob_available id {%s} local_fs_location {%s} failed", localFsLocation, err)
 		return err
 	}
-	defer stmt.Close()
-
-	_, err = stmt.Exec(blobId, localFsLocation)
+	err = txn.Commit()
 	if err != nil {
 		log.Errorf("UPDATE apid_blob_available id {%s} local_fs_location {%s} failed", localFsLocation, err)
 		return err
diff --git a/data_test.go b/data_test.go
index b3abc2f..58653ef 100644
--- a/data_test.go
+++ b/data_test.go
@@ -162,7 +162,10 @@
 
 //initialize DB for tests
 func initTestDb(db apid.DB) {
-	_, err := db.Exec(`
+	tx, err := db.Begin()
+	Expect(err).Should(Succeed())
+	defer tx.Rollback()
+	_, err = tx.Exec(`
 		CREATE TABLE metadata_runtime_entity_metadata (
 		id text,
 		organization_id text,
@@ -183,7 +186,7 @@
 	Expect(err).Should(Succeed())
 
 	// ready blob, empty resource
-	_, err = db.Exec(`
+	_, err = tx.Exec(`
 		INSERT INTO "metadata_runtime_entity_metadata" VALUES(
 		'1dc4895e-6494-4b59-979f-5f4c89c073b4',
 		'73fcac6c-5d9f-44c1-8db0-333efda3e6e8',
@@ -204,7 +207,7 @@
 	Expect(err).Should(Succeed())
 
 	// ready blob, ready resource
-	_, err = db.Exec(`
+	_, err = tx.Exec(`
 		INSERT INTO "metadata_runtime_entity_metadata" VALUES(
 		'319963ff-217e-4ecc-8d6e-c3665e962d1e',
 		'73fcac6c-5d9f-44c1-8db0-333efda3e6e8',
@@ -225,7 +228,7 @@
 	Expect(err).Should(Succeed())
 
 	// ready blob, unready resource
-	_, err = db.Exec(`
+	_, err = tx.Exec(`
 		INSERT INTO "metadata_runtime_entity_metadata" VALUES(
 		'3af44bb7-0a74-4283-860c-3561e6c19132',
 		'73fcac6c-5d9f-44c1-8db0-333efda3e6e8',
@@ -246,7 +249,7 @@
 	Expect(err).Should(Succeed())
 
 	// unready blob, empty resource
-	_, err = db.Exec(`
+	_, err = tx.Exec(`
 		INSERT INTO "metadata_runtime_entity_metadata" VALUES(
 		'd5ffd9db-4795-43eb-b645-d2a0b6c8ac6a',
 		'73fcac6c-5d9f-44c1-8db0-333efda3e6e8',
@@ -267,7 +270,7 @@
 	Expect(err).Should(Succeed())
 
 	// unready blob, ready resource
-	_, err = db.Exec(`
+	_, err = tx.Exec(`
 		INSERT INTO "metadata_runtime_entity_metadata" VALUES(
 		'84ac8d68-b3d1-4bcc-ad0d-c6a0ed67e16c',
 		'73fcac6c-5d9f-44c1-8db0-333efda3e6e8',
@@ -288,7 +291,7 @@
 	Expect(err).Should(Succeed())
 
 	// unready blob, unready resource
-	_, err = db.Exec(`
+	_, err = tx.Exec(`
 		INSERT INTO "metadata_runtime_entity_metadata" VALUES(
 		'3ecd351c-1173-40bf-b830-c194e5ef9038',
 		'73fcac6c-5d9f-44c1-8db0-333efda3e6e8',
@@ -307,4 +310,5 @@
 		);
 	`)
 	Expect(err).Should(Succeed())
+	Expect(tx.Commit()).Should(Succeed())
 }