@@ -16,7 +16,13 @@ public function run()
1616 $ saved = false ;
1717 $ config_text = '' ;
1818 $ errors = [];
19- if ($ mode === 'update_settings ' )
19+
20+ if ($ mode === 'test_db_connection ' )
21+ {
22+ $ this ->test_db_connection ();
23+ return ;
24+ }
25+ else if ($ mode === 'update_settings ' )
2026 {
2127 $ qi_config = @utf8_normalize_nfc (qi_request_var ('qi_config ' , array ('' => '' ), true ));
2228
@@ -147,4 +153,79 @@ public function run()
147153
148154 qi::page_display ('settings_body ' );
149155 }
156+
157+ private function test_db_connection ()
158+ {
159+ header ('Content-Type: application/json ' );
160+
161+ $ dbms = qi_request_var ('dbms ' , '' );
162+ $ dbhost = qi_request_var ('dbhost ' , '' );
163+ $ dbport = qi_request_var ('dbport ' , '' );
164+ $ dbuser = qi_request_var ('dbuser ' , '' );
165+ $ dbpasswd = qi_request_var ('dbpasswd ' , '' );
166+
167+ if (empty ($ dbms ))
168+ {
169+ echo json_encode (['success ' => false , 'message ' => qi::lang ('DB_TEST_TYPE_REQUIRED ' )]);
170+ return ;
171+ }
172+
173+ // SQLite doesn't use server connections, just test if extension is available
174+ if (in_array ($ dbms , ['sqlite ' , 'sqlite3 ' ]))
175+ {
176+ try
177+ {
178+ if ($ dbms === 'sqlite3 ' )
179+ {
180+ new \SQLite3 (':memory: ' );
181+ echo json_encode (['success ' => true , 'message ' => qi::lang ('DB_TEST_SQLITE3_AVAILABLE ' )]);
182+ }
183+ else
184+ {
185+ $ error = null ;
186+ @sqlite_open (':memory: ' , 0666 , $ error );
187+ echo json_encode (['success ' => true , 'message ' => qi::lang ('DB_TEST_SQLITE_AVAILABLE ' )]);
188+ }
189+ }
190+ catch (Exception $ e )
191+ {
192+ echo json_encode (['success ' => false , 'message ' => qi::lang ('DB_TEST_SQLITE_NOT_AVAILABLE ' )]);
193+ }
194+ return ;
195+ }
196+
197+ if (empty ($ dbhost ))
198+ {
199+ echo json_encode (['success ' => false , 'message ' => qi::lang ('DB_TEST_HOST_REQUIRED ' )]);
200+ return ;
201+ }
202+
203+ // we need to capture trigger_error() calls to be able to continue
204+ set_error_handler (function () {
205+ return true ;
206+ });
207+
208+ try
209+ {
210+ $ db_data = [$ dbms , $ dbhost , $ dbuser , $ dbpasswd , $ dbport , '' ];
211+ $ db = db_connect ($ db_data );
212+
213+ if ($ db && $ db ->db_connect_id )
214+ {
215+ $ db ->sql_close ();
216+ restore_error_handler ();
217+ echo json_encode (['success ' => true , 'message ' => qi::lang ('DB_TEST_CONNECTION_SUCCESS ' )]);
218+ }
219+ else
220+ {
221+ restore_error_handler ();
222+ echo json_encode (['success ' => false , 'message ' => qi::lang ('DB_TEST_CONNECTION_FAILED ' )]);
223+ }
224+ }
225+ catch (Exception $ e )
226+ {
227+ restore_error_handler ();
228+ echo json_encode (['success ' => false , 'message ' => qi::lang ('DB_TEST_CONNECTION_FAILED ' )]);
229+ }
230+ }
150231}
0 commit comments