-
Notifications
You must be signed in to change notification settings - Fork 4
/
sqlyoga_development.livecodescript
218 lines (159 loc) · 6.19 KB
/
sqlyoga_development.livecodescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
script "SQL Yoga Development Tools"
/**
Summary: Reloads all of the SQL Yoga configuration files.
Description:
This handler is useful for reloading configuration files after
you modify them.
*/
command sqlyogadev_reloadConfigFiles
levureReloadRegisteredKey "sql yoga>configuration"
return empty
end sqlyogadev_reloadConfigFiles
/**
Summary: Turns on logging using the Levure logging helper.
Description:
All log entries generated by SQL Yoga will be prefixed with "sqlYoga:"
*/
command sqlyogadev_enableLogging pBoolean, pConnectionName, pDBKey
if pBoolean then
dbconn_set "log callback", "sqlyogadev_loggingCallback", pConnectionName, pDBKey
else
dbconn_set "log callback", "", pConnectionName, pDBKey
end if
return empty
end sqlyogadev_enableLogging
command sqlyogadev_loggingCallback pSQL, pConnectionName, pDBKey
loggerLogMsg "sqlYoga:" && pSQL
end sqlyogadev_loggingCallback
/**
Summary: Saves the current schema for a database to a YAML file.
Description:
SQL Yoga will load the schema.yml file if present and use that to define
the table objects for the database. If the schema.yml file is not present
then the first time a connection is made to the database the tables and
columns will be extracted from the database.
A schema.yml can be used to create a new database. Just create a connection
to an empty database and call `dbsynch_databaseWithSchema`.
*/
command sqlyogadev_saveSchemaToYAML pDBKey
local tError
_saveSchemaToYAML pDBKey
put the result into tError
return tError for error
end sqlyogadev_saveSchemaToYAML
command sqlyogadev_createSchemaMigration pName, pDBKey
local tError, tMigrateFolder, tStamp
put _migrateFolder(pDBKey) into tMigrateFolder
put _GetGMTTimeStampForMigrationId() into tStamp
put textEncode("migration:" & cr & " ", "utf8") \
into URL ("binfile:" & tMigrateFolder & "/" & tStamp & "_" & pName & ".yml")
put the result into tError
return tError for error
end sqlyogadev_createSchemaMigration
/**
Summary: Runs all migrations in the *migrate* folder that have not been applied to the current connection.
Description:
This handler will loop through all files in the *migrate* folder. The schema version
for the migration will be determined by the numbers at the front of the filename.
Each number is compared against the current `schema` table `version` column value.
If the version of the migration is greater than the version of the column value then
the migration is applied to the database.
After running the last migration the version of the migration is stored in the
`schema` table `version` column.
*/
command sqlyogadev_runMigrations pConnectionName, pDBKey
local tError, tConfigA, i, tMigrateFolder
put _migrateFolder(pDBKey) into tMigrateFolder
if there is a folder tMigrateFolder then
_runMigrations tMigrateFolder, pConnectionName, pDBKey
put the result into tError
else
put "migrate folder not found:" && tMigrateFolder into tError
end if
if tError is empty then
_saveSchemaToYAML pDBKey
put the result into tError
end if
return tError
end sqlyogadev_runMigrations
command _runMigrations pMigrationFolder, pConnectionName, pDBKey
local tError, tFiles, tFile, tMigrateA
local tMigrationVersion
put files(pMigrationFolder) into tFiles
filter tFiles without ".*"
filter tFiles with regex pattern "(.*\.yml$)|(.*\.livecodescript$)"
sort lines of tFiles numeric by each
repeat for each line tFile in tFiles
put _extractMigrationVersionFromFilename(tFile) into tMigrationVersion
if tFile ends with ".yml" or tFile ends with ".yaml" then
put yamlFileToArray(pMigrationFolder & "/" & tFile) into tMigrateA
put the result into tError
if tError is empty then
dbschema_processMigrationArray tMigrationVersion, tMigrateA, pConnectionName, pDBKey
end if
else if tFile ends with ".livecodescript" or tFile ends with ".livecode" then
dbschema_processMigrationFile tMigrationVersion, pMigrationFolder & "/" & tFile, pConnectionName, pDBKey
end if
if tError is not empty then exit repeat
end repeat
return tError
end _runMigrations
private function _extractMigrationVersionFromFilename pFilename
local tChar, tVersion
repeat for each char tChar in pFilename
if tChar is a number then
put tChar after tVersion
end if
end repeat
return tVersion
end _extractMigrationVersionFromFilename
private command _saveSchemaToYAML pDBKey
local tError, tDBFolder, tYAML
put _databaseFolder() into tDBFolder
if there is a folder tDBFolder then
put dbschema_get("yaml", pDBKey) into tYAML
put textEncode(tYAML, "utf8") into URL("binfile:" & tDBFolder & "/schema.yml")
put the result into tError
end if
return tError
end _saveSchemaToYAML
private function _databaseFolder pDBKey
local tConfigA, i
put levureAppGet("sql yoga") into tConfigA
repeat with i = 1 to the number of elements of tConfigA["configuration"]
if tConfigA["configuration"][i]["database key"] is pDBKey \
or (pDBKey is empty and tConfigA["configuration"][i]["database key"] is "default") then
return tConfigA["configuration"][i]["filename"]
end if
end repeat
return empty
end _databaseFolder
private function _migrateFolder pDBKey
local tDBFolder
put _databaseFolder(pDBKey) into tDBFolder
if tDBFolder is not empty then
return tDBFolder & "/migrate"
else
return empty
end if
end _migrateFolder
private function _GetGMTTimeStampForMigrationId
local tInternetTime, tGMTOffset
put the internet date into tInternetTime
put _InternetTimeStampGMTOffset(tInternetTime) into tGMTOffset
convert tInternetTime from internet date to dateItems
if tGMTOffset is a number then
subtract tGMTOffset from item 4 of tInternetTime
end if
convert tInternetTime to dateItems
replace comma with empty in tInternetTime
return tInternetTime
end _GetGMTTimeStampForMigrationId
private function _InternetTimeStampGMTOffset pInternetTime
local tGMTOffset
put the last word of pInternetTime into tGMTOffset
delete the char -2 to -1 of tGMTOffset
if char 2 of tGMTOffset is 0 then delete char 2 of tGMTOffset
if char 1 of tGMTOffset is "+" then delete char 1 of tGMTOffset
return tGMTOffset
end _InternetTimeStampGMTOffset