@@ -115,3 +115,80 @@ TEST_CASE("handles binds and blobs", "[Sqlite]") {
115
115
for (int i = 0 ; i < byteLen; ++i) REQUIRE (blob2[i] == (0xff ^ (i & 0xff )));
116
116
CHECK (select .step () == true );
117
117
}
118
+
119
+
120
+ TEST_CASE (" handles binds and blobs uri" , " [Sqlite]" ) {
121
+ TempDir tempDir;
122
+ CaptureLog log ;
123
+ Sqlite sqlite (log );
124
+ auto dbPath = " file:" +tempDir.path + " /db.sqlite?foo=bar" ;
125
+ sqlite.open (dbPath, false );
126
+
127
+ REQUIRE (sqlite.prepare (" create table t(offset integer, data blob)" ).step () == true );
128
+ auto inserter = sqlite.prepare (" insert into t values(:id, :data)" );
129
+ inserter.bindInt64 (" :id" , 1234 );
130
+ constexpr auto byteLen = 1024 ;
131
+ char bytes[byteLen];
132
+ for (int i = 0 ; i < byteLen; ++i) bytes[i] = i & 0xff ;
133
+ inserter.bindBlob (" :data" , bytes, byteLen);
134
+ CHECK (inserter.step () == true );
135
+ inserter.reset ();
136
+ inserter.bindInt64 (" :id" , 5678 );
137
+ for (int i = 0 ; i < byteLen; ++i) bytes[i] = (i & 0xff ) ^ 0xff ;
138
+ inserter.bindBlob (" :data" , bytes, byteLen);
139
+ CHECK (inserter.step () == true );
140
+
141
+ auto select = sqlite.prepare (" select * from t order by offset" );
142
+ CHECK (select .columnCount () == 2 );
143
+ CHECK (select .step () == false );
144
+ CHECK (select .columnName (0 ) == " offset" );
145
+ CHECK (select .columnName (1 ) == " data" );
146
+ CHECK (select .columnInt64 (0 ) == 1234 );
147
+ auto blob1 = select .columnBlob (1 );
148
+ REQUIRE (blob1.size () == byteLen);
149
+ for (int i = 0 ; i < byteLen; ++i) REQUIRE (blob1[i] == (i & 0xff ));
150
+ CHECK (select .step () == false );
151
+ CHECK (select .columnInt64 (0 ) == 5678 );
152
+ auto blob2 = select .columnBlob (1 );
153
+ REQUIRE (blob2.size () == byteLen);
154
+ for (int i = 0 ; i < byteLen; ++i) REQUIRE (blob2[i] == (0xff ^ (i & 0xff )));
155
+ CHECK (select .step () == true );
156
+ }
157
+
158
+ TEST_CASE (" uri convert to file" , " [Sqlite]" ) {
159
+ TempDir tempDir;
160
+ CaptureLog log ;
161
+ Sqlite sqlite (log );
162
+
163
+ // file:data.db Open the file "data.db" in the current directory.
164
+ REQUIRE (sqlite.toFile (" file:data.db" ) == " data.db" );
165
+
166
+ // file:/home/fred/data.db
167
+ // file:///home/fred/data.db
168
+ // file://localhost/home/fred/data.db Open the database file "/home/fred/data.db".
169
+ REQUIRE (sqlite.toFile (" file:/home/fred/data.db" ) == " /home/fred/data.db" );
170
+ REQUIRE (sqlite.toFile (" file:///home/fred/data.db" ) == " /home/fred/data.db" );
171
+ REQUIRE (sqlite.toFile (" file://localhost/home/fred/data.db" ) == " /home/fred/data.db" );
172
+ //
173
+ //
174
+ // file://darkstar/home/fred/data.db An error. "darkstar" is not a recognized authority.
175
+ // let sqlite handle
176
+ REQUIRE (sqlite.toFile (" file://darkstar/home/fred/data.db" ) == " /home/fred/data.db" );
177
+ //
178
+ // file:///C:/Documents%20and%20Settings/fred/Desktop/data.db Windows only: Open the file "data.db" on fred's desktop on drive C:. Note that the %20 escaping in this example is not strictly necessary - space characters can be used literally in URI filenames.
179
+ // REQUIRE(sqlite.toFile("file:///C:/Documents%20and%20Settings/fred/Desktop/data.db") == "/home/fred/data.db");
180
+ //
181
+ // file:data.db?mode=ro&cache=private Open file "data.db" in the current directory for read-only access. Regardless of whether or not shared-cache mode is enabled by default, use a private cache.
182
+ REQUIRE (sqlite.toFile (" file:data.db?mode=ro&cache=private" ) == " data.db" );
183
+
184
+ REQUIRE (sqlite.toFile (" file:/home/fred/foo/bar/data.db?mode=ro&cache=private" ) == " /home/fred/foo/bar/data.db" );
185
+ //
186
+ // file:/home/fred/data.db?vfs=unix-dotfile Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" that uses dot-files in place of posix advisory locking.
187
+ REQUIRE (sqlite.toFile (" file:/home/fred/data.db?vfs=unix-dotfile" ) == " /home/fred/data.db" );
188
+ // file:data.db?mode=readonly An error. "readonly" is not a valid option for the "mode" parameter. Use "ro" instead: "file:data.db?mode=ro".
189
+ REQUIRE (sqlite.toFile (" file:data.db?mode=readonly" ) == " data.db" );
190
+
191
+
192
+ REQUIRE_THROWS (sqlite.toFile (" http://data.db?mode=readonly" ));
193
+
194
+ }
0 commit comments