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
-}