32 #include <gtest/gtest.h>
35 #include <system_error>
48 using std::system_error;
49 using std::runtime_error;
50 using fs = scc::util::Filesystem;
55 struct SqliteTest :
public testing::Test
62 curdir = fs::get_current_dir();
65 fs::remove_all(
"sandbox", &err);
66 fs::create_dir(
"sandbox");
67 fs::change_dir(
"sandbox");
71 fs::change_dir(curdir);
73 fs::remove_all(
"sandbox", &err);
76 void reopen(
const string& uri)
78 cout <<
"opening: " << uri << endl;
83 TEST_F(SqliteTest, default_conn)
85 auto fs = fs::scan_dir(
".");
86 cout <<
"filesystem:" << endl;
89 cout << d.first <<
" " << d.second << endl;
91 ASSERT_EQ(fs.size(), 0);
94 TEST_F(SqliteTest, memory_conn)
96 reopen(
"file::memory:");
97 auto fs = fs::scan_dir(
".");
98 cout <<
"filesystem:" << endl;
101 cout << d.first <<
" " << d.second << endl;
103 ASSERT_EQ(fs.size(), 0);
106 TEST_F(SqliteTest, file_open)
108 reopen(
"file:dbfile?mode=rwc");
109 auto fs = fs::scan_dir(
".");
110 cout <<
"filesystem:" << endl;
113 cout << d.first <<
" " << d.second << endl;
115 ASSERT_EQ(fs.size(), 1);
117 ASSERT_EQ(fs::file_stat(
"dbfile", &err).type, scc::util::FileType::reg);
120 TEST_F(SqliteTest, exec_select)
125 <<
"create table t(a TEXT, b INT) STRICT;"
126 <<
"insert into t values('hello!', 1);"
127 <<
"insert into t values('goodbye', 2);"
128 <<
"select * from t;";
130 int r = req.exec_select();
133 cout <<
"first col name: " << req.col_name(0) << endl;
134 ASSERT_EQ(req.col_name(0),
"a");
137 cout <<
"second col name: " << n << endl;
140 ASSERT_EQ(req.col_text(0),
"hello!");
142 ASSERT_EQ(n,
"hello!");
144 ASSERT_EQ(req.col_int(1), 1);
146 ASSERT_EQ(req.next_row(), 2);
148 ASSERT_EQ(req.col_text(0),
"goodbye");
150 ASSERT_EQ(n,
"goodbye");
152 ASSERT_EQ(req.col_int(1), 2);
154 ASSERT_EQ(req.next_row(), 0);
156 ASSERT_EQ(req.exec_select(), 0);
159 TEST_F(SqliteTest, exec)
161 reopen(
"file:dbfile?mode=rwc");
167 cout <<
"big is " << big << endl;
170 <<
"create table t(a VARCHAR PRIMARY KEY, b DOUBLE, c INTEGER DEFAULT 0);"
171 <<
"insert into t (a, b) values('hello!', 1.1);"
172 <<
"insert into t values('goodbye', 2.2, " << big <<
");"
173 <<
"select * from t;"
174 <<
"insert into t (a, b) values('until we meet again', 3.3);";
179 req.sql() <<
"select b,c from t where a is 'goodbye';";
181 int r = req.exec_select();
183 ASSERT_EQ(req.col_real(0), 2.2);
184 ASSERT_EQ(req.col_int64(1), big);
187 TEST_F(SqliteTest, blob)
192 <<
"create table t(a BLOB) STRICT;"
193 <<
"insert into t values(x'deadbeef');"
194 <<
"select * from t;";
196 int r = req.exec_select();
199 vector<char> t = {
'\xde',
'\xad',
'\xbe',
'\xef'}, v;
204 TEST_F(SqliteTest, two_conns_xact)
206 reopen(
"file:dbfile?mode=rwc");
210 r.sql() <<
"create table t(a ANY) STRICT;";
215 ASSERT_FALSE(x.is_active());
218 ASSERT_TRUE(x.is_active());
220 r.sql() <<
"insert into t values(12345);";
223 Conn db2(
"file:dbfile?mode=ro");
227 r2.sql() <<
"select * from t;";
229 ASSERT_EQ(r2.exec_select(), 0);
235 ASSERT_EQ(r2.exec_select(), 1);
239 r.sql() <<
"insert into t values(45678);";
244 r.sql() <<
"select * from t where a is 45678;";
245 ASSERT_EQ(r.exec_select(), 0);
249 r2.sql() <<
"insert into t values(45678);";
250 ASSERT_THROW(r2.exec(), runtime_error);