@@ -2,13 +2,14 @@ import 'dart:math';
22import 'dart:typed_data' ;
33
44import 'package:path/path.dart' as p;
5+ import 'package:typed_data/typed_buffers.dart' ;
56
67import '../../constants.dart' ;
78import '../../vfs.dart' ;
89import 'utils.dart' ;
910
1011final class InMemoryFileSystem extends BaseVirtualFileSystem {
11- final Map <String , Uint8List ?> fileData = {};
12+ final Map <String , Uint8Buffer ?> fileData = {};
1213
1314 InMemoryFileSystem ({super .name = 'dart-memory' , super .random});
1415
@@ -34,7 +35,7 @@ final class InMemoryFileSystem extends BaseVirtualFileSystem {
3435 final create = flags & SqlFlag .SQLITE_OPEN_CREATE ;
3536
3637 if (create != 0 ) {
37- fileData[pathStr] = Uint8List ( 0 );
38+ fileData[pathStr] = Uint8Buffer ( );
3839 } else {
3940 throw VfsException (SqlError .SQLITE_CANTOPEN );
4041 }
@@ -69,7 +70,8 @@ class _InMemoryFile extends BaseVfsFile {
6970 if (file == null || file.length <= offset) return 0 ;
7071
7172 final available = min (buffer.length, file.length - offset);
72- buffer.setRange (0 , available, file, offset);
73+ final list = file.buffer.asUint8List (0 , file.length);
74+ buffer.setRange (0 , available, list, offset);
7375 return available;
7476 }
7577
@@ -102,12 +104,12 @@ class _InMemoryFile extends BaseVfsFile {
102104 void xTruncate (int size) {
103105 final file = vfs.fileData[path];
104106
105- final result = Uint8List (size);
106- if (file != null ) {
107- result.setRange (0 , min (size, file.length), file);
107+ if (file == null ) {
108+ vfs.fileData[path] = Uint8Buffer ();
109+ vfs.fileData[path]! .length = size;
110+ } else {
111+ file.length = size;
108112 }
109-
110- vfs.fileData[path] = result;
111113 }
112114
113115 @override
@@ -117,19 +119,17 @@ class _InMemoryFile extends BaseVfsFile {
117119
118120 @override
119121 void xWrite (Uint8List buffer, int fileOffset) {
120- final file = vfs.fileData[path] ?? Uint8List (0 );
121- final increasedSize = fileOffset + buffer.length - file.length;
122+ var file = vfs.fileData[path];
122123
123- if (increasedSize <= 0 ) {
124- // Can write directy
125- file.setRange (fileOffset, fileOffset + buffer.length, buffer);
126- } else {
127- // We need to grow the file first
128- final newFile = Uint8List (file.length + increasedSize)
129- ..setAll (0 , file)
130- ..setAll (fileOffset, buffer);
124+ if (file == null ) {
125+ file = Uint8Buffer ();
126+ vfs.fileData[path] = file;
127+ }
131128
132- vfs.fileData[path] = newFile;
129+ var endIndex = fileOffset + buffer.length;
130+ if (endIndex > file.length) {
131+ file.length = endIndex;
133132 }
133+ file.setRange (fileOffset, endIndex, buffer);
134134 }
135135}
0 commit comments