1
+ package main
2
+
3
+ import (
4
+ "strings"
5
+ "syscall/js"
6
+
7
+ "github.com/sqldef/sqldef/database"
8
+ "github.com/sqldef/sqldef/parser"
9
+ "github.com/sqldef/sqldef/schema"
10
+ )
11
+
12
+ // diff takes SQL DDL statements and generates the difference
13
+ func diff (mode string , desiredDDLs string , currentDDLs string ) (string , error ) {
14
+ generatorMode := schema .GeneratorModeMysql
15
+ sqlParser := database.GenericParser {}
16
+
17
+ if mode == "postgres" {
18
+ generatorMode = schema .GeneratorModePostgres
19
+ sqlParser = database .NewParser (parser .ParserModePostgres )
20
+ }
21
+
22
+ if mode == "sqlite3" {
23
+ generatorMode = schema .GeneratorModeSQLite3
24
+ sqlParser = database .NewParser (parser .ParserModeSQLite3 )
25
+ }
26
+
27
+ if mode == "mssql" {
28
+ generatorMode = schema .GeneratorModeMssql
29
+ sqlParser = database .NewParser (parser .ParserModeMssql )
30
+ }
31
+
32
+ ddls , err := schema .GenerateIdempotentDDLs (generatorMode , sqlParser , desiredDDLs , currentDDLs , database.GeneratorConfig {}, "" )
33
+ out := strings .Join (ddls , ";\n " )
34
+
35
+ if err != nil {
36
+ return "" , err
37
+ } else {
38
+ return out , nil
39
+ }
40
+ }
41
+
42
+ // diffWrapper creates a JS-compatible function for the diff operation
43
+ func diffWrapper () js.Func {
44
+ return js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
45
+ if len (args ) != 3 {
46
+ return map [string ]interface {}{
47
+ "error" : "Invalid number of arguments. Expected 3: mode, desiredDDLs, currentDDLs" ,
48
+ }
49
+ }
50
+
51
+ mode := args [0 ].String ()
52
+ desiredDDLs := args [1 ].String ()
53
+ currentDDLs := args [2 ].String ()
54
+
55
+ result , err := diff (mode , desiredDDLs , currentDDLs )
56
+ if err != nil {
57
+ return map [string ]interface {}{
58
+ "error" : err .Error (),
59
+ }
60
+ }
61
+
62
+ return map [string ]interface {}{
63
+ "result" : result ,
64
+ }
65
+ })
66
+ }
67
+
68
+ // createSqlDefModule creates an object with all exported functions
69
+ func createSqlDefModule () map [string ]interface {} {
70
+ return map [string ]interface {}{
71
+ "diff" : diffWrapper (),
72
+ }
73
+ }
74
+
75
+ // registerModuleFactory registers a function that returns the module
76
+ func registerModuleFactory () js.Func {
77
+ moduleFactory := js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
78
+ return createSqlDefModule ()
79
+ })
80
+
81
+ js .Global ().Set ("createSqlDefModule" , moduleFactory )
82
+ return moduleFactory
83
+ }
84
+
85
+ func main () {
86
+ moduleFactory := registerModuleFactory ()
87
+ <- make (chan bool )
88
+ moduleFactory .Release ()
89
+ }
0 commit comments