Main Page   Modules   Alphabetical List   Compound List   File List   Compound Members  

database.cpp

00001 #ifndef CLASS_SOFT_DB_CPP
00002 #define CLASS_SOFT_DB_CPP
00003 
00004 #include <iostream.h>
00005 #include <qtextstream.h>
00006 #include <qfile.h>
00007 #include <qurloperator.h>
00008 #include <qptrvector.h>
00009 #include <qdom.h>
00010 #include "../header/database.h"
00011 
00012 database::database()
00013 {
00014         QFile qf_Devel( "/home/peter/Projects/class-soft/src/config/class.xml" );
00015         QFile qf_Dist( "/etc/class-soft/class.xml" );
00016         QFile qf_User( "~/.class-soft/class.xml" ); //<-- this doesn't really work
00017         QString qs_XML( "" );
00018         
00019         if( qf_Dist.exists() )//if the config file exists
00020         {
00021                 qf_Dist.open( IO_ReadOnly );
00022                 QTextStream qts_WormReader( &qf_Dist );
00023                 qs_XML = qts_WormReader.read();
00024                 qf_Dist.close();
00025                 
00026                 qdd_Xml.setContent( qs_XML );
00027         } else if( qf_User.exists() ) {
00028                 
00029                 qf_User.open( IO_ReadOnly );
00030                 QTextStream qts_WormReader( &qf_User );
00031                 qs_XML = qts_WormReader.read();
00032                 qf_User.close();
00033                 
00034                 qdd_Xml.setContent( qs_XML );
00035                 
00036         } else if( qf_Devel.exists() )
00037         {
00038                 
00039                 qf_Devel.open( IO_ReadOnly );
00040                 QTextStream qts_WormReader( &qf_Devel );
00041                 qs_XML = qts_WormReader.read();
00042                 qf_Devel.close();
00043                 
00044                 qdd_Xml.setContent( qs_XML );
00045                 
00046         } else {
00047                 cerr << "Unable to open class.xml for read in database::database()!\n";
00048                 exit(1);
00049         }
00050 }
00051 
00052 database::database( const QString qs_Location )
00053 {
00054         QFile qf_Worms( qs_Location );
00055         QString qs_XML( "" );
00056         
00057         if( qf_Worms.exists() )//if the config file exists
00058         {
00059                 qf_Worms.open( IO_ReadOnly );
00060                 QTextStream qts_WormReader( &qf_Worms );
00061                 qs_XML = qts_WormReader.read();
00062                 qf_Worms.close();
00063                 
00064                 qdd_Xml.setContent( qs_XML );
00065         } else {
00066                 cerr << "Unable to open class.xml for read in database::database( \"" << qs_Location << "\"!\n";
00067                 exit(1);
00068         }
00069 }
00070 
00071 database::~database()
00072 {
00073         //I almost forgot this!
00074 }
00075 
00076 QPtrVector<QString> database::get_software( const QString qs_Software )
00077 {
00078         QDomNodeList qdnl_List;
00079         QDomNode qdn_Item;
00080         QDomElement qde_Tag;
00081         QDomAttr qda_Package;
00082         QDomAttr qda_Other;
00083         QPtrVector<QString> qpv_Return( 5 );
00084         QString *qs_p_Temp; //for making things pointy
00085         int x = 0;
00086         
00087         qdnl_List = qdd_Xml.elementsByTagName( "software" );
00088         
00089         qdn_Item = qdnl_List.item(x);
00090         qde_Tag = qdn_Item.toElement();
00091         qda_Package = qde_Tag.attributeNode( "package" );
00092         while( (qda_Package.value() != qs_Software) && (x < qdnl_List.count() - 1) ) 
00093         {
00094                 x++;
00095                 qdn_Item = qdnl_List.item(x);
00096                 qde_Tag = qdn_Item.toElement();
00097                 qda_Package = qde_Tag.attributeNode( "package" );
00098         }
00099 
00100         if( qda_Package.value() == qs_Software ) //just to ensure we really have a match
00101         {
00102                 qs_p_Temp = new QString( qda_Package.value() );
00103                 qpv_Return.insert( 0, qs_p_Temp );
00104                 
00105                 qda_Other = qde_Tag.attributeNode( "name" );
00106                 qs_p_Temp = new QString( qda_Other.value() );
00107                 qpv_Return.insert( 1, qs_p_Temp );
00108                 
00109                 qda_Other = qde_Tag.attributeNode( "version" );
00110                 qs_p_Temp = new QString( qda_Other.value() );
00111                 qpv_Return.insert( 2, qs_p_Temp );
00112                 
00113                 qda_Other = qde_Tag.attributeNode( "description" );
00114                 qs_p_Temp = new QString( qda_Other.value() );
00115                 qpv_Return.insert( 3, qs_p_Temp );
00116                 
00117                 qda_Other = qde_Tag.attributeNode( "uri" );
00118                 qs_p_Temp = new QString( qda_Other.value() );
00119                 qpv_Return.insert( 4, qs_p_Temp );
00120         } else { //we return a set of empty strings
00121                 qs_p_Temp = new QString( "" );
00122                 for( x = 0; x < 5; x++ )
00123                         qpv_Return.insert( x, qs_p_Temp );
00124         }
00125         return qpv_Return;
00126 }
00127 
00128 QPtrVector<QString> database::get_class( const QString qs_Class )
00129 {
00130         QDomNodeList qdnl_List;
00131         QDomNode qdn_Item;
00132         QDomElement qde_Tag;
00133         QDomAttr qda_Division;
00134         QDomAttr qda_Number;
00135         QDomAttr qda_Other;
00136         QPtrVector<QString> qpv_Return(0); //this will be resized after we know how big to make it
00137         QString *qs_p_Temp; //again, a pointer to make the ptr vect work
00138         int x = 0; //a counter
00139         
00140         qdnl_List = qdd_Xml.elementsByTagName( "class" );
00141         
00142         qdn_Item = qdnl_List.item(x);//pop an element out
00143         qde_Tag = qdn_Item.toElement();//convert it to a true element
00144         qda_Division = qde_Tag.attributeNode( "division" );//get the value of the division attrb
00145         qda_Number = qde_Tag.attributeNode( "number" );
00146         while( (qda_Division.value() + qda_Number.value() != qs_Class) && (x < qdnl_List.count() - 1) )
00147         {
00148                 x++;
00149                 qdn_Item = qdnl_List.item(x);
00150                 qde_Tag = qdn_Item.toElement();
00151                 qda_Division = qde_Tag.attributeNode( "division" );
00152                 qda_Number = qde_Tag.attributeNode( "number" );
00153         }
00154         
00155         if( qda_Division.value() + qda_Number.value() == qs_Class ) //just to ensure we got what we wanted
00156         {
00157                 qdnl_List = qdn_Item.childNodes();
00158                 qpv_Return.resize(qdnl_List.count() + 1); //plus one b/c element 0 is used for something else
00159                 qda_Other = qde_Tag.attributeNode( "name" );
00160                 qs_p_Temp = new QString( qda_Other.value() );
00161                 qpv_Return.insert( 0, qs_p_Temp );
00162                 for( x = 0; x < qdnl_List.count(); x++ )
00163                 {
00164                         qdn_Item = qdnl_List.item(x);
00165                         qde_Tag = qdn_Item.toElement();
00166                         qda_Other = qde_Tag.attributeNode( "package" );
00167                         qs_p_Temp = new QString( qda_Other.value() );
00168                         qpv_Return.insert( x+1, qs_p_Temp );
00169                 } //end for
00170         } //end if
00171         
00172         return qpv_Return;
00173 }
00174 
00175 QPtrVector<QString> database::search_class( const QString qs_String )
00176 {
00177         QDomNodeList qdnl_List;
00178         QDomNode qdn_Item;
00179         QDomElement qde_Tag;
00180         QDomAttr qda_Division;
00181         QDomAttr qda_Number;
00182         QDomAttr qda_Name;
00183         QPtrVector<QString> qpv_Return(1); //to be resized...
00184         QString *qs_p_Temp;//for converting to pointers
00185         int x = 0;
00186         
00187         qs_p_Temp = new QString( "" );
00188         qpv_Return.insert( 0, qs_p_Temp );//make the first slot empty, lets a test below work
00189         
00190         qdnl_List = qdd_Xml.elementsByTagName( "class" );
00191         for( x = 0; x < qdnl_List.count(); x++ )
00192         {
00193                 qdn_Item = qdnl_List.item(x);//get an item from the list
00194                 qde_Tag = qdn_Item.toElement();//make it an element
00195                 qda_Name = qde_Tag.attributeNode( "name" );
00196                 if( 0 < (qda_Name.value()).contains( qs_String, false ) ) //if the search string appears at least once in this name
00197                 {
00198                         if( qpv_Return.size() != 1 || *(qpv_Return[0]) != "" )
00199                         {
00200                                 qpv_Return.resize( qpv_Return.size() + 1 );//first we add an element to the array
00201                         }
00202                         qs_p_Temp = new QString( qda_Division.value() + qda_Number.value() );//next we make a pointer to the string we want to add to the vector
00203                         qpv_Return.insert( qpv_Return.size() - 1, qs_p_Temp ); //then we add it to the array
00204                 }
00205         }
00206         
00207         return qpv_Return;
00208 }
00209 
00210 QPtrVector<QString> database::search_software( const QString qs_String )
00211 {
00212         QDomNodeList qdnl_List;
00213         QDomNode qdn_Item;
00214         QDomElement qde_Tag;
00215         QDomAttr qda_Division;
00216         QDomAttr qda_Number;
00217         QDomAttr qda_Name;
00218         QPtrVector<QString> qpv_Return(1); //to be resized...
00219         QString *qs_p_Temp;//for converting to pointers
00220         int x = 0;
00221         
00222         qs_p_Temp = new QString( "" );
00223         qpv_Return.insert( 0, qs_p_Temp );//make the first slot empty, lets a test below work
00224         
00225         qdnl_List = qdd_Xml.elementsByTagName( "software" );
00226         for( x = 0; x < qdnl_List.count(); x++ )
00227         {
00228                 qdn_Item = qdnl_List.item(x);//get an item from the list
00229                 qde_Tag = qdn_Item.toElement();//make it an element
00230                 qda_Name = qde_Tag.attributeNode( "package" );
00231                 if( 0 < (qda_Name.value()).contains( qs_String, false ) ) //if the search string appears at least once in this name
00232                 {
00233                         if( qpv_Return.size() != 1 || *(qpv_Return[0]) != "" )
00234                         {
00235                                 qpv_Return.resize( qpv_Return.size() + 1 );//first we add an element to the array
00236                         }
00237                         qs_p_Temp = new QString( qda_Name.value() );//next we make a pointer to the string we want to add to the vector
00238                         qpv_Return.insert( qpv_Return.size() - 1, qs_p_Temp ); //then we add it to the array
00239                 }
00240         }
00241         
00242         return qpv_Return;
00243 }
00244 
00245 bool database::update( const QString qs_Url )
00246 {
00247         /*QUrlOperator quo_URL();
00248         quo_URL.copy( */
00249         return false;
00250 }
00251 
00252 QPtrVector<QString> database::get_all_classes()
00253 {
00254         QDomNodeList qdnl_List;
00255         QDomNode qdn_Item;
00256         QDomElement qde_Tag;
00257         QDomAttr qda_Division;
00258         QDomAttr qda_Number;
00259         QPtrVector<QString> qpv_Return(0); //to be resized...
00260         QString *qs_p_Temp;
00261         int x = 0;
00262         
00263         qdnl_List = qdd_Xml.elementsByTagName( "class" );
00264         qpv_Return.resize( qdnl_List.count() );//give us enough elements
00265         for( x = 0; x < qdnl_List.count(); x++ )
00266         {
00267                 qdn_Item = qdnl_List.item(x);//get an element
00268                 qde_Tag = qdn_Item.toElement();//poof, its an element
00269                 qda_Division = qde_Tag.attributeNode( "division" );
00270                 qda_Number = qde_Tag.attributeNode( "number" );
00271                 
00272                 qs_p_Temp = new QString( qda_Division.value() + qda_Number.value() );
00273                 qpv_Return.insert( x, qs_p_Temp );
00274         }
00275         
00276         return qpv_Return;
00277 }
00278 
00279 QPtrVector<QString> database::get_all_software( QString qs_Class )
00280 {
00281         QDomNodeList qdnl_List;
00282         QDomNode qdn_Item;
00283         QDomElement qde_Tag;
00284         QDomAttr qda_Division;
00285         QDomAttr qda_Number;
00286         QDomAttr qda_Other;
00287         QPtrVector<QString> qpv_Return(0); //this will be resized after we know how big to make it
00288         QString *qs_p_Temp; //again, a pointer to make the ptr vect work
00289         int x = 0; //a counter
00290         
00291         qdnl_List = qdd_Xml.elementsByTagName( "class" );
00292         
00293         qdn_Item = qdnl_List.item(x);//pop an element out
00294         qde_Tag = qdn_Item.toElement();//convert it to a true element
00295         qda_Division = qde_Tag.attributeNode( "division" );//get the value of the division attrb
00296         qda_Number = qde_Tag.attributeNode( "number" );
00297         while( (qda_Division.value() + qda_Number.value() != qs_Class) && (x < qdnl_List.count() - 1) )
00298         {
00299                 x++;
00300                 qdn_Item = qdnl_List.item(x);
00301                 qde_Tag = qdn_Item.toElement();
00302                 qda_Division = qde_Tag.attributeNode( "division" );
00303                 qda_Number = qde_Tag.attributeNode( "number" );
00304         }
00305         
00306         if( qda_Division.value() + qda_Number.value() == qs_Class ) //just to ensure we got what we wanted
00307         {
00308                 qdnl_List = qdn_Item.childNodes();
00309                 qpv_Return.resize(qdnl_List.count());
00310                 for( x = 0; x < qdnl_List.count(); x++ )
00311                 {
00312                         qdn_Item = qdnl_List.item(x);
00313                         qde_Tag = qdn_Item.toElement();
00314                         qda_Other = qde_Tag.attributeNode( "package" );
00315                         qs_p_Temp = new QString( qda_Other.value() );
00316                         qpv_Return.insert( x, qs_p_Temp );
00317                 } //end for
00318         } //end if
00319         
00320         return qpv_Return;
00321 }
00322 
00323 #endif

Generated on Wed Feb 12 21:57:01 2003 for class-soft by doxygen1.2.16