Compare commits

...

4 Commits

Author SHA1 Message Date
Bel LaPointe
2309633b30 ignore bin 2025-06-04 18:51:40 -06:00
bel
491bd4e976 cleanup 2025-06-04 18:50:00 -06:00
bel
21ec6f32d3 fix lowercase to num 2025-06-04 18:48:28 -06:00
Bel LaPointe
c463bd16d8 numeric uuids 2025-06-04 18:32:53 -06:00
2 changed files with 18 additions and 4 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
**/*.sw* **/*.sw*
/jellyfin-user-clone

21
main.go
View File

@@ -31,6 +31,9 @@ func main() {
if err != nil { if err != nil {
log.Fatalf("%v", err) log.Fatalf("%v", err)
} }
defer func() {
os.RemoveAll(workd)
}()
{ {
if err := cp(path.Join(data, jellyDB), path.Join(workd, jellyDB)); err != nil { if err := cp(path.Join(data, jellyDB), path.Join(workd, jellyDB)); err != nil {
@@ -65,6 +68,8 @@ func main() {
if n, err := SelectOne[int](jellyfinDB, `SELECT COUNT(*) FROM Users WHERE Username = $1`, toU); err != nil { if n, err := SelectOne[int](jellyfinDB, `SELECT COUNT(*) FROM Users WHERE Username = $1`, toU); err != nil {
log.Fatalf("%v", err) log.Fatalf("%v", err)
} else if n != 1 { } else if n != 1 {
log.Println("creating user", toU, "from", fromU)
nextID, err := SelectOne[int](libraryDB, `SELECT COALESCE(MAX(userId), 0)+1 FROM UserDatas`) nextID, err := SelectOne[int](libraryDB, `SELECT COALESCE(MAX(userId), 0)+1 FROM UserDatas`)
if err != nil { if err != nil {
log.Fatalf("failed to get max userid ever: %v", err) log.Fatalf("failed to get max userid ever: %v", err)
@@ -79,6 +84,8 @@ func main() {
} else if n != 1 { } else if n != 1 {
log.Fatalf("still no username=%q after insert", toU) log.Fatalf("still no username=%q after insert", toU)
} }
} else {
log.Println("user", toU, "already exists")
} }
toUUID, err := SelectOne[string](jellyfinDB, `SELECT Id FROM Users WHERE Username = $1`, toU) toUUID, err := SelectOne[string](jellyfinDB, `SELECT Id FROM Users WHERE Username = $1`, toU)
@@ -206,7 +213,7 @@ func CloneForColumn[T any](db *sql.DB, table, column string, from, to T, fixed m
values := []any{} values := []any{}
for _ = range uuidGenColumns { for _ = range uuidGenColumns {
values = append(values, fmt.Sprintf("'%s'", strings.ToUpper(uuid.New().String()))) values = append(values, fmt.Sprintf("'%s'", guid()))
} }
for _, arg := range args { for _, arg := range args {
values = append(values, *(arg.(*any))) values = append(values, *(arg.(*any)))
@@ -243,7 +250,7 @@ func CloneForColumn[T any](db *sql.DB, table, column string, from, to T, fixed m
func() string { func() string {
uuids := make([]string, len(uuidGenColumns)) uuids := make([]string, len(uuidGenColumns))
for i := range uuids { for i := range uuids {
uuids[i] = fmt.Sprintf("'%s'", strings.ToUpper(uuid.New().String())) uuids[i] = fmt.Sprintf("'%s'", guid())
} }
s := strings.Join(uuids, ", ") s := strings.Join(uuids, ", ")
if len(uuids) > 0 { if len(uuids) > 0 {
@@ -399,6 +406,12 @@ func Select[T any](db *sql.DB, q string, args ...any) ([]T, error) {
return results, rows.Err() return results, rows.Err()
} }
guid() string { func guid() string {
s := []byte(uuid.New().String())
for i := range s {
if ('A' <= s[i] && s[i] <= 'Z') || ('a' <= s[i] && s[i] <= 'z') {
s[i] = '0' + byte(int(s[i])%10)
}
}
return strings.ToUpper(string(s))
} }