forked from grassrootseconomics/visedriver
		
	Add threaded gdbm wrapper
This commit is contained in:
		
							parent
							
								
									0813a619b4
								
							
						
					
					
						commit
						78d349ccc7
					
				| @ -18,7 +18,6 @@ import ( | |||||||
| 	"git.defalsify.org/vise.git/logging" | 	"git.defalsify.org/vise.git/logging" | ||||||
| 	"git.defalsify.org/vise.git/resource" | 	"git.defalsify.org/vise.git/resource" | ||||||
| 	"git.defalsify.org/vise.git/state" | 	"git.defalsify.org/vise.git/state" | ||||||
| 	gdbmdb "git.defalsify.org/vise.git/db/gdbm" |  | ||||||
| 
 | 
 | ||||||
| 	"git.grassecon.net/urdt/ussd/internal/handlers" | 	"git.grassecon.net/urdt/ussd/internal/handlers" | ||||||
| 	"git.grassecon.net/urdt/ussd/internal/storage" | 	"git.grassecon.net/urdt/ussd/internal/storage" | ||||||
| @ -282,8 +281,11 @@ func(s *sshRunner) Run(ctx context.Context) {//, mss *storage.MenuStorageService | |||||||
| 
 | 
 | ||||||
| func sshLoadKeys(ctx context.Context, dbDir string) error { | func sshLoadKeys(ctx context.Context, dbDir string) error { | ||||||
| 	keyStoreFile := path.Join(dbDir, "ssh_authorized_keys.gdbm") | 	keyStoreFile := path.Join(dbDir, "ssh_authorized_keys.gdbm") | ||||||
| 	keyStore = gdbmdb.NewGdbmDb() | 	keyStore = storage.NewThreadGdbmDb() | ||||||
| 	keyStore.Connect(ctx, keyStoreFile) | 	err := keyStore.Connect(ctx, keyStoreFile) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
| 	pubKey, _, _, _, err := ssh.ParseAuthorizedKey([]byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCu5rYCxMBsVAL1TEkMQgmElAYEZj5zYDdyHjUxZ6qzHBOZD9GAzdxx9GyQDx2vdYm3329tLH/69ky1YA3nUz8SnJGBD6hC5XrqwN6zo9R9oOHAKTwiPGhey2NTVmheP+9XNHukBnOlkkWOQlpDDvMbWOztaZOWDaA8OIeP0t6qzFqLyelyg65lxzM3BKd7bCmmfzl/64BcP1MotAmB9DUxmY0Wb4Q2hYZfNYBx50Z4xthTgKV+Xoo8CbTduKotIz6hluQGvWdtxlCJQEiZ2f4RYY87JSA6/BAH2fhxuLHMXRpzocJNqARqCWpdcTGSg7bzxbKvTFH9OU4wZtr9ie40OR4zsc1lOBZL0rnp8GLkG8ZmeBQrgEDlmR9TTlz4okgtL+c5TCS37rjZYVjmtGwihws0EL9+wyv2dSQibirklC4wK5eWHKXl5vab19qzw/qRLdoRBK40DxbRKggxA7gqSsKrmrf+z7CuLIz/kxF+169FBLbh1MfBOGdx1awm6aU= lash@furioso")) | 	pubKey, _, _, _, err := ssh.ParseAuthorizedKey([]byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCu5rYCxMBsVAL1TEkMQgmElAYEZj5zYDdyHjUxZ6qzHBOZD9GAzdxx9GyQDx2vdYm3329tLH/69ky1YA3nUz8SnJGBD6hC5XrqwN6zo9R9oOHAKTwiPGhey2NTVmheP+9XNHukBnOlkkWOQlpDDvMbWOztaZOWDaA8OIeP0t6qzFqLyelyg65lxzM3BKd7bCmmfzl/64BcP1MotAmB9DUxmY0Wb4Q2hYZfNYBx50Z4xthTgKV+Xoo8CbTduKotIz6hluQGvWdtxlCJQEiZ2f4RYY87JSA6/BAH2fhxuLHMXRpzocJNqARqCWpdcTGSg7bzxbKvTFH9OU4wZtr9ie40OR4zsc1lOBZL0rnp8GLkG8ZmeBQrgEDlmR9TTlz4okgtL+c5TCS37rjZYVjmtGwihws0EL9+wyv2dSQibirklC4wK5eWHKXl5vab19qzw/qRLdoRBK40DxbRKggxA7gqSsKrmrf+z7CuLIz/kxF+169FBLbh1MfBOGdx1awm6aU= lash@furioso")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | |||||||
							
								
								
									
										116
									
								
								internal/storage/gdbm.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								internal/storage/gdbm.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,116 @@ | |||||||
|  | package storage | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 
 | ||||||
|  | 	"git.defalsify.org/vise.git/db" | ||||||
|  | 	"git.defalsify.org/vise.git/lang" | ||||||
|  | 	gdbmdb "git.defalsify.org/vise.git/db/gdbm" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	dbC map[string]chan db.Db | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ThreadGdbmDb struct { | ||||||
|  | 	db db.Db | ||||||
|  | 	registered bool | ||||||
|  | 	connStr string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewThreadGdbmDb() *ThreadGdbmDb { | ||||||
|  | 	if dbC == nil { | ||||||
|  | 		dbC = make(map[string]chan db.Db) | ||||||
|  | 	} | ||||||
|  | 	return &ThreadGdbmDb{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) Connect(ctx context.Context, connStr string) error { | ||||||
|  | 	var ok bool | ||||||
|  | 	_, ok = dbC[connStr] | ||||||
|  | 	if ok { | ||||||
|  | 		logg.WarnCtxf(ctx, "already registered thread gdbm, skipping", "connStr", connStr) | ||||||
|  | 	} | ||||||
|  | 	gdb := gdbmdb.NewGdbmDb() | ||||||
|  | 	err := gdb.Connect(ctx, connStr) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	dbC[connStr] = make(chan db.Db, 1) | ||||||
|  | 	dbC[connStr]<- gdb | ||||||
|  | 	tdb.connStr = connStr | ||||||
|  | 	tdb.registered = true | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) reserve() { | ||||||
|  | 	if tdb.db == nil { | ||||||
|  | 		tdb.db = <-dbC[tdb.connStr] | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) release() { | ||||||
|  | 	if tdb.db == nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	dbC[tdb.connStr] <- tdb.db | ||||||
|  | 	tdb.db = nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) SetPrefix(pfx uint8) { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	tdb.db.SetPrefix(pfx) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) SetSession(sessionId string) { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	tdb.db.SetSession(sessionId) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) SetLanguage(lng *lang.Language) { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	tdb.db.SetLanguage(lng) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) Safe() bool { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	v := tdb.db.Safe() | ||||||
|  | 	tdb.release() | ||||||
|  | 	return v | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) Prefix() uint8 { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	v := tdb.db.Prefix() | ||||||
|  | 	tdb.release() | ||||||
|  | 	return v | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) SetLock(typ uint8, locked bool) error { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	err := tdb.db.SetLock(typ, locked) | ||||||
|  | 	tdb.release() | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) Put(ctx context.Context, key []byte, val []byte) error { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	err := tdb.db.Put(ctx, key, val) | ||||||
|  | 	tdb.release() | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) Get(ctx context.Context, key []byte) ([]byte, error) { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	v, err := tdb.db.Get(ctx, key) | ||||||
|  | 	tdb.release() | ||||||
|  | 	return v, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func(tdb *ThreadGdbmDb) Close() error { | ||||||
|  | 	tdb.reserve() | ||||||
|  | 	close(dbC[tdb.connStr]) | ||||||
|  | 	err := tdb.db.Close() | ||||||
|  | 	tdb.db = nil | ||||||
|  | 	return err | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user