From c191824366ef00cbd055af3fb374d7db24d1e4a0 Mon Sep 17 00:00:00 2001
From: wei2912 <wei2912_support@hotmail.com>
Date: Fri, 28 Jun 2013 13:35:57 +0800
Subject: [PATCH] Add Begin&End Transaction optimizations.

---
 sqlite/sqlite_test.go | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/sqlite/sqlite_test.go b/sqlite/sqlite_test.go
index f79ed251..f9ab023f 100644
--- a/sqlite/sqlite_test.go
+++ b/sqlite/sqlite_test.go
@@ -103,7 +103,6 @@ func TestTruncate(t *testing.T) {
 
 // Appends maps and structs.
 func TestAppend(t *testing.T) {
-
 	sess, err := db.Open(wrapperName, settings)
 
 	if err != nil {
@@ -189,7 +188,6 @@ func TestAppend(t *testing.T) {
 
 // Tries to find and fetch rows.
 func TestFind(t *testing.T) {
-
 	var err error
 	var res db.Result
 
@@ -320,7 +318,6 @@ func TestFind(t *testing.T) {
 
 // Tests limit and offset.
 func TestLimitOffset(t *testing.T) {
-
 	var err error
 
 	sess, err := db.Open(wrapperName, settings)
@@ -398,7 +395,6 @@ func TestUpdate(t *testing.T) {
 
 // Tries to add test data and relations.
 func TestPopulate(t *testing.T) {
-
 	sess, err := db.Open(wrapperName, settings)
 
 	if err != nil {
@@ -786,6 +782,42 @@ func BenchmarkAppendDbItem(b *testing.B) {
 	}
 }
 
+// Contributed by wei2912
+// See: https://github.com/gosexy/db/issues/20#issuecomment-20167939
+// Applying the BEGIN and END transaction optimizations.
+func BenchmarkAppendDbItem_Transaction(b *testing.B) {
+	sess, err := db.Open(wrapperName, settings)
+
+	if err != nil {
+		b.Fatalf(err.Error())
+	}
+
+	defer sess.Close()
+
+	people := sess.ExistentCollection("people")
+	people.Truncate()
+	
+	driver := sess.Driver().(*sql.DB)
+	
+	b.ResetTimer()
+	_, err = driver.Exec(`BEGIN`)
+	if err != nil {
+		b.Fatalf(err.Error())
+	}
+
+	for i := 0; i < b.N; i++ {
+		_, err = people.Append(db.Item{"name": "john"})
+		if err != nil {
+			b.Fatalf(err.Error())
+		}
+	}
+	
+	_, err = driver.Exec(`END`)
+	if err != nil {
+		b.Fatalf(err.Error())
+	}
+}
+
 func BenchmarkAppendStruct(b *testing.B) {
 	sess, err := db.Open(wrapperName, settings)
 
-- 
GitLab