use pointers for optional update fields to distinguish empty from unset
This commit is contained in:
@@ -45,7 +45,8 @@ var editCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if content, err := os.ReadFile(tmp.Name()); err == nil {
|
if content, err := os.ReadFile(tmp.Name()); err == nil {
|
||||||
if err := d.UpdateNode(args[0], db.UpdateParams{Content: string(content)}); err != nil {
|
c := string(content)
|
||||||
|
if err := d.UpdateNode(args[0], db.UpdateParams{Content: &c}); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "failed to update:", err)
|
fmt.Fprintln(os.Stderr, "failed to update:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,8 +61,17 @@ var updateCmd = &cobra.Command{
|
|||||||
uRmTags = append(uRmTags, "_prio::low", "_prio::medium", "_prio::high")
|
uRmTags = append(uRmTags, "_prio::low", "_prio::medium", "_prio::high")
|
||||||
}
|
}
|
||||||
|
|
||||||
uParams := db.UpdateParams{Title: uTitle, Content: uContent, DueDate: uDue, ClearDue: uClearDue,
|
uParams := db.UpdateParams{ClearDue: uClearDue,
|
||||||
AddTags: uAddTags, RemoveTags: uRmTags, AddRels: addRels, RemoveRels: rmRels}
|
AddTags: uAddTags, RemoveTags: uRmTags, AddRels: addRels, RemoveRels: rmRels}
|
||||||
|
if cmd.Flags().Changed("title") {
|
||||||
|
uParams.Title = &uTitle
|
||||||
|
}
|
||||||
|
if cmd.Flags().Changed("content") {
|
||||||
|
uParams.Content = &uContent
|
||||||
|
}
|
||||||
|
if cmd.Flags().Changed("due") {
|
||||||
|
uParams.DueDate = &uDue
|
||||||
|
}
|
||||||
if err := d.UpdateNode(args[0], uParams); err != nil {
|
if err := d.UpdateNode(args[0], uParams); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "failed to update:", err)
|
fmt.Fprintln(os.Stderr, "failed to update:", err)
|
||||||
return
|
return
|
||||||
|
|||||||
16
db/node.go
16
db/node.go
@@ -41,7 +41,7 @@ type CreateParams struct {
|
|||||||
Rels map[models.RelType][]string
|
Rels map[models.RelType][]string
|
||||||
}
|
}
|
||||||
type UpdateParams struct {
|
type UpdateParams struct {
|
||||||
Title, Content, DueDate string
|
Title, Content, DueDate *string
|
||||||
ClearDue bool
|
ClearDue bool
|
||||||
AddTags, RemoveTags []string
|
AddTags, RemoveTags []string
|
||||||
AddRels, RemoveRels map[models.RelType][]string
|
AddRels, RemoveRels map[models.RelType][]string
|
||||||
@@ -97,19 +97,18 @@ func (db *DB) UpdateNode(id string, p UpdateParams) error {
|
|||||||
_, err := tx.Exec("UPDATE nodes SET "+col+" = ? WHERE id = ?", val, id)
|
_, err := tx.Exec("UPDATE nodes SET "+col+" = ? WHERE id = ?", val, id)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
//TODO: does it make sense to check for emtpy sting? should it be possible to set the content to ""?
|
if p.Title != nil {
|
||||||
if p.Title != "" {
|
if err := upd("title", *p.Title); err != nil {
|
||||||
if err := upd("title", p.Title); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p.Content != "" {
|
if p.Content != nil {
|
||||||
if err := upd("content", p.Content); err != nil {
|
if err := upd("content", *p.Content); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p.DueDate != "" {
|
if p.DueDate != nil {
|
||||||
if err := upd("due_date", p.DueDate); err != nil {
|
if err := upd("due_date", *p.DueDate); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -143,7 +142,6 @@ func (db *DB) UpdateNode(id string, p UpdateParams) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (db *DB) DeleteNode(id string) error {
|
func (db *DB) DeleteNode(id string) error {
|
||||||
//TODO: check if this delete propagates?
|
|
||||||
_, err := db.Exec("DELETE FROM nodes WHERE id = ?", id)
|
_, err := db.Exec("DELETE FROM nodes WHERE id = ?", id)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user