@@ -17,6 +17,9 @@ public static class NativeMethods
17
17
18
18
private readonly static WorldSerializer _worldSerializer = new WorldSerializer ( ) ;
19
19
private readonly static WorldsSerializer _worldsSerializer = new WorldsSerializer ( ) ;
20
+ private readonly static FortunesSerializer _fortunesSerializer = new FortunesSerializer ( ) ;
21
+ private static readonly byte [ ] _delimiter = new byte [ ] { 0xFF , 0xFF , 0xFF , 0xFF } ;
22
+
20
23
21
24
[ UnmanagedCallersOnly ( EntryPoint = "Dbms" ) ]
22
25
public static void Dbms ( int dbms )
@@ -66,6 +69,7 @@ public static unsafe IntPtr Db(int* length, IntPtr* handlePointer)
66
69
*/
67
70
}
68
71
72
+ /*
69
73
[UnmanagedCallersOnly(EntryPoint = "Fortunes")]
70
74
public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer)
71
75
{
@@ -81,6 +85,61 @@ public static unsafe IntPtr Fortunes(int* length, IntPtr* handlePointer)
81
85
82
86
return byteArrayPointer;
83
87
}
88
+ */
89
+
90
+ [ UnmanagedCallersOnly ( EntryPoint = "Fortunes" ) ]
91
+ public static unsafe IntPtr Fortunes ( int * length , IntPtr * handlePointer )
92
+ {
93
+ List < Fortune > fortunes = RawDb . LoadFortunesRows ( ) . GetAwaiter ( ) . GetResult ( ) ;
94
+
95
+ int totalSize = 0 ;
96
+
97
+ foreach ( var fortune in fortunes )
98
+ {
99
+ totalSize += sizeof ( int ) // for Id
100
+ + Encoding . UTF8 . GetByteCount ( fortune . Message ?? "" ) // for Message
101
+ + _delimiter . Length ; // for delimiter
102
+ }
103
+
104
+ // Allocate the total buffer
105
+ byte [ ] buffer = new byte [ totalSize ] ;
106
+ int offset = 0 ;
107
+
108
+ // Write each object to the buffer
109
+ foreach ( var fortune in fortunes )
110
+ {
111
+ // Write Id
112
+ BitConverter . TryWriteBytes ( buffer . AsSpan ( offset , sizeof ( int ) ) , fortune . Id ) ;
113
+ offset += sizeof ( int ) ;
114
+
115
+ // Write Message
116
+ int descriptionLength = Encoding . UTF8 . GetBytes ( fortune . Message ?? "" , buffer . AsSpan ( offset ) ) ;
117
+ offset += descriptionLength ;
118
+
119
+ // Write Delimiter
120
+ _delimiter . CopyTo ( buffer , offset ) ;
121
+ offset += _delimiter . Length ;
122
+ }
123
+
124
+ byte [ ] byteArray = buffer . ToArray ( ) ;
125
+ * length = byteArray . Length ;
126
+
127
+ /*
128
+ var memoryStream = new MemoryStream();
129
+ using var utf8JsonWriter = new Utf8JsonWriter(memoryStream, _jsonWriterOptions);
130
+
131
+ _fortunesSerializer.Serialize(utf8JsonWriter, fortunes);
132
+
133
+ byte[] byteArray = memoryStream.ToArray();
134
+ *length = (int)utf8JsonWriter.BytesCommitted;
135
+ */
136
+
137
+ GCHandle handle = GCHandle . Alloc ( byteArray , GCHandleType . Pinned ) ;
138
+ IntPtr byteArrayPointer = handle . AddrOfPinnedObject ( ) ;
139
+ * handlePointer = GCHandle . ToIntPtr ( handle ) ;
140
+
141
+ return byteArrayPointer ;
142
+ }
84
143
85
144
[ UnmanagedCallersOnly ( EntryPoint = "Query" ) ]
86
145
public static unsafe IntPtr Query ( int queries , int * length , IntPtr * handlePointer )
0 commit comments