summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--addMutex.go15
-rw-r--r--example/Makefile4
-rw-r--r--example/main.go58
-rw-r--r--small/Makefile49
-rw-r--r--small/fruit.New.go9
-rw-r--r--small/fruit.proto20
-rw-r--r--small/main.go60
-rw-r--r--sort.go12
-rw-r--r--sortFunc.go18
-rw-r--r--sortNew.go10
11 files changed, 188 insertions, 69 deletions
diff --git a/Makefile b/Makefile
index 068d8a1..2b9bb7d 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ BUILDTIME = $(shell date +%Y.%m.%d_%H%M)
simple: build
# make -C example clean simpleMutexGlobal goimports vet
- make -C example clean simpleMutexProtoc goimports vet
+ # make -C example clean simpleMutexProtoc goimports vet
full: install clean auto goimports vet build test install
@echo everything worked and the example ran
diff --git a/addMutex.go b/addMutex.go
index d0d8836..0bc4e19 100644
--- a/addMutex.go
+++ b/addMutex.go
@@ -14,7 +14,7 @@ import (
)
func (pf *File) syncLock(w io.Writer) {
- var LOCK string = pf.Bases.Lockname
+ 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, "")
@@ -95,19 +95,20 @@ func (pf *File) structMatch(line string) bool {
start = "type " + msg.Name + " struct {"
if strings.HasPrefix(line, start) {
msg.MutexFound = true
+ msg.Lockname = "x.Lock"
return true
}
// ONLY PASS THIS IF YOU DO NOT WANT TO USE MARSHAL()
- if argv.Marshal {
- return false
- }
-
msg = pf.Base
start = "type " + msg.Name + " struct {"
if strings.HasPrefix(line, start) {
msg.MutexFound = true
+ if argv.Marshal {
+ // msg.Lockname = "fruitMu.Lock"
+ return false
+ }
return true
}
@@ -115,6 +116,10 @@ func (pf *File) structMatch(line string) bool {
start = "type " + msg.Name + " struct {"
if strings.HasPrefix(line, start) {
msg.MutexFound = true
+ if argv.Marshal {
+ // msg.Lockname = "fruitMu.Lock"
+ return false
+ }
return true
}
}
diff --git a/example/Makefile b/example/Makefile
index f704534..66edeaf 100644
--- a/example/Makefile
+++ b/example/Makefile
@@ -1,7 +1,7 @@
VERSION = $(shell git describe --tags)
BUILDTIME = $(shell date +%Y.%m.%d_%H%M)
-test: goimports build
+all: clean simpleMutexProtoc goimports build
./example
modproto: clean withMutex goimports vet build
@@ -46,4 +46,4 @@ goimports:
clean:
-rm -f go.*
-rm -f *.pb.go
- -rm -f testfiles
+ -rm -f example basket.pb
diff --git a/example/main.go b/example/main.go
index a248fed..078dbce 100644
--- a/example/main.go
+++ b/example/main.go
@@ -19,20 +19,18 @@ var sortmap map[string]string
var marshalKeys []string
var uniqueKeys []string
-var pb *Fruits
+var counter int = rand.Intn(100)
func main() {
- pb = NewFruits()
+ var pb *Fruits
+ // pb = NewFruits()
+ pb = new(Fruits)
// attempt to load basket.pb
if err := pb.loadBasket(); err != nil {
log.Info("load basket failed. running this for the first time?")
- fruit := &Fruit{
- Brand: "mom",
- City: "New NewYork",
- UPC: "2000",
- }
- testAppend(fruit)
- appendByUPC()
+ a := pb.getNewFruit()
+ pb.Fruits = append(pb.Fruits, a)
+ pb.printTable()
}
if err := pb.saveBasket(); err != nil {
badExit(err)
@@ -40,7 +38,6 @@ func main() {
if pb == nil {
badExit(fmt.Errorf("pb == nil This should not have happened"))
}
- pb.printTable()
pb.addThings()
pb.printTable()
pb.saveBasket()
@@ -52,6 +49,17 @@ func badExit(err error) {
os.Exit(-1)
}
+func (pb *Fruits) getNewFruit() *Fruit {
+ counter += rand.Intn(100)
+ upc := fmt.Sprintf("%d", counter)
+ fut := &Fruit{
+ Brand: "mom",
+ City: "New NewYork",
+ UPC: upc,
+ }
+ return fut
+}
+
/*
x := new(Fruit)
x = &Fruit{
@@ -130,36 +138,6 @@ func (pb *Fruits) addThings() {
}
}
-func testAppend(fruit *Fruit) {
- if pb.AppendUnique(fruit) {
- log.Info("AppendUnique() test1 ok", fruit.Brand, fruit.City)
- } else {
- badExit(fmt.Errorf("AppendUnique test1 failed %s %s %d\n", fruit.Brand, fruit.City, pb.Len()))
- }
- if pb.AppendUnique(fruit) {
- badExit(fmt.Errorf("AppendUnique() test2 worked but should not have %s %s", fruit.Brand, fruit.City))
- } else {
- log.Info("AppendUnique() test2 failed ok", fruit.Brand, fruit.City)
- }
-}
-
-func appendByUPC() {
- fruit := new(Fruit)
- fruit.UPC = "blah331"
- fruit.City = "fry"
- fruit.City = "paris"
- if pb.AppendUniqueByUPC(fruit) {
- log.Info("AppendUnique() test1 ok", fruit.Brand, fruit.City)
- } else {
- badExit(fmt.Errorf("AppendUniqueByUPC test1 failed %s %s %d\n", fruit.Brand, fruit.City, pb.Len()))
- }
- if pb.AppendUniqueByUPC(fruit) {
- badExit(fmt.Errorf("AppendUniqueByUPC() test2 worked but should not have %s %s", fruit.Brand, fruit.City))
- } else {
- log.Info("AppendUnique() test2 failed ok", fruit.Brand, fruit.City)
- }
-}
-
func (pb *Fruits) saveBasket() error {
data, err := pb.Marshal()
if err != nil {
diff --git a/small/Makefile b/small/Makefile
new file mode 100644
index 0000000..95a9c0c
--- /dev/null
+++ b/small/Makefile
@@ -0,0 +1,49 @@
+VERSION = $(shell git describe --tags)
+BUILDTIME = $(shell date +%Y.%m.%d_%H%M)
+
+all: clean simpleMutexProtoc goimports build
+ ./small
+
+modproto: clean withMutex goimports vet build
+ ./small
+
+rawproto: clean withoutMutex goimports vet build
+ ./small
+
+vet:
+ @GO111MODULE=off go vet
+
+build:
+ GO111MODULE=off go build -v
+
+simpleMutexProtoc:
+ ../autogenpb --proto fruit.proto --package main
+
+# why does this fail to compile? I'm not sure. maybe someone smart can figure it out
+# basically, it just trys to return the deleted record but says something
+# about the RWmutex lock being copied and GO fails to compile
+# I'm don't grok what is going on. This autogenerated code should
+# provide as simple as one could hope for automated way to try to debug it though!
+simpleMutexProtocWithDeleteCopy:
+ ../autogenpb --proto fruit.proto --package main --delete
+
+simpleMutexGlobal:
+ ../autogenpb --proto fruit.proto --package main --mutex=false
+
+withMutex:
+ ../autogenpb --proto fruit.proto --package main
+ ../autogenpb --proto file.proto --package main
+ ../autogenpb --proto patchset.proto --package main
+
+withoutMutex:
+ ../autogenpb --proto fruit.proto --package main --mutex=false
+ ../autogenpb --proto file.proto --package main --mutex=false
+ ../autogenpb --proto patchset.proto --package main --mutex=false
+
+goimports:
+ goimports -w *.go
+
+clean:
+ -rm -f go.*
+ -rm -f *.pb.go
+ -rm -f small basket.pb
diff --git a/small/fruit.New.go b/small/fruit.New.go
new file mode 100644
index 0000000..0be9b07
--- /dev/null
+++ b/small/fruit.New.go
@@ -0,0 +1,9 @@
+package main
+
+func NewFruits() *Fruits {
+ x := new(Fruits)
+ x.Uuid = "test"
+ x.Version = "v0.0.2"
+ // x.Fruits =
+ return x
+}
diff --git a/small/fruit.proto b/small/fruit.proto
new file mode 100644
index 0000000..341617d
--- /dev/null
+++ b/small/fruit.proto
@@ -0,0 +1,20 @@
+syntax = "proto3";
+
+package fruit;
+
+import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp
+
+// "Fruit" must exist. you can put anything in it
+message Fruit {
+ string brand = 1;
+ string UPC = 2;
+ string city = 3;
+}
+
+// "Fruits" MUST EXIST and start exactly this way
+// It must be "Fruit" + 's' and must match the name of this file: "fruit.proto"
+message Fruits { // `autogenpb:marshal`
+ string uuid = 1; // `autogenpb:uuid:be926ad9-f07f-484c-adf2-d96eeabf3079`
+ string version = 2; // `autogenpb:version:v0.0.1`
+ repeated Fruit Fruits = 3; // THIS MUST BE "Fruit" and then "Fruit" + "s"
+}
diff --git a/small/main.go b/small/main.go
new file mode 100644
index 0000000..f8e5d60
--- /dev/null
+++ b/small/main.go
@@ -0,0 +1,60 @@
+//go:build go1.20
+// +build go1.20
+
+package main
+
+import (
+ "os"
+
+ "go.wit.com/log"
+)
+
+// sent via -ldflags
+var VERSION string
+var BUILDTIME string
+
+var sortmap map[string]string
+var marshalKeys []string
+var uniqueKeys []string
+
+func main() {
+ var pb *Fruits
+ pb = new(Fruits)
+ // attempt to load basket.pb
+ fruit := &Fruit{
+ Brand: "mom",
+ City: "New NewYork",
+ UPC: "2000",
+ }
+ pb.Fruits = append(pb.Fruits, fruit)
+
+ a := &Fruit{
+ Brand: "fry",
+ City: "the moon",
+ UPC: "2001",
+ }
+ pb.Fruits = append(pb.Fruits, a)
+
+ pb.saveBasket()
+}
+
+func (pb *Fruits) saveBasket() error {
+ data, err := pb.Marshal()
+ if err != nil {
+ return err
+ }
+
+ w, err := os.OpenFile("basket.pb", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
+ if err != nil {
+ return err
+ }
+ w.Write(data)
+ w.Close()
+ log.Info("saved basket.pb ok")
+ return nil
+}
+
+func badExit(err error) {
+ log.Info("autogenpb error:", err)
+ os.Exit(-1)
+}
diff --git a/sort.go b/sort.go
index e7f4946..a63b067 100644
--- a/sort.go
+++ b/sort.go
@@ -21,14 +21,12 @@ func (pb *Files) makeNewSortfile(pf *File) error {
header(wSort, pf)
header(wFind, pf)
- if !argv.Mutex {
- pf.syncLock(wSort)
- }
+ pf.syncLock(wSort)
- if argv.Mutex {
- // use the mutex lock from the modified protoc.pb.go file
- pf.Bases.Lockname = "all.Lock"
- }
+ // if argv.Mutex {
+ // // use the mutex lock from the modified protoc.pb.go file
+ // pf.Bases.Lockname = "all.Lock"
+ // }
pf.Base.iterTop(wSort)
pf.Base.iterNext(wSort)
diff --git a/sortFunc.go b/sortFunc.go
index e12db51..361462b 100644
--- a/sortFunc.go
+++ b/sortFunc.go
@@ -57,18 +57,18 @@ func (pf *File) selectAllFunc(w io.Writer) {
var BASE string = pf.Base.Name
var LOCK string = pf.Bases.Lockname
- fmt.Fprintln(w, "func (all *"+BASES+") All() *"+BASE+"Iterator {")
- fmt.Fprintln(w, " "+BASE+"Pointers := all.selectAll"+BASE+"()")
+ fmt.Fprintln(w, "func (x *"+BASES+") All() *"+BASE+"Iterator {")
+ fmt.Fprintln(w, " "+BASE+"Pointers := x.selectAll"+BASE+"()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " iterator := New"+BASE+"Iterator("+BASE+"Pointers)")
fmt.Fprintln(w, " return iterator")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
- fmt.Fprintln(w, "func (all *"+BASES+") Len() int {")
+ fmt.Fprintln(w, "func (x *"+BASES+") Len() int {")
fmt.Fprintln(w, " "+LOCK+".RLock()")
fmt.Fprintln(w, " defer "+LOCK+".RUnlock()")
fmt.Fprintln(w, "")
- fmt.Fprintln(w, " return len(all."+BASES+")")
+ fmt.Fprintln(w, " return len(x."+BASES+")")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
}
@@ -78,8 +78,8 @@ func (pf *File) sortByFunc(w io.Writer) {
var BASE string = pf.Base.Name
for _, SORT := range pf.Base.Sort {
- fmt.Fprintln(w, "func (all *"+BASES+") SortBy"+SORT+"() *"+BASE+"Iterator {")
- fmt.Fprintln(w, " things := all.selectAll"+BASE+"()")
+ fmt.Fprintln(w, "func (x *"+BASES+") SortBy"+SORT+"() *"+BASE+"Iterator {")
+ fmt.Fprintln(w, " things := x.selectAll"+BASE+"()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " sort.Sort("+BASE+""+SORT+"(things))")
fmt.Fprintln(w, "")
@@ -103,14 +103,14 @@ func (pf *File) iterSelect(w io.Writer) {
var LOCK string = pf.Bases.Lockname
fmt.Fprintln(w, "// safely returns a slice of pointers to the "+BASE+" protobufs")
- fmt.Fprintln(w, "func (all *"+BASES+") selectAll"+BASE+"() []*"+BASE+" {")
+ fmt.Fprintln(w, "func (x *"+BASES+") selectAll"+BASE+"() []*"+BASE+" {")
fmt.Fprintln(w, " "+LOCK+".RLock()")
fmt.Fprintln(w, " defer "+LOCK+".RUnlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " // Create a new slice to hold pointers to each "+BASE+"")
fmt.Fprintln(w, " var tmp []*"+BASE+"")
- fmt.Fprintln(w, " tmp = make([]*"+BASE+", len(all."+BASES+"))")
- fmt.Fprintln(w, " for i, p := range all."+BASES+" {")
+ fmt.Fprintln(w, " tmp = make([]*"+BASE+", len(x."+BASES+"))")
+ fmt.Fprintln(w, " for i, p := range x."+BASES+" {")
fmt.Fprintln(w, " tmp[i] = p // Copy pointers for safe iteration")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
diff --git a/sortNew.go b/sortNew.go
index 1de2e82..72370ba 100644
--- a/sortNew.go
+++ b/sortNew.go
@@ -8,11 +8,11 @@ import (
)
func (msg *MsgName) getLockname(s string) string {
- if argv.Mutex {
- // use the mutex lock from the modified protoc.pb.go file
- return s + ".Lock"
- // return s // causes Marshal() to panic? always use the variable name 'Lock'?
- }
+ // if argv.Mutex {
+ // // use the mutex lock from the modified protoc.pb.go file
+ // return s + ".Lock"
+ // // return s // causes Marshal() to panic? always use the variable name 'Lock'?
+ // }
// a single global lock by struct name
return msg.Lockname
}