kexi

simplecommandlineapp.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2006 Jaroslaw Staniek <js@iidea.pl>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "simplecommandlineapp.h"
21
22#include <tqfileinfo.h>
23
24#include <tdecmdlineargs.h>
25#include <kdebug.h>
26
27#include <kexidb/connectiondata.h>
28#include <kexidb/drivermanager.h>
29
30using namespace KexiDB;
31
32static TDECmdLineOptions predefinedOptions[] =
33{
34 { "drv", 0, 0 },
35 { "driver <name>", I18N_NOOP("Database driver name"), 0 },
36 { "u", 0, 0 },
37 { "user <name>", I18N_NOOP("Database user name"), 0 },
38 { "p", 0, 0 },
39 { "password", I18N_NOOP("Prompt for password"), 0 },
40 { "h", 0, 0 },
41 { "host <name>", I18N_NOOP("Host (server) name"), 0 },
42 { "port <number>", I18N_NOOP("Server's port number"), 0 },
43 { "s", 0, 0 },
44 { "local-socket <filename>", I18N_NOOP("Server's local socket filename"), 0 },
45 TDECmdLineLastOption
46};
47
48//-----------------------------------------
49
51class SimpleCommandLineApp::Private
52{
53public:
54 Private()
55 : conn(0)
56 {}
57 ~Private()
58 {
59 if (conn) {
60 conn->disconnect();
61 delete (Connection*)conn;
62 }
63 delete instance;
64
65 for (TDECmdLineOptions *optionsPtr = allOptions; optionsPtr->name; optionsPtr++) {
66 delete optionsPtr->name;
67 delete optionsPtr->description;
68 delete optionsPtr->def;
69 }
70 delete allOptions;
71 }
72
73 KexiDB::DriverManager manager;
74 TDECmdLineOptions *allOptions;
75 TDEInstance* instance;
76 ConnectionData connData;
77 TQGuardedPtr<Connection> conn;
78};
79
80//-----------------------------------------
81
83 int argc, char** argv, TDECmdLineOptions *options,
84 const char *programName, const char *version,
85 const char *shortDescription, int licenseType,
86 const char *copyrightStatement, const char *text,
87 const char *homePageAddress, const char *bugsEmailAddress)
88 : Object()
89 , d( new Private() )
90{
91 TQFileInfo fi(argv[0]);
92 TQCString appName( fi.baseName().latin1() );
93 TDECmdLineArgs::init(argc, argv,
94 new TDEAboutData( appName, programName,
95 version, shortDescription, licenseType, copyrightStatement, text,
96 homePageAddress, bugsEmailAddress));
97
98 int predefinedOptionsCount = 0;
99 for (TDECmdLineOptions *optionsPtr = predefinedOptions; optionsPtr->name; optionsPtr++, predefinedOptionsCount++)
100 ;
101 int userOptionsCount = 0;
102 for (TDECmdLineOptions *optionsPtr = options; optionsPtr->name; optionsPtr++, userOptionsCount++)
103 ;
104
105 d->instance = new TDEInstance(appName);
106
107 // join the predefined options and user options
108 d->allOptions = new TDECmdLineOptions[predefinedOptionsCount + userOptionsCount + 1];
109 TDECmdLineOptions *allOptionsPtr = d->allOptions;
110 for (TDECmdLineOptions *optionsPtr = predefinedOptions; optionsPtr->name; optionsPtr++, allOptionsPtr++) {
111 allOptionsPtr->name = tqstrdup(optionsPtr->name);
112 allOptionsPtr->description = tqstrdup(optionsPtr->description);
113 if (optionsPtr == predefinedOptions) //first row == drv
114 allOptionsPtr->def = tqstrdup(KexiDB::Driver::defaultFileBasedDriverName().latin1());
115 else
116 allOptionsPtr->def = tqstrdup(optionsPtr->def);
117 }
118 for (TDECmdLineOptions *optionsPtr = options; optionsPtr->name; optionsPtr++, allOptionsPtr++) {
119 allOptionsPtr->name = tqstrdup(optionsPtr->name);
120 allOptionsPtr->description = tqstrdup(optionsPtr->description);
121 allOptionsPtr->def = tqstrdup(optionsPtr->def);
122 }
123 allOptionsPtr->name = 0; //end
124 allOptionsPtr->description = 0;
125 allOptionsPtr->def = 0;
126 TDECmdLineArgs::addCmdLineOptions( d->allOptions );
127
128 TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
129
130 d->connData.driverName = args->getOption("driver");
131 d->connData.userName = args->getOption("user");
132 d->connData.hostName = args->getOption("host");
133 d->connData.localSocketFileName = args->getOption("local-socket");
134 d->connData.port = args->getOption("port").toInt();
135 d->connData.useLocalSocketFile = args->isSet("local-socket");
136
137 if (args->isSet("password")) {
138 TQString userAtHost = d->connData.userName;
139 if (!d->connData.userName.isEmpty())
140 userAtHost += "@";
141 userAtHost += (d->connData.hostName.isEmpty() ? "localhost" : d->connData.hostName);
142 TQTextStream cout(stdout,IO_WriteOnly);
143 cout << i18n("Enter password for %1: ").arg(userAtHost);
145 TQTextStream cin(stdin,IO_ReadOnly);
146 cin >> d->connData.password;
147 KexiDBDbg << d->connData.password << endl;
148 }
149}
150
151SimpleCommandLineApp::~SimpleCommandLineApp()
152{
154 delete d;
155}
156
157bool SimpleCommandLineApp::openDatabase(const TQString& databaseName)
158{
159 if (!d->conn) {
160 if (d->manager.error()) {
161 setError(&d->manager);
162 return false;
163 }
164
165 //get the driver
166 KexiDB::Driver *driver = d->manager.driver(d->connData.driverName);
167 if (!driver || d->manager.error()) {
168 setError(&d->manager);
169 return false;
170 }
171
172 if (driver->isFileDriver())
173 d->connData.setFileName( databaseName );
174
175 d->conn = driver->createConnection(d->connData);
176 if (!d->conn || driver->error()) {
177 setError(driver);
178 return false;
179 }
180 }
181 if (d->conn->isConnected()) {
182 // db already opened
183 if (d->conn->isDatabaseUsed() && d->conn->currentDatabase()==databaseName) //the same: do nothing
184 return true;
185 if (!closeDatabase()) // differs: close the first
186 return false;
187 }
188 if (!d->conn->connect()) {
189 setError(d->conn);
190 delete d->conn;
191 d->conn = 0;
192 return false;
193 }
194
195 if (!d->conn->useDatabase( databaseName )) {
196 setError(d->conn);
197 delete d->conn;
198 d->conn = 0;
199 return false;
200 }
201 return true;
202}
203
205{
206 if (!d->conn)
207 return true;
208 if (!d->conn->disconnect()) {
209 setError(d->conn);
210 return false;
211 }
212 return true;
213}
214
216{
217 return d->instance;
218}
219
221{
222 return &d->connData;
223}
224
226{
227 return d->conn;
228}
Database specific connection data, e.g. host, port.
Provides database connection, allowing queries and data modification.
Definition connection.h:62
Generic database abstraction.
Definition driver.h:67
static TQString defaultFileBasedDriverName()
Definition driver.cpp:140
bool isFileDriver() const
Definition driver.cpp:149
Connection * createConnection(ConnectionData &conn_data, int options=0)
Definition driver.cpp:178
bool error() const
Definition object.h:38
virtual void setError(int code=ERR_OTHER, const TQString &msg=TQString())
Definition object.cpp:53
bool openDatabase(const TQString &databaseName)
KexiDB::ConnectionData * connectionData() const
KexiDB::Connection * connection() const
SimpleCommandLineApp(int argc, char **argv, TDECmdLineOptions *options, const char *programName, const char *version, const char *shortDescription=0, int licenseType=TDEAboutData::License_Unknown, const char *copyrightStatement=0, const char *text=0, const char *homePageAddress=0, const char *bugsEmailAddress="submit@bugs.kde.org")
High-level database connectivity library with database backend drivers.
KEXI_DB_EXPORT DatabaseVersionInfo version()
Definition global.cpp:55