@@ -297,6 +297,51 @@ const (
297
297
/*SQLITE_RECURSIVE = C.SQLITE_RECURSIVE*/
298
298
)
299
299
300
+ // Standard File Control Opcodes
301
+ // See: https://www.sqlite.org/c3ref/c_fcntl_begin_atomic_write.html
302
+ const (
303
+ SQLITE_FCNTL_LOCKSTATE = int (1 )
304
+ SQLITE_FCNTL_GET_LOCKPROXYFILE = int (2 )
305
+ SQLITE_FCNTL_SET_LOCKPROXYFILE = int (3 )
306
+ SQLITE_FCNTL_LAST_ERRNO = int (4 )
307
+ SQLITE_FCNTL_SIZE_HINT = int (5 )
308
+ SQLITE_FCNTL_CHUNK_SIZE = int (6 )
309
+ SQLITE_FCNTL_FILE_POINTER = int (7 )
310
+ SQLITE_FCNTL_SYNC_OMITTED = int (8 )
311
+ SQLITE_FCNTL_WIN32_AV_RETRY = int (9 )
312
+ SQLITE_FCNTL_PERSIST_WAL = int (10 )
313
+ SQLITE_FCNTL_OVERWRITE = int (11 )
314
+ SQLITE_FCNTL_VFSNAME = int (12 )
315
+ SQLITE_FCNTL_POWERSAFE_OVERWRITE = int (13 )
316
+ SQLITE_FCNTL_PRAGMA = int (14 )
317
+ SQLITE_FCNTL_BUSYHANDLER = int (15 )
318
+ SQLITE_FCNTL_TEMPFILENAME = int (16 )
319
+ SQLITE_FCNTL_MMAP_SIZE = int (18 )
320
+ SQLITE_FCNTL_TRACE = int (19 )
321
+ SQLITE_FCNTL_HAS_MOVED = int (20 )
322
+ SQLITE_FCNTL_SYNC = int (21 )
323
+ SQLITE_FCNTL_COMMIT_PHASETWO = int (22 )
324
+ SQLITE_FCNTL_WIN32_SET_HANDLE = int (23 )
325
+ SQLITE_FCNTL_WAL_BLOCK = int (24 )
326
+ SQLITE_FCNTL_ZIPVFS = int (25 )
327
+ SQLITE_FCNTL_RBU = int (26 )
328
+ SQLITE_FCNTL_VFS_POINTER = int (27 )
329
+ SQLITE_FCNTL_JOURNAL_POINTER = int (28 )
330
+ SQLITE_FCNTL_WIN32_GET_HANDLE = int (29 )
331
+ SQLITE_FCNTL_PDB = int (30 )
332
+ SQLITE_FCNTL_BEGIN_ATOMIC_WRITE = int (31 )
333
+ SQLITE_FCNTL_COMMIT_ATOMIC_WRITE = int (32 )
334
+ SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE = int (33 )
335
+ SQLITE_FCNTL_LOCK_TIMEOUT = int (34 )
336
+ SQLITE_FCNTL_DATA_VERSION = int (35 )
337
+ SQLITE_FCNTL_SIZE_LIMIT = int (36 )
338
+ SQLITE_FCNTL_CKPT_DONE = int (37 )
339
+ SQLITE_FCNTL_RESERVE_BYTES = int (38 )
340
+ SQLITE_FCNTL_CKPT_START = int (39 )
341
+ SQLITE_FCNTL_EXTERNAL_READER = int (40 )
342
+ SQLITE_FCNTL_CKSM_FILE = int (41 )
343
+ )
344
+
300
345
// SQLiteDriver implements driver.Driver.
301
346
type SQLiteDriver struct {
302
347
Extensions []string
@@ -1813,6 +1858,31 @@ func (c *SQLiteConn) SetLimit(id int, newVal int) int {
1813
1858
return int (C ._sqlite3_limit (c .db , C .int (id ), C .int (newVal )))
1814
1859
}
1815
1860
1861
+ // SetFileControlInt invokes the xFileControl method on a given database. The
1862
+ // dbName is the name of the database. It will default to "main" if left blank.
1863
+ // The op is one of the opcodes prefixed by "SQLITE_FCNTL_". The arg argument
1864
+ // and return code are both opcode-specific. Please see the SQLite documentation.
1865
+ //
1866
+ // This method is not thread-safe as the returned error code can be changed by
1867
+ // another call if invoked concurrently.
1868
+ //
1869
+ // See: sqlite3_file_control, https://www.sqlite.org/c3ref/file_control.html
1870
+ func (c * SQLiteConn ) SetFileControlInt (dbName string , op int , arg int ) error {
1871
+ if dbName == "" {
1872
+ dbName = "main"
1873
+ }
1874
+
1875
+ cDBName := C .CString (dbName )
1876
+ defer C .free (unsafe .Pointer (cDBName ))
1877
+
1878
+ cArg := C .int (arg )
1879
+ rv := C .sqlite3_file_control (c .db , cDBName , C .int (op ), unsafe .Pointer (& cArg ))
1880
+ if rv != C .SQLITE_OK {
1881
+ return c .lastError ()
1882
+ }
1883
+ return nil
1884
+ }
1885
+
1816
1886
// Close the statement.
1817
1887
func (s * SQLiteStmt ) Close () error {
1818
1888
s .mu .Lock ()
0 commit comments