add column maps
diff --git a/apigee_sync.go b/apigee_sync.go
index 10745de..1f6e38a 100644
--- a/apigee_sync.go
+++ b/apigee_sync.go
@@ -26,7 +26,7 @@
maxIdleConnsPerHost = 10
)
-var knownTables = make(map[string]bool)
+var knownTables = make(map[string]map[string]bool)
/*
* Start from existing snapshot if possible
diff --git a/apigee_sync_test.go b/apigee_sync_test.go
index b885593..ad79a6b 100644
--- a/apigee_sync_test.go
+++ b/apigee_sync_test.go
@@ -235,38 +235,39 @@
It("should correctly identify non-proper subsets with respect to maps", func() {
+ testMap := map[string]map[string]bool{"a": make(map[string]bool), "b": make(map[string]bool)}
//test b proper subset of a
- Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
+ Expect(changesHaveNewTables(testMap,
[]common.Change{common.Change{Table: "b"}},
)).To(BeFalse())
//test a == b
- Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
+ Expect(changesHaveNewTables(testMap,
[]common.Change{common.Change{Table: "a"}, common.Change{Table: "b"}},
)).To(BeFalse())
//test b superset of a
- Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
+ Expect(changesHaveNewTables(testMap,
[]common.Change{common.Change{Table: "a"}, common.Change{Table: "b"}, common.Change{Table: "c"}},
)).To(BeTrue())
//test b not subset of a
- Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
+ Expect(changesHaveNewTables(testMap,
[]common.Change{common.Change{Table: "c"}},
)).To(BeTrue())
//test a empty
- Expect(changesHaveNewTables(map[string]bool{},
+ Expect(changesHaveNewTables(map[string]map[string]bool{},
[]common.Change{common.Change{Table: "a"}},
)).To(BeTrue())
//test b empty
- Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
+ Expect(changesHaveNewTables(testMap,
[]common.Change{},
)).To(BeFalse())
//test b nil
- Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true}, nil)).To(BeFalse())
+ Expect(changesHaveNewTables(testMap, nil)).To(BeFalse())
//test a nil
Expect(changesHaveNewTables(nil,
diff --git a/change_test.go b/change_test.go
index 383bff6..ec9b82f 100644
--- a/change_test.go
+++ b/change_test.go
@@ -46,7 +46,7 @@
BeforeEach(func() {
event := createTestDb("./sql/init_mock_db.sql", "test_change")
processSnapshot(&event)
- knownTables = extractTablesFromDB(getDB())
+ knownTables = extractTableColsFromDB(getDB())
})
var initializeContext = func() {
diff --git a/changes.go b/changes.go
index 9f26466..9141927 100644
--- a/changes.go
+++ b/changes.go
@@ -298,7 +298,7 @@
/*
* Determine if any tables in changes are not present in known tables
*/
-func changesHaveNewTables(a map[string]bool, changes []common.Change) bool {
+func changesHaveNewTables(a map[string]map[string]bool, changes []common.Change) bool {
//nil maps should not be passed in. Making the distinction between nil map and empty map
if a == nil {
@@ -307,7 +307,7 @@
}
for _, change := range changes {
- if !a[normalizeTableName(change.Table)] {
+ if _, ok := a[normalizeTableName(change.Table)]; !ok {
log.Infof("Unable to find %s table in current known tables", change.Table)
return true
}
diff --git a/snapshot.go b/snapshot.go
index ae889e3..66108eb 100644
--- a/snapshot.go
+++ b/snapshot.go
@@ -147,7 +147,7 @@
}
func (s *simpleSnapShotManager) storeDataSnapshot(snapshot *common.Snapshot) {
- knownTables = extractTablesFromSnapshot(snapshot)
+ knownTables = extractTableColumnsFromSnapshot(snapshot)
_, err := dataService.DBVersion(snapshot.SnapshotInfo)
if err != nil {
@@ -167,50 +167,20 @@
}
-func extractTablesFromSnapshot(snapshot *common.Snapshot) (tables map[string]bool) {
-
- tables = make(map[string]bool)
-
- log.Debug("Extracting table names from snapshot")
- if snapshot.Tables == nil {
- //if this panic ever fires, it's a bug
- db, err := dataService.DBVersion(snapshot.SnapshotInfo)
- if err != nil {
- log.Panicf("Database inaccessible: %v", err)
- }
- rows, err := db.Query("SELECT DISTINCT tableName FROM _transicator_tables;")
- if err != nil {
- log.Panicf("Unable to read in known snapshot tables from sqlite file")
- }
- for rows.Next() {
- var tableName string
- rows.Scan(&tableName)
- if err != nil {
- log.Panic("Error scaning tableNames from _transicator_tables")
- }
- tables[tableName] = true
- }
-
- } else {
-
- for _, table := range snapshot.Tables {
- tables[table.Name] = true
- }
- }
- return tables
-
-}
-
-func extractTableColumnsFromSnapshot(snapshot *common.Snapshot) (map[string][]string) {
-
- columns := make(map[string][]string)
- tables := make([]string, 0)
-
+func extractTableColumnsFromSnapshot(snapshot *common.Snapshot) map[string]map[string]bool {
log.Debug("Extracting table names from snapshot")
db, err := dataService.DBVersion(snapshot.SnapshotInfo)
if err != nil {
log.Panicf("Database inaccessible: %v", err)
}
+
+ return extractTableColsFromDB(db)
+}
+
+func extractTableColsFromDB(db apid.DB) map[string]map[string]bool {
+
+ columns := make(map[string]map[string]bool)
+ tables := make([]string, 0)
rows, err := db.Query("SELECT DISTINCT tableName FROM _transicator_tables;")
if err != nil {
log.Panicf("Unable to read in known snapshot tables from sqlite file")
@@ -226,7 +196,7 @@
}
for _, tableName := range tables {
-
+ columns[tableName] = make(map[string]bool)
dummyRows, err := db.Query("SELECT * FROM " + tableName + " LIMIT 0;")
if err != nil {
log.Panicf("Get table info failed: %v", err)
@@ -236,35 +206,14 @@
if err != nil {
log.Panicf("Get table columns failed: %v", err)
}
- columns[tableName] = cols
+ for _, col := range cols {
+ columns[tableName][col] = true
+ }
+
}
return columns
}
-func extractTablesFromDB(db apid.DB) (tables map[string]bool) {
-
- tables = make(map[string]bool)
-
- log.Debug("Extracting table names from existing DB")
- rows, err := db.Query("SELECT DISTINCT tableName FROM _transicator_tables;")
- defer rows.Close()
-
- if err != nil {
- log.Panicf("Error reading current set of tables: %v", err)
- }
-
- for rows.Next() {
- var table string
- if err := rows.Scan(&table); err != nil {
- log.Panicf("Error reading current set of tables: %v", err)
- }
- log.Debugf("Table %s found in existing db", table)
-
- tables[table] = true
- }
- return tables
-}
-
// Skip Downloading snapshot if there is already a snapshot available from previous run
func startOnLocalSnapshot(snapshot string) *common.Snapshot {
log.Infof("Starting on local snapshot: %s", snapshot)
@@ -275,7 +224,7 @@
log.Panicf("Database inaccessible: %v", err)
}
- knownTables = extractTablesFromDB(db)
+ knownTables = extractTableColsFromDB(db)
// allow plugins (including this one) to start immediately on existing database
// Note: this MUST have no tables as that is used as an indicator
diff --git a/snapshot_test.go b/snapshot_test.go
index ffad61a..bcbafd5 100644
--- a/snapshot_test.go
+++ b/snapshot_test.go
@@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package apidApigeeSync
+
import (
"github.com/apigee-labs/transicator/common"
. "github.com/onsi/ginkgo"
@@ -24,7 +25,6 @@
const testDbId = "test_snapshot"
Context("Change Agent Unit Tests", func() {
- testHandler := handler{}
var createTestDb = func(sqlfile string, dbId string) common.Snapshot {
initDb(sqlfile, "./mockdb_snapshot.sqlite3")
@@ -43,8 +43,8 @@
BeforeEach(func() {
event := createTestDb("./sql/init_mock_db.sql", testDbId)
- testHandler.Handle(&event)
- knownTables = extractTablesFromDB(getDB())
+ processSnapshot(&event)
+ knownTables = extractTableColsFromDB(getDB())
})
It("test extract table columns", func() {
@@ -52,10 +52,14 @@
SnapshotInfo: testDbId,
}
columns := extractTableColumnsFromSnapshot(s)
- for table, cols := range columns {
+ for table, colMap := range columns {
+ cols := []string{}
+ for col := range colMap {
+ cols = append(cols, col)
+ }
log.Error("snapshot TABLE: " + table + " COLUMN: " + strings.Join(cols, "|"))
}
})
})
-})
\ No newline at end of file
+})