1251876Speter/* Licensed to the Apache Software Foundation (ASF) under one or more
2251876Speter * contributor license agreements.  See the NOTICE file distributed with
3251876Speter * this work for additional information regarding copyright ownership.
4251876Speter * The ASF licenses this file to You under the Apache License, Version 2.0
5251876Speter * (the "License"); you may not use this file except in compliance with
6251876Speter * the License.  You may obtain a copy of the License at
7251876Speter *
8251876Speter *     http://www.apache.org/licenses/LICENSE-2.0
9251876Speter *
10251876Speter * Unless required by applicable law or agreed to in writing, software
11251876Speter * distributed under the License is distributed on an "AS IS" BASIS,
12251876Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251876Speter * See the License for the specific language governing permissions and
14251876Speter * limitations under the License.
15251876Speter */
16251876Speter
17251876Speter#include "testutil.h"
18251876Speter#include "apr.h"
19251876Speter#include "apu.h"
20251876Speter#include "apr_pools.h"
21251876Speter#include "apr_dbd.h"
22251876Speter#include "apr_strings.h"
23251876Speter
24251876Speterstatic void test_dbd_init(abts_case *tc, void *data)
25251876Speter{
26251876Speter    apr_pool_t *pool = p;
27251876Speter    apr_status_t rv;
28251876Speter
29251876Speter    rv = apr_dbd_init(pool);
30251876Speter    ABTS_ASSERT(tc, "failed to init apr_dbd", rv == APR_SUCCESS);
31251876Speter}
32251876Speter
33251876Speter#if APU_HAVE_SQLITE2 || APU_HAVE_SQLITE3
34251876Speterstatic void test_statement(abts_case *tc, apr_dbd_t* handle,
35251876Speter                           const apr_dbd_driver_t* driver, const char* sql)
36251876Speter{
37251876Speter    int nrows;
38251876Speter    apr_status_t rv;
39251876Speter
40251876Speter    rv = apr_dbd_query(driver, handle, &nrows, sql);
41251876Speter
42251876Speter    ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
43251876Speter}
44251876Speter
45251876Speterstatic void create_table(abts_case *tc, apr_dbd_t* handle,
46251876Speter                         const apr_dbd_driver_t* driver)
47251876Speter{
48251876Speter    const char *sql = "CREATE TABLE apr_dbd_test ("
49251876Speter                             "col1 varchar(40) not null,"
50251876Speter                             "col2 varchar(40),"
51251876Speter                             "col3 integer)";
52251876Speter
53251876Speter    test_statement(tc, handle, driver, sql);
54251876Speter}
55251876Speter
56251876Speterstatic void drop_table(abts_case *tc, apr_dbd_t* handle,
57251876Speter                       const apr_dbd_driver_t* driver)
58251876Speter{
59251876Speter    const char *sql = "DROP TABLE apr_dbd_test";
60251876Speter    test_statement(tc, handle, driver, sql);
61251876Speter}
62251876Speter
63251876Speterstatic void delete_rows(abts_case *tc, apr_dbd_t* handle,
64251876Speter                        const apr_dbd_driver_t* driver)
65251876Speter{
66251876Speter    const char *sql = "DELETE FROM apr_dbd_test";
67251876Speter    test_statement(tc, handle, driver, sql);
68251876Speter}
69251876Speter
70251876Speter
71251876Speterstatic void insert_data(abts_case *tc, apr_dbd_t* handle,
72251876Speter                        const apr_dbd_driver_t* driver, int count)
73251876Speter{
74251876Speter    apr_pool_t* pool = p;
75251876Speter    const char* sql = "INSERT INTO apr_dbd_test VALUES('%d', '%d', %d)";
76251876Speter    char* sqf = NULL;
77251876Speter    int i;
78251876Speter    int nrows;
79251876Speter    apr_status_t rv;
80251876Speter
81251876Speter    for (i=0; i<count; i++) {
82251876Speter        sqf = apr_psprintf(pool, sql, i, i, i);
83251876Speter        rv = apr_dbd_query(driver, handle, &nrows, sqf);
84251876Speter        ABTS_ASSERT(tc, sqf, rv == APR_SUCCESS);
85251876Speter        ABTS_ASSERT(tc, sqf, 1 == nrows);
86251876Speter    }
87251876Speter}
88251876Speter
89251876Speterstatic void select_rows(abts_case *tc, apr_dbd_t* handle,
90251876Speter                        const apr_dbd_driver_t* driver, int count)
91251876Speter{
92251876Speter    apr_status_t rv;
93251876Speter    apr_pool_t* pool = p;
94251876Speter    apr_pool_t* tpool;
95251876Speter    const char* sql = "SELECT * FROM apr_dbd_test ORDER BY col1";
96251876Speter    apr_dbd_results_t *res = NULL;
97251876Speter    apr_dbd_row_t *row = NULL;
98251876Speter    int i;
99251876Speter
100251876Speter    rv = apr_dbd_select(driver, pool, handle, &res, sql, 0);
101251876Speter    ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
102251876Speter    ABTS_PTR_NOTNULL(tc, res);
103251876Speter
104251876Speter    apr_pool_create(&tpool, pool);
105251876Speter    i = count;
106251876Speter    while (i > 0) {
107251876Speter        row = NULL;
108251876Speter        rv = apr_dbd_get_row(driver, pool, res, &row, -1);
109251876Speter        ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
110251876Speter        ABTS_PTR_NOTNULL(tc, row);
111251876Speter        apr_pool_clear(tpool);
112251876Speter        i--;
113251876Speter    }
114251876Speter    ABTS_ASSERT(tc, "Missing Rows!", i == 0);
115251876Speter
116251876Speter    res = NULL;
117251876Speter    i = count;
118251876Speter
119251876Speter    rv = apr_dbd_select(driver, pool, handle, &res, sql, 1);
120251876Speter    ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
121251876Speter    ABTS_PTR_NOTNULL(tc, res);
122251876Speter
123251876Speter    rv = apr_dbd_num_tuples(driver, res);
124251876Speter    ABTS_ASSERT(tc, "invalid row count", rv == count);
125251876Speter
126251876Speter    while (i > 0) {
127251876Speter        row = NULL;
128251876Speter        rv = apr_dbd_get_row(driver, pool, res, &row, i);
129251876Speter        ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
130251876Speter        ABTS_PTR_NOTNULL(tc, row);
131251876Speter        apr_pool_clear(tpool);
132251876Speter        i--;
133251876Speter    }
134251876Speter    ABTS_ASSERT(tc, "Missing Rows!", i == 0);
135251876Speter    rv = apr_dbd_get_row(driver, pool, res, &row, count+100);
136251876Speter    ABTS_ASSERT(tc, "If we overseek, get_row should return -1", rv == -1);
137251876Speter}
138251876Speter
139251876Speterstatic void test_escape(abts_case *tc, apr_dbd_t *handle,
140251876Speter                        const apr_dbd_driver_t *driver)
141251876Speter{
142251876Speter  const char *escaped = apr_dbd_escape(driver, p, "foo'bar", handle);
143251876Speter
144251876Speter  ABTS_STR_EQUAL(tc, "foo''bar", escaped);
145251876Speter}
146251876Speter
147251876Speterstatic void test_dbd_generic(abts_case *tc, apr_dbd_t* handle,
148251876Speter                             const apr_dbd_driver_t* driver)
149251876Speter{
150251876Speter    void* native;
151251876Speter    apr_pool_t *pool = p;
152251876Speter    apr_status_t rv;
153251876Speter
154251876Speter    native = apr_dbd_native_handle(driver, handle);
155251876Speter    ABTS_PTR_NOTNULL(tc, native);
156251876Speter
157251876Speter    rv = apr_dbd_check_conn(driver, pool, handle);
158251876Speter
159251876Speter    create_table(tc, handle, driver);
160251876Speter    select_rows(tc, handle, driver, 0);
161251876Speter    insert_data(tc, handle, driver, 5);
162251876Speter    select_rows(tc, handle, driver, 5);
163251876Speter    delete_rows(tc, handle, driver);
164251876Speter    select_rows(tc, handle, driver, 0);
165251876Speter    drop_table(tc, handle, driver);
166251876Speter
167251876Speter    test_escape(tc, handle, driver);
168251876Speter
169251876Speter    rv = apr_dbd_close(driver, handle);
170251876Speter    ABTS_ASSERT(tc, "failed to close database", rv == APR_SUCCESS);
171251876Speter}
172251876Speter#endif
173251876Speter
174251876Speter#if APU_HAVE_SQLITE2
175251876Speterstatic void test_dbd_sqlite2(abts_case *tc, void *data)
176251876Speter{
177251876Speter    apr_pool_t *pool = p;
178251876Speter    apr_status_t rv;
179251876Speter    const apr_dbd_driver_t* driver = NULL;
180251876Speter    apr_dbd_t* handle = NULL;
181251876Speter
182251876Speter    rv = apr_dbd_get_driver(pool, "sqlite2", &driver);
183251876Speter    ABTS_ASSERT(tc, "failed to fetch sqlite2 driver", rv == APR_SUCCESS);
184251876Speter    ABTS_PTR_NOTNULL(tc, driver);
185251876Speter    if (!driver) {
186251876Speter    	return;
187251876Speter    }
188251876Speter
189251876Speter    ABTS_STR_EQUAL(tc, "sqlite2", apr_dbd_name(driver));
190251876Speter
191251876Speter    rv = apr_dbd_open(driver, pool, "data/sqlite2.db:600", &handle);
192251876Speter    ABTS_ASSERT(tc, "failed to open sqlite2 atabase", rv == APR_SUCCESS);
193251876Speter    ABTS_PTR_NOTNULL(tc, handle);
194251876Speter    if (!handle) {
195251876Speter    	return;
196251876Speter    }
197251876Speter
198251876Speter    test_dbd_generic(tc, handle, driver);
199251876Speter}
200251876Speter#endif
201251876Speter
202251876Speter#if APU_HAVE_SQLITE3
203251876Speterstatic void test_dbd_sqlite3(abts_case *tc, void *data)
204251876Speter{
205251876Speter    apr_pool_t *pool = p;
206251876Speter    apr_status_t rv;
207251876Speter    const apr_dbd_driver_t* driver = NULL;
208251876Speter    apr_dbd_t* handle = NULL;
209251876Speter
210251876Speter    rv = apr_dbd_get_driver(pool, "sqlite3", &driver);
211251876Speter    ABTS_ASSERT(tc, "failed to fetch sqlite3 driver", rv == APR_SUCCESS);
212251876Speter    ABTS_PTR_NOTNULL(tc, driver);
213251876Speter    if (!driver) {
214251876Speter    	return;
215251876Speter    }
216251876Speter
217251876Speter    ABTS_STR_EQUAL(tc, "sqlite3", apr_dbd_name(driver));
218251876Speter
219251876Speter    rv = apr_dbd_open(driver, pool, "data/sqlite3.db", &handle);
220251876Speter    ABTS_ASSERT(tc, "failed to open sqlite3 database", rv == APR_SUCCESS);
221251876Speter    ABTS_PTR_NOTNULL(tc, handle);
222251876Speter    if (!handle) {
223251876Speter    	return;
224251876Speter    }
225251876Speter
226251876Speter    test_dbd_generic(tc, handle, driver);
227251876Speter}
228251876Speter#endif
229251876Speter
230251876Speterabts_suite *testdbd(abts_suite *suite)
231251876Speter{
232251876Speter    suite = ADD_SUITE(suite);
233251876Speter
234251876Speter
235251876Speter    abts_run_test(suite, test_dbd_init, NULL);
236251876Speter
237251876Speter#if APU_HAVE_SQLITE2
238251876Speter    abts_run_test(suite, test_dbd_sqlite2, NULL);
239251876Speter#endif
240251876Speter
241251876Speter#if APU_HAVE_SQLITE3
242251876Speter    abts_run_test(suite, test_dbd_sqlite3, NULL);
243251876Speter#endif
244251876Speter    return suite;
245251876Speter}
246