Arquivos
hhvm/hphp/test/test_ext_sqlite3.cpp
T
Edwin Smith 494733bd31 Remove Array::operator[](litstr)
Refactor the remaining uses of litstr-indexed Array, and
get rid of the operator overload.
2013-05-10 10:54:37 -07:00

138 linhas
4.8 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#include <test/test_ext_sqlite3.h>
#include <runtime/ext/ext_sqlite3.h>
#include <runtime/ext/ext_file.h>
///////////////////////////////////////////////////////////////////////////////
bool TestExtSqlite3::RunTests(const std::string &which) {
bool ret = true;
DECLARE_TEST_FUNCTIONS("function lower($a) {"
" return strtolower($a);"
"}"
"function sumlen_step($a,$b,$c) {"
" return (int)$a + strlen($c);"
"}"
"function sumlen_fini($a) {"
" return (int)$a;"
"}");
RUN_TEST(test_sqlite3);
RUN_TEST(test_sqlite3stmt);
RUN_TEST(test_sqlite3result);
return ret;
}
///////////////////////////////////////////////////////////////////////////////
bool TestExtSqlite3::test_sqlite3() {
p_SQLite3 db(NEWOBJ(c_SQLite3)());
db->t_open(":memory:test");
db->t_exec("DROP TABLE IF EXISTS foo");
db->t_exec("CREATE TABLE foo (bar STRING)");
db->t_exec("INSERT INTO foo VALUES ('ABC')");
db->t_exec("INSERT INTO foo VALUES ('DEF')");
VS(db->t_lastinsertrowid(), 2);
VS(db->t_changes(), 1);
VS(db->t_lasterrorcode(), 0);
VS(db->t_lasterrormsg(), "not an error");
VS(db->t_escapestring("'\""), "''\"");
VS(db->t_querysingle("SELECT * FROM foo"), "ABC");
VS(db->t_querysingle("SELECT * FROM foo", true), CREATE_MAP1("bar", "ABC"));
// testing query() and SQLite3Result
{
Object objResult = db->t_query("SELECT * FROM foo").toObject();
c_SQLite3Result *res = objResult.getTyped<c_SQLite3Result>();
VS(res->t_fetcharray(), CREATE_MAP2(0, "ABC", "bar", "ABC"));
VS(res->t_numcolumns(), 1);
VS(res->t_columnname(0), "bar");
VS(res->t_columntype(0), k_SQLITE3_TEXT);
VS(res->t_fetcharray(k_SQLITE3_NUM), CREATE_VECTOR1("DEF"));
}
// testing prepare() and sqlite3stmt
{
Object objStmt = db->t_prepare("SELECT * FROM foo WHERE bar = :id");
c_SQLite3Stmt *stmt = objStmt.getTyped<c_SQLite3Stmt>();
VS(stmt->t_paramcount(), 1);
Variant id = "DEF";
VERIFY(stmt->t_bindvalue(":id", id, SQLITE3_TEXT));
id = "ABC";
{
Object objResult = stmt->t_execute();
c_SQLite3Result *res = objResult.getTyped<c_SQLite3Result>();
VS(res->t_fetcharray(k_SQLITE3_NUM), CREATE_VECTOR1("DEF"));
}
VERIFY(stmt->t_clear());
VERIFY(stmt->t_reset());
id = "DEF";
VERIFY(stmt->t_bindparam(":id", ref(id), SQLITE3_TEXT));
id = "ABC";
{
Object objResult = stmt->t_execute();
c_SQLite3Result *res = objResult.getTyped<c_SQLite3Result>();
VS(res->t_fetcharray(k_SQLITE3_NUM), CREATE_VECTOR1("ABC"));
}
}
// testing UDF
{
VERIFY(db->t_createfunction("tolower", "lower", 1));
Object objResult = db->t_query("SELECT tolower(bar) FROM foo").toObject();
c_SQLite3Result *res = objResult.getTyped<c_SQLite3Result>();
VS(res->t_fetcharray(k_SQLITE3_NUM), CREATE_VECTOR1("abc"));
}
{
VERIFY(db->t_createaggregate("sumlen", "sumlen_step", "sumlen_fini", 1));
Object objResult = db->t_query("SELECT sumlen(bar) FROM foo").toObject();
c_SQLite3Result *res = objResult.getTyped<c_SQLite3Result>();
VS(res->t_fetcharray(k_SQLITE3_NUM), CREATE_VECTOR1(6));
}
db->t_close();
static const StaticString s_versionString("versionString");
static const StaticString s_versionNumber("versionNumber");
// Since minor version can change frequently, just test the major version
VS(db->t_version()[s_versionString][0], "3");
VERIFY((int64_t)db->t_version()[s_versionNumber] >
(int64_t)3000000);
f_unlink(":memory:test");
return Count(true);
}
bool TestExtSqlite3::test_sqlite3stmt() {
// tested in test_sqlite3()
return Count(true);
}
bool TestExtSqlite3::test_sqlite3result() {
// tested in test_sqlite3()
return Count(true);
}