working on LOCK

This commit is contained in:
Jeff Carr 2025-01-11 04:27:45 -06:00
parent 1f9e4a682d
commit 0edc28106a
4 changed files with 89 additions and 83 deletions

View File

@ -64,12 +64,13 @@ func (pf *File) specialBases(wFind io.Writer) {
// FRUIT == the string name of the message in the protobuf file
// APPLE == the type of the repeated variable
// APPLES == the variable name of the repeated struct
func (pf *File) processMessage(msg *MsgName, wSort, wFind io.Writer) error {
var FRUIT string = cases.Title(language.English, cases.NoLower).String(msg.Name)
func (pf *File) processMessage(parent *MsgName, wSort, wFind io.Writer) error {
var FRUIT string = cases.Title(language.English, cases.NoLower).String(parent.Name)
var LOCK string = parent.Lockname
log.Printf("Generating functions for %s\n", FRUIT)
for _, v := range msg.Vars {
for _, v := range parent.Vars {
if !v.IsRepeated {
log.Printf("\tSKIP %s %s\n", v.VarName, v.VarType)
continue
@ -96,7 +97,7 @@ func (pf *File) processMessage(msg *MsgName, wSort, wFind io.Writer) error {
log.Printf("FOUND: %s %s for %s\n", APPLES, APPLE, FRUIT)
found.addFindByMsg(wFind, FRUIT, APPLES, APPLE)
found.addFindByMsg(wFind, FRUIT, APPLES, APPLE, LOCK)
found.addAppendByMsg(wFind, FRUIT, APPLES, APPLE)
found.addDeleteByMsg(wFind, FRUIT, APPLES, APPLE)
found.addInsertByMsg(wFind, FRUIT, APPLES, APPLE) // new idea
@ -106,13 +107,13 @@ func (pf *File) processMessage(msg *MsgName, wSort, wFind io.Writer) error {
return nil
}
func (parent *MsgName) addFindByMsg(w io.Writer, FRUIT, APPLES, APPLE string) {
func (parent *MsgName) addFindByMsg(w io.Writer, FRUIT, APPLES, APPLE, LOCK string) {
log.Printf("\tINSERT: %s %s for %s\n", APPLES, APPLE, FRUIT)
for _, v := range parent.Vars {
if v.HasUnique {
var COLOR string = cases.Title(language.English, cases.NoLower).String(v.VarName)
log.Printf("\t\t(x %s) InsertBy%s(string) *%s\n", FRUIT, COLOR, APPLE)
parent.findBy(w, FRUIT, APPLES, APPLE, COLOR)
parent.findBy(w, FRUIT, APPLES, APPLE, COLOR, LOCK)
}
}
}
@ -157,7 +158,7 @@ func (parent *MsgName) addAppendByMsg(w io.Writer, FRUIT, APPLES, APPLE string)
COLORS = append(COLORS, COLOR)
log.Printf("\t\t(x %s) AppendUniqueBy%s(%s)\n", FRUIT, COLOR, APPLE)
parent.appendUniqueBy(w, FRUIT, APPLES, APPLE, COLOR)
parent.appendUniqueCOLOR(w, FRUIT, APPLES, APPLE, COLOR)
}
}
if len(COLORS) > 0 {

68
generateAppend.go Normal file
View File

@ -0,0 +1,68 @@
package main
import (
"fmt"
"io"
"go.wit.com/log"
)
// generates Append()
// I like these functions the best.
func (msg *MsgName) simpleAppend(w io.Writer, FRUIT, APPLES, APPLE string) {
LOCK := msg.getLockname("x")
log.Printf("\t\t(x %s) APPEND(%s)\n", FRUIT, APPLE)
// append -- no check at all
fmt.Fprintln(w, "// just a simple Append() shortcut (but still uses the mutex lock)")
fmt.Fprintln(w, "func (x *"+FRUIT+") Append(y *"+APPLE+") {")
fmt.Fprintln(w, " "+LOCK+".Lock()")
fmt.Fprintln(w, " defer "+LOCK+".Unlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " x."+APPLES+" = append(x."+APPLES+", y)")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
}
func (msg *MsgName) appendUnique(w io.Writer, FRUIT, APPLES, APPLE string, COLORS []string) {
LOCK := msg.getLockname("x")
fmt.Fprintln(w, "// enforces "+APPLE+" is unique in "+FRUIT+"."+APPLES)
fmt.Fprintln(w, "func (x *"+FRUIT+") AppendUnique(newP *"+APPLE+") bool {")
fmt.Fprintln(w, " "+LOCK+".Lock()")
fmt.Fprintln(w, " defer "+LOCK+".Unlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for _, p := range x."+APPLES+" {")
for _, COLOR := range COLORS {
fmt.Fprintln(w, " if p."+COLOR+" == newP."+COLOR+" {")
fmt.Fprintln(w, " return false")
fmt.Fprintln(w, " }")
}
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " x."+APPLES+" = append(x."+APPLES+", newP)")
fmt.Fprintln(w, " return true")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
}
func (msg *MsgName) appendUniqueCOLOR(w io.Writer, FRUIT, APPLES, APPLE, COLOR string) {
LOCK := msg.getLockname("x")
fmt.Fprintln(w, "// enforces "+APPLE+"."+COLOR+" is unique in "+FRUIT+"."+APPLES)
fmt.Fprintln(w, "func (x *"+FRUIT+") AppendUnique"+COLOR+"(newP *"+APPLE+") bool {")
fmt.Fprintln(w, " "+LOCK+".Lock()")
fmt.Fprintln(w, " defer "+LOCK+".Unlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for _, p := range x."+APPLES+" {")
fmt.Fprintln(w, " if p."+COLOR+" == newP."+COLOR+" {")
fmt.Fprintln(w, " return false")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " x."+APPLES+" = append(x."+APPLES+", newP)")
fmt.Fprintln(w, " return true")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
}

View File

@ -3,13 +3,9 @@ package main
import (
"fmt"
"io"
"go.wit.com/log"
)
// generates Find()
// but really it has Append(), Delete() and some other stuff
// generates Find() and some other stuff
func (msg *MsgName) getLockname(s string) string {
// leave this function stubbed in for development of autogenpb
@ -22,10 +18,8 @@ func (msg *MsgName) getLockname(s string) string {
return msg.Lockname
}
func (msg *MsgName) findBy(w io.Writer, FRUIT, APPLES, APPLE, COLOR string) {
LOCK := msg.getLockname("x")
fmt.Fprintln(w, "// find a dependancy by the go path")
func (msg *MsgName) findBy(w io.Writer, FRUIT, APPLES, APPLE, COLOR, LOCK string) {
fmt.Fprintln(w, "// lookup a", FRUIT, "by the ", COLOR, msg.Lockname, msg.Name)
fmt.Fprintln(w, "func (x *"+FRUIT+") FindBy"+COLOR+"(s string) *"+APPLE+" {")
fmt.Fprintln(w, " if x == nil {")
fmt.Fprintln(w, " return nil")
@ -44,64 +38,6 @@ func (msg *MsgName) findBy(w io.Writer, FRUIT, APPLES, APPLE, COLOR string) {
fmt.Fprintln(w, "")
}
// I like these functions the best.
func (msg *MsgName) simpleAppend(w io.Writer, FRUIT, APPLES, APPLE string) {
LOCK := msg.getLockname("x")
log.Printf("\t\t(x %s) APPEND(%s)\n", FRUIT, APPLE)
// append -- no check at all
fmt.Fprintln(w, "// just a simple Append() shortcut (but still uses the mutex lock)")
fmt.Fprintln(w, "func (x *"+FRUIT+") Append(y *"+APPLE+") {")
fmt.Fprintln(w, " "+LOCK+".Lock()")
fmt.Fprintln(w, " defer "+LOCK+".Unlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " x."+APPLES+" = append(x."+APPLES+", y)")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
}
func (msg *MsgName) appendUnique(w io.Writer, FRUIT, APPLES, APPLE string, COLORS []string) {
LOCK := msg.getLockname("x")
fmt.Fprintln(w, "// enforces "+APPLE+" is unique in "+FRUIT+"."+APPLES)
fmt.Fprintln(w, "func (x *"+FRUIT+") AppendUnique(newP *"+APPLE+") bool {")
fmt.Fprintln(w, " "+LOCK+".Lock()")
fmt.Fprintln(w, " defer "+LOCK+".Unlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for _, p := range x."+APPLES+" {")
for _, COLOR := range COLORS {
fmt.Fprintln(w, " if p."+COLOR+" == newP."+COLOR+" {")
fmt.Fprintln(w, " return false")
fmt.Fprintln(w, " }")
}
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " x."+APPLES+" = append(x."+APPLES+", newP)")
fmt.Fprintln(w, " return true")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
}
func (msg *MsgName) appendUniqueBy(w io.Writer, FRUIT, APPLES, APPLE, COLOR string) {
LOCK := msg.getLockname("x")
fmt.Fprintln(w, "// enforces "+APPLE+"."+COLOR+" is unique in "+FRUIT+"."+APPLES)
fmt.Fprintln(w, "func (x *"+FRUIT+") AppendUniqueBy"+COLOR+"(newP *"+APPLE+") bool {")
fmt.Fprintln(w, " "+LOCK+".Lock()")
fmt.Fprintln(w, " defer "+LOCK+".Unlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for _, p := range x."+APPLES+" {")
fmt.Fprintln(w, " if p."+COLOR+" == newP."+COLOR+" {")
fmt.Fprintln(w, " return false")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " x."+APPLES+" = append(x."+APPLES+", newP)")
fmt.Fprintln(w, " return true")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
}
func (msg *MsgName) deleteBy(w io.Writer, FRUIT, APPLES, APPLE, COLOR string) {
LOCK := msg.getLockname("x")
@ -145,10 +81,10 @@ func (msg *MsgName) deleteByWithCopy(w io.Writer, FRUIT, APPLES, APPLE, COLOR st
fmt.Fprintln(w, "")
}
// new 2025 idea. useful? TODO: look at this again in 1y
func (msg *MsgName) insertBy(w io.Writer, FRUIT, APPLES, APPLE string, COLOR string) {
LOCK := msg.getLockname("x")
fmt.Fprintln(w, "// useful? remindme:1y")
fmt.Fprintln(w, "// returns an "+APPLE+" if "+COLOR+" matches, otherwise create")
fmt.Fprintln(w, "func (x *"+FRUIT+") InsertBy"+COLOR+" (y string) *"+APPLE+" {")
fmt.Fprintln(w, " "+LOCK+".Lock()")

View File

@ -17,6 +17,9 @@ func (pf *File) syncLock(w io.Writer) {
var LOCK string = pf.Base.Lockname // if the Marshall code changes, this will have to change
fmt.Fprintln(w, "// a simple global lock")
fmt.Fprintln(w, "var "+LOCK+" sync.RWMutex")
fmt.Fprintln(w, "")
/*
fmt.Fprintln(w, "")
fmt.Fprintln(w, "// this is needed because it seems Marshal() fails if locks are in the structs (?)")
fmt.Fprintln(w, "// this might just be a syntactical runtime error. notsure.")
@ -24,9 +27,7 @@ func (pf *File) syncLock(w io.Writer) {
fmt.Fprintln(w, "// go/src/google.golang.org/protobuf/proto/proto_methods.go")
fmt.Fprintln(w, "// go/src/google.golang.org/protobuf/proto/encode.go")
fmt.Fprintln(w, "// my guess is that Marshal() needs to be told to ignore sync.RWMutex as it ephemeral and can't be stored")
fmt.Fprintln(w, "")
fmt.Fprintln(w, "var "+LOCK+" sync.RWMutex")
fmt.Fprintln(w, "")
*/
}
func (pb *Files) addMutex(f *File) error {