Tuesday, March 24, 2009
Linux - Receiving daemon messages in your Mail Client Inbox
1. Download Mozilla Thunderbird on your Linux box.(The package will have a name like thunderbird.tar.gz)
2. Unzip the package using the following commands:
gunzip thunderbird.tar.gz
tar -xvf thunderbird.tar
3. Move thunderbird directory to the /opt directory.
4. Goto the /opt directory and run the application
cd /opt
./thunderbird
5. Follow the account setup instructions as shown:
(assuming you are root on the machine free.scoobydoo)
6. Click Finish and we are all set to go. The daemon messages from now onwards will be available in your inbox. Thunderbird will retrieve them from the system mbox, whenever it is started.
QSqlDatabase closing problem while using QSqlTableModel with QTableView
Problem:
I was working on a application that deals with multiple databases when I encountered a problem while closing a connection. Even if I close the connection it seemed to be active and hence was not letting itself to be copied.
The code I used typically was :
QSqlDatabase db(Conn);
....................................
....................................
....................................
db.close();
The copying problem caused due to the connection remaining active got solved after enclosing the queries in proper scope. eg.
{
QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// Both "db" and "query" are destroyed because they are out of scope
QSqlDatabase::removeDatabase("sales"); // correct
But the problem reappeared, after I implemented a QTableView with a QSqlTableModel:
QSqlTableModel *model =new QSqlTableModel(this, Conn) ;
model->setTable("student");
model->setFilter("student_id=" +QString::number(Cmn_Global::student_id ));
model->setSort(3, Qt::AscendingOrder);
model->setEditStrategy(QSqlTableModel:: OnFieldChange);
model->select();
............................
...........................
ui.tableView->setModel(model);//view is the QTableView object
Calling db.close() failed to close the connection as the real time querying between the Model and the View, which was not possible for me to enclose within scope.
Solution:
The only solution that emerged was to kill the connection manually, by deleting the QSqlTableModel pointer related to the view using the following code:
QSqlTableModel* model= dynamic_cast
And then calling the close method on the database.
The database can then be smoothly copied as the connection was no more active.
Wednesday, March 4, 2009
Word Wrap Code
Signature : QString wordWrap(const QString &str, int wrapLength)
Argument : 1. The QString to be wrapped
2. The permissible number of characters per line.
Return Value: The wrapped QString
QString wordWrap(const QString &str, int wrapLength)
{
QString tempStr= str;
int len = str.length(), pos= (wrapLength>1)?wrapLength -1:1;
while(pos < len-1){
int tempPos=pos;
while(tempStr.at(tempPos)!=' ' && tempPos > 0){
tempPos--;
}
if(tempPos > 0)pos=tempPos;
tempStr.replace(pos,1,'\n');
pos+=pos;
}
return tempStr;
Directory Copy code
Signature : void copyDir(QString, QString)
Argument : 1. Path of the source directory
2. Path of the destination directory (if the destination does not exist, it is created automatically)
Return Value: void
void copyDir(QString src, QString dest)
{
//Check whether the dir directory exists
if(QDir(src).exists()){
if(!QDir(dest).exists()){
QDir().mkpath(dest);
}
//Construct an iterator to get the entries in the directory
QDirIterator dirIterator(src);
while (dirIterator.hasNext()) {
QString item= dirIterator.next(), fileName= dirIterator.fileName();
QFileInfo fileInfo= dirIterator.fileInfo();
if(fileName!="." && fileName!=".."){
//If entry is a file copy it
if(fileInfo.isFile()){
QFile::copy(item, dest+"/"+ fileName);
}
//If entry is a directory, call the deltree function over it again to traverse it
else
copy(item, dest+ "/"+ fileName);
}
}
}else return;
}
Monday, March 2, 2009
Directory Tree Deletion Code (rmdir or rm -f equivalent)
Signature : bool delTree(QString)
Argument : Path of the directory to be deleted as QString
Return Value: true on success/false on error
bool delTree(QString dir)
{
//Check whether the dir directory exists
if(QDir(dir).exists()){
//Construct an iterator to get the entries in the directory
QDirIterator dirIterator(dir);
while (dirIterator.hasNext()) {
//Get the file information
QString item= dirIterator.next(), fileName= dirIterator.fileName();
QFileInfo fileInfo= dirIterator.fileInfo();
//If entry is a file delete it
if(fileName!="." && fileName!=".."){
if(fileInfo.isFile()){
QFile::remove(item);
}
//If entry is a directory, call the deltree function over it again to traverse it
else if(fileInfo.isDir()){
delTree(item);
}
}
}
}else
return false;
//Move up the directory hierarchy by one level
//Delete the current directory
QDir currentDir(dir);
currentDir.cdUp();
return currentDir.rmdir(dir);
}