@@ -119,6 +119,8 @@ int commitHookTrampoline(void*);
119
119
void rollbackHookTrampoline(void*);
120
120
void updateHookTrampoline(void*, int, char*, char*, sqlite3_int64);
121
121
122
+ int authorizerTrampoline(void*, int, char*, char*, char*, char*);
123
+
122
124
#ifdef SQLITE_LIMIT_WORKER_THREADS
123
125
# define _SQLITE_HAS_LIMIT
124
126
# define SQLITE_LIMIT_LENGTH 0
@@ -200,9 +202,48 @@ func Version() (libVersion string, libVersionNumber int, sourceID string) {
200
202
}
201
203
202
204
const (
205
+ // used by authorizer and pre_update_hook
203
206
SQLITE_DELETE = C .SQLITE_DELETE
204
207
SQLITE_INSERT = C .SQLITE_INSERT
205
208
SQLITE_UPDATE = C .SQLITE_UPDATE
209
+
210
+ // used by authorzier - as return value
211
+ SQLITE_OK = C .SQLITE_OK
212
+ SQLITE_IGNORE = C .SQLITE_IGNORE
213
+ SQLITE_DENY = C .SQLITE_DENY
214
+
215
+ // different actions query tries to do - passed as argument to authorizer
216
+ SQLITE_CREATE_INDEX = C .SQLITE_CREATE_INDEX
217
+ SQLITE_CREATE_TABLE = C .SQLITE_CREATE_TABLE
218
+ SQLITE_CREATE_TEMP_INDEX = C .SQLITE_CREATE_TEMP_INDEX
219
+ SQLITE_CREATE_TEMP_TABLE = C .SQLITE_CREATE_TEMP_TABLE
220
+ SQLITE_CREATE_TEMP_TRIGGER = C .SQLITE_CREATE_TEMP_TRIGGER
221
+ SQLITE_CREATE_TEMP_VIEW = C .SQLITE_CREATE_TEMP_VIEW
222
+ SQLITE_CREATE_TRIGGER = C .SQLITE_CREATE_TRIGGER
223
+ SQLITE_CREATE_VIEW = C .SQLITE_CREATE_VIEW
224
+ SQLITE_CREATE_VTABLE = C .SQLITE_CREATE_VTABLE
225
+ SQLITE_DROP_INDEX = C .SQLITE_DROP_INDEX
226
+ SQLITE_DROP_TABLE = C .SQLITE_DROP_TABLE
227
+ SQLITE_DROP_TEMP_INDEX = C .SQLITE_DROP_TEMP_INDEX
228
+ SQLITE_DROP_TEMP_TABLE = C .SQLITE_DROP_TEMP_TABLE
229
+ SQLITE_DROP_TEMP_TRIGGER = C .SQLITE_DROP_TEMP_TRIGGER
230
+ SQLITE_DROP_TEMP_VIEW = C .SQLITE_DROP_TEMP_VIEW
231
+ SQLITE_DROP_TRIGGER = C .SQLITE_DROP_TRIGGER
232
+ SQLITE_DROP_VIEW = C .SQLITE_DROP_VIEW
233
+ SQLITE_DROP_VTABLE = C .SQLITE_DROP_VTABLE
234
+ SQLITE_PRAGMA = C .SQLITE_PRAGMA
235
+ SQLITE_READ = C .SQLITE_READ
236
+ SQLITE_SELECT = C .SQLITE_SELECT
237
+ SQLITE_TRANSACTION = C .SQLITE_TRANSACTION
238
+ SQLITE_ATTACH = C .SQLITE_ATTACH
239
+ SQLITE_DETACH = C .SQLITE_DETACH
240
+ SQLITE_ALTER_TABLE = C .SQLITE_ALTER_TABLE
241
+ SQLITE_REINDEX = C .SQLITE_REINDEX
242
+ SQLITE_ANALYZE = C .SQLITE_ANALYZE
243
+ SQLITE_FUNCTION = C .SQLITE_FUNCTION
244
+ SQLITE_SAVEPOINT = C .SQLITE_SAVEPOINT
245
+ SQLITE_COPY = C .SQLITE_COPY
246
+ SQLITE_RECURSIVE = C .SQLITE_RECURSIVE
206
247
)
207
248
208
249
// SQLiteDriver implements driver.Driver.
@@ -440,6 +481,20 @@ func (c *SQLiteConn) RegisterUpdateHook(callback func(int, string, string, int64
440
481
}
441
482
}
442
483
484
+ // RegisterAuthorizer sets the authorizer for connection.
485
+ //
486
+ // The parameters to the callback are the operation (one of the constants
487
+ // SQLITE_INSERT, SQLITE_DELETE, or SQLITE_UPDATE), and 1 to 3 arguments,
488
+ // depending on operation. More details see:
489
+ // https://www.sqlite.org/c3ref/c_alter_table.html
490
+ func (c * SQLiteConn ) RegisterAuthorizer (callback func (int , string , string , string ) int ) {
491
+ if callback == nil {
492
+ C .sqlite3_set_authorizer (c .db , nil , nil )
493
+ } else {
494
+ C .sqlite3_set_authorizer (c .db , (* [0 ]byte )(C .authorizerTrampoline ), unsafe .Pointer (newHandle (c , callback )))
495
+ }
496
+ }
497
+
443
498
// RegisterFunc makes a Go function available as a SQLite function.
444
499
//
445
500
// The Go function can have arguments of the following types: any
0 commit comments