You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/04/05 06:27:11 UTC

incubator-mynewt-newt git commit: newtmgr: Remove sqlite dependency.

Repository: incubator-mynewt-newt
Updated Branches:
  refs/heads/develop 9a47b7e0f -> 08820b7dd


newtmgr: Remove sqlite dependency.

Use a JSON file instead.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/commit/08820b7d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/tree/08820b7d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/diff/08820b7d

Branch: refs/heads/develop
Commit: 08820b7ddac5d673634bcc3b61612b1f4b591544
Parents: 9a47b7e
Author: Christopher Collins <cc...@apache.org>
Authored: Mon Apr 4 21:26:43 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Mon Apr 4 21:26:43 2016 -0700

----------------------------------------------------------------------
 newtmgr/config/connprofile.go | 126 +++++++++--------
 util/cfgdb.go                 | 273 -------------------------------------
 2 files changed, 71 insertions(+), 328 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/08820b7d/newtmgr/config/connprofile.go
----------------------------------------------------------------------
diff --git a/newtmgr/config/connprofile.go b/newtmgr/config/connprofile.go
index 0ddf61f..b0203cb 100644
--- a/newtmgr/config/connprofile.go
+++ b/newtmgr/config/connprofile.go
@@ -23,11 +23,14 @@ import (
 	log "github.com/Sirupsen/logrus"
 	"github.com/mitchellh/go-homedir"
 
+	"encoding/json"
+	"io/ioutil"
+
 	"mynewt.apache.org/newt/util"
 )
 
 type ConnProfileMgr struct {
-	cDb *util.CfgDb
+	profiles map[string]*ConnProfile
 }
 
 type NewtmgrConnProfile interface {
@@ -43,7 +46,9 @@ type ConnProfile struct {
 }
 
 func NewConnProfileMgr() (*ConnProfileMgr, error) {
-	cpm := &ConnProfileMgr{}
+	cpm := &ConnProfileMgr{
+		profiles: map[string]*ConnProfile{},
+	}
 
 	if err := cpm.Init(); err != nil {
 		return nil, err
@@ -52,49 +57,84 @@ func NewConnProfileMgr() (*ConnProfileMgr, error) {
 	return cpm, nil
 }
 
-func (cpm *ConnProfileMgr) Init() error {
-	var err error
-
+func connProfileCfgFilename() (string, error) {
 	dir, err := homedir.Dir()
 	if err != nil {
-		return util.NewNewtError(err.Error())
+		return "", util.NewNewtError(err.Error())
 	}
 
-	cpm.cDb, err = util.NewCfgDb("cp", dir+"/.newtmgr.cp.db")
+	return dir + "/.newtmgr.cp.json", nil
+}
+
+func (cpm *ConnProfileMgr) Init() error {
+	filename, err := connProfileCfgFilename()
 	if err != nil {
 		return err
 	}
 
+	// XXX: Should determine whether file exists by attempting to read it.
+	if util.NodeExist(filename) {
+		blob, err := ioutil.ReadFile(filename)
+		if err != nil {
+			return util.NewNewtError(err.Error())
+		}
+
+		var profiles []*ConnProfile
+		err = json.Unmarshal(blob, &profiles)
+		if err != nil {
+			return util.FmtNewtError("error reading connection profile "+
+				"config (%s): %s", filename, err.Error())
+		}
+
+		for _, p := range profiles {
+			cpm.profiles[p.MyName] = p
+		}
+	}
+
 	return nil
 }
 
 func (cpm *ConnProfileMgr) GetConnProfileList() ([]*ConnProfile, error) {
 	log.Debugf("Getting list of connection profiles")
-	cpMap, err := cpm.cDb.GetSect("conn_profile_list")
-	if err != nil {
-		return nil, err
+
+	cpList := make([]*ConnProfile, 0, len(cpm.profiles))
+	for _, p := range cpm.profiles {
+		cpList = append(cpList, p)
 	}
 
-	cpList := make([]*ConnProfile, 0)
+	return cpList, nil
+}
 
-	for _, profileName := range cpMap {
-		cp, err := cpm.GetConnProfile(profileName)
-		if err != nil {
-			return nil, err
-		}
+func (cpm *ConnProfileMgr) save() error {
+	list, _ := cpm.GetConnProfileList()
+	b, err := json.Marshal(list)
+	if err != nil {
+		return util.NewNewtError(err.Error())
+	}
 
-		cpList = append(cpList, cp)
+	filename, err := connProfileCfgFilename()
+	if err != nil {
+		return err
 	}
 
-	return cpList, nil
+	err = ioutil.WriteFile(filename, b, 0644)
+	if err != nil {
+		return util.NewNewtError(err.Error())
+	}
+
+	return nil
 }
 
 func (cpm *ConnProfileMgr) DeleteConnProfile(name string) error {
-	if err := cpm.cDb.DeleteSect("_conn_profile_" + name); err != nil {
-		return err
+	if cpm.profiles[name] == nil {
+		return util.FmtNewtError("connection profile \"%s\" doesn't exist",
+			name)
 	}
 
-	if err := cpm.cDb.DeleteKey("conn_profile_list", name); err != nil {
+	delete(cpm.profiles, name)
+
+	err := cpm.save()
+	if err != nil {
 		return err
 	}
 
@@ -102,16 +142,12 @@ func (cpm *ConnProfileMgr) DeleteConnProfile(name string) error {
 }
 
 func (cpm *ConnProfileMgr) AddConnProfile(cp *ConnProfile) error {
-	sect := "_conn_profile_" + cp.Name()
-	cDb := cpm.cDb
-
-	// First serialize the conn profile into the configuration database
-	cDb.SetKey(sect, "name", cp.Name())
-	cDb.SetKey(sect, "type", cp.Type())
-	cDb.SetKey(sect, "connstring", cp.ConnString())
+	cpm.profiles[cp.Name()] = cp
 
-	// Then write the ConnProfile to the ConnProfileList
-	cDb.SetKey("conn_profile_list", cp.Name(), cp.Name())
+	err := cpm.save()
+	if err != nil {
+		return err
+	}
 
 	return nil
 }
@@ -123,33 +159,13 @@ func (cpm *ConnProfileMgr) GetConnProfile(pName string) (*ConnProfile, error) {
 		return nil, util.NewNewtError("Need to specify connection profile")
 	}
 
-	sectName := "_conn_profile_" + pName
-
-	cpVals, err := cpm.cDb.GetSect(sectName)
-	if err != nil {
-		return nil, err
+	p := cpm.profiles[pName]
+	if p == nil {
+		return nil, util.FmtNewtError("connection profile \"%s\" doesn't "+
+			"exist", pName)
 	}
 
-	cp, err := NewConnProfile(pName)
-	if err != nil {
-		return nil, err
-	}
-
-	for k, v := range cpVals {
-		switch k {
-		case "name":
-			cp.MyName = v
-		case "type":
-			cp.MyType = v
-		case "connstring":
-			cp.MyConnString = v
-		default:
-			return nil, util.NewNewtError(
-				"Invalid key " + k + " with val " + v)
-		}
-	}
-
-	return cp, nil
+	return p, nil
 }
 
 func (cp *ConnProfile) Name() string {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/08820b7d/util/cfgdb.go
----------------------------------------------------------------------
diff --git a/util/cfgdb.go b/util/cfgdb.go
deleted file mode 100644
index e333c6e..0000000
--- a/util/cfgdb.go
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package util
-
-import (
-	"database/sql"
-	"fmt"
-
-	log "github.com/Sirupsen/logrus"
-	_ "github.com/mattn/go-sqlite3"
-)
-
-type CfgDb struct {
-	DbPath   string
-	DbPrefix string
-	Config   map[string]map[string]string
-	db       *sql.DB
-}
-
-func NewCfgDb(prefix string, dbPath string) (*CfgDb, error) {
-	c := &CfgDb{}
-
-	if err := c.Init(prefix, dbPath); err != nil {
-		return nil, err
-	}
-
-	return c, nil
-}
-
-func (c *CfgDb) createDb(db *sql.DB, prefix string) error {
-	query := `
-	CREATE TABLE IF NOT EXISTS %s_cfg (
-		cfg_name VARCHAR(255) NOT NULL,
-		key VARCHAR(255) NOT NULL,
-		value TEXT
-	)
-	`
-	query = fmt.Sprintf(query, prefix)
-
-	if _, err := db.Exec(query); err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	return nil
-}
-
-func (c *CfgDb) Init(prefix string, dbPath string) error {
-	c.DbPrefix = prefix
-	c.DbPath = dbPath
-	c.Config = make(map[string]map[string]string)
-
-	db, err := sql.Open("sqlite3", dbPath)
-	if err != nil {
-		return err
-	}
-
-	if err = c.createDb(db, prefix); err != nil {
-		return err
-	}
-	c.db = db
-
-	log.Debugf("Reading config from %s for %s", dbPath, prefix)
-
-	rows, err := db.Query(fmt.Sprintf("SELECT * FROM %s_cfg", prefix))
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer rows.Close()
-
-	for rows.Next() {
-		var cName sql.NullString
-		var cKey sql.NullString
-		var cVal sql.NullString
-
-		if err := rows.Scan(&cName, &cKey, &cVal); err != nil {
-			return NewNewtError(err.Error())
-		}
-
-		log.Debugf("Setting sect %s, key %s to val %s", cName.String,
-			cKey.String, cVal.String)
-
-		if _, ok := c.Config[cName.String]; !ok {
-			c.Config[cName.String] = make(map[string]string)
-		}
-
-		c.Config[cName.String][cKey.String] = cVal.String
-	}
-
-	return nil
-}
-
-func (c *CfgDb) HasSect(sect string) bool {
-	_, ok := c.Config[sect]
-	if !ok {
-		return false
-	}
-	return true
-}
-
-func (c *CfgDb) HasKey(sect string, key string) bool {
-	sMap, ok := c.Config[sect]
-	if !ok {
-		return false
-	}
-
-	_, ok = sMap[key]
-	if !ok {
-		return false
-	}
-
-	return true
-}
-
-func (c *CfgDb) GetKey(sect string, key string) (string, error) {
-	sMap, ok := c.Config[sect]
-	if !ok {
-		return "", NewNewtError("No configuration section " + sect + " exists")
-	}
-
-	val, ok := sMap[key]
-	if !ok {
-		return "", NewNewtError("No configuration variable " + key +
-			" in sect " + sect + "exists")
-	}
-
-	return val, nil
-}
-
-func (c *CfgDb) GetSect(sect string) (map[string]string, error) {
-	sMap, ok := c.Config[sect]
-	if !ok {
-		return nil, NewNewtError("No configuration section " + sect + "exists")
-	}
-	return sMap, nil
-}
-
-func (c *CfgDb) DeleteSect(sect string) error {
-	log.Debugf("Deleting sect %s", sect)
-
-	tx, err := c.db.Begin()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	stmt, err := tx.Prepare(fmt.Sprintf(
-		"DELETE FROM %s_cfg WHERE cfg_name=?", c.DbPrefix))
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer stmt.Close()
-
-	r, err := stmt.Exec(sect)
-	if err != nil {
-		return err
-	}
-
-	tx.Commit()
-
-	if naffected, err := r.RowsAffected(); naffected > 0 && err == nil {
-		log.Debugf("Successfully deleted sect %s from db %s",
-			sect, c.DbPath)
-	} else {
-		log.Debugf("Sect %s not found in db %s.  Delete "+
-			"successful", sect, c.DbPath)
-	}
-
-	return nil
-}
-
-func (c *CfgDb) DeleteKey(sect string, key string) error {
-	log.Debugf("Deleting sect %s, key %s", sect, key)
-
-	tx, err := c.db.Begin()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	stmt, err := tx.Prepare(fmt.Sprintf(
-		"DELETE FROM %s_cfg WHERE cfg_name=? AND key=?", c.DbPrefix))
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer stmt.Close()
-
-	r, err := stmt.Exec(sect, key)
-	if err != nil {
-		return err
-	}
-
-	tx.Commit()
-
-	if naffected, err := r.RowsAffected(); naffected > 0 && err == nil {
-		log.Debugf("Successfully deleted sect %s, key %s from db %s",
-			sect, key, c.DbPath)
-	} else {
-		log.Debugf("Sect %s, key %s not found in db %s.  Delete "+
-			"successful", sect, key, c.DbPath)
-	}
-
-	return nil
-}
-
-func (c *CfgDb) SetKey(sect string, key string, val string) error {
-	if _, ok := c.Config[sect]; !ok {
-		log.Debugf("Section %s doesn't exist, creating it!", sect)
-		c.Config[sect] = make(map[string]string)
-	}
-	c.Config[sect][key] = val
-
-	log.Debugf("Storing value %s in section %s, key %s",
-		val, sect, key)
-
-	tx, err := c.db.Begin()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	stmt, err := tx.Prepare(fmt.Sprintf(
-		"UPDATE %s_cfg SET value=? WHERE cfg_name=? AND key=?", c.DbPrefix))
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer stmt.Close()
-
-	r, err := stmt.Exec(val, sect, key)
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	// If update succeeded, then exit out.
-	if naffected, err := r.RowsAffected(); naffected > 0 && err == nil {
-		tx.Commit()
-		log.Debugf("Sect %s, key %s successfully updated to %s",
-			sect, key, val)
-		return nil
-	}
-
-	// Otherwise, insert a new row.
-	stmt, err = tx.Prepare(fmt.Sprintf("INSERT INTO %s_cfg VALUES (?, ?, ?)",
-		c.DbPrefix))
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer stmt.Close()
-
-	if _, err = stmt.Exec(sect, key, val); err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	tx.Commit()
-
-	log.Debugf("Section %s, key %s successfully created.  Value set"+
-		"to %s", sect, key, val)
-
-	return nil
-}