00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "marcparser.h"
00011
00012 void ImportZ3950View::init() {
00013 count=0;
00014 }
00015
00016 QString ImportZ3950View::lookupToken(QString s, int i) {
00017 return dict[s+"_"+QString().setNum(i)];
00018 }
00019
00020 void ImportZ3950View::startSearch() {
00021 dict.clear();
00022 ZOOM_connection c = ZOOM_connection_new (server->text(), 0);
00023
00024 const char *cp, *addinfo;
00025 if(ZOOM_connection_error (c, &cp, &addinfo)) {
00026 printf("Error: %s - %s\n", cp, addinfo);
00027 return;
00028 }
00029
00030 ZOOM_connection_option_set(c, "preferredRecordSyntax", "XML");
00031
00032 ZOOM_query q=ZOOM_query_create();
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 QString query;
00064 if(!term2->text().isEmpty())
00065 if(op1->currentItem()==0) query+="@and "; else query+="@or ";
00066 if(!term3->text().isEmpty()) {
00067 if(op2->currentItem()==0) query+="@and "; else query+="@or ";
00068 if(field3->currentItem()==0) query+="@attr 1=4 "; else query+="@attr 1=1 ";
00069 query+="\""+term3->text()+"\" ";
00070 }
00071
00072 if(!term2->text().isEmpty()) {
00073 if(field2->currentItem()==0) query+="@attr 1=4 "; else query+="@attr 1=1 ";
00074 query+="\""+term2->text()+"\" ";
00075 }
00076
00077 if(field1->currentItem()==0) query+="@attr 1=4 "; else query+="@attr 1=1 ";
00078 query+="\""+term1->text()+"\" ";
00079
00080 printf("\nQuery ist: %s", (const char*) query);
00081 ZOOM_query_prefix(q, query);
00082 ZOOM_resultset s=ZOOM_connection_search(c, q);
00083 count=ZOOM_resultset_size(s);
00084 if(count>20) count=20;
00085 printf("Retrieved %i records\n", count);
00086
00087 size_t i;
00088 int len;
00089 for(i=0; i<count; i++) {
00090 printf("\nneuer Datensatz");
00091 ZOOM_record r=ZOOM_resultset_record (s, i);
00092 printf("\ndatabase %s", ZOOM_record_get (r, "database", &len));
00093 printf("\nsyntax %s", ZOOM_record_get (r, "syntax", &len));
00094 printf("\nrender %s", ZOOM_record_get (r, "render", &len));
00095
00096 QString s=ZOOM_record_get(r, "render", &len);
00097
00098 MARCParser handler(i, &dict);
00099 QXmlInputSource source;
00100 source.setData(s);
00101 QXmlSimpleReader reader;
00102 reader.setContentHandler( &handler );
00103 reader.parse( source );
00104 }
00105
00106 QMemArray<int> rows(result->numRows());
00107 for(i=0; i<result->numRows(); i++)
00108 rows[i]=i;
00109 result->removeRows(rows);
00110
00111 for(i=0; i<count; i++) {
00112 int j=0;
00113 QString rec;
00114
00115 while(!lookupToken("lastname"+QString().setNum(j), i).isEmpty()) {
00116 rec+=lookupToken("lastname"+QString().setNum(j), i);
00117 rec+=", ";
00118 rec+=lookupToken("firstname"+QString().setNum(j), i);
00119 rec+=" and ";
00120 j++;
00121 }
00122
00123 if(rec.isEmpty()) rec="Unknown author";
00124 else rec=rec.left(rec.length()-4);
00125
00126 printf("lookupToken: %s", (const char*) lookupToken("lastname"+QString().setNum(10), i)) ;
00127 if(!lookupToken("year", i).isEmpty())
00128 rec+=", "+lookupToken("year", i);
00129 rec+=":"+lookupToken("title", i)+". ";
00130
00131 if(!lookupToken("journal", i).isEmpty()) {
00132 rec+=" in:"+lookupToken("journal", i)+" ";
00133 rec+=lookupToken("volume", i);
00134 if(!lookupToken("volume", i).isEmpty() && !lookupToken("number", i).isEmpty())
00135 rec+="/";
00136 rec+=lookupToken("number", i);
00137 }
00138
00139 if(!lookupToken("address", i).isEmpty())
00140 rec+=lookupToken("address", i)+".";
00141
00142 result->insertRows(i);
00143 result->setText(i, 1, rec);
00144 result->setItem(i, 0, new QCheckTableItem(result, ""));
00145 }
00146 result->adjustColumn(0);
00147 result->adjustColumn(1);
00148
00149 ZOOM_query_destroy(q);
00150 ZOOM_resultset_destroy(s);
00151 ZOOM_connection_destroy (c);
00152 }
00153
00154 QMap<QString, QString> ImportZ3950View::getDict() {
00155 return dict;
00156 }
00157
00158
00159 int ImportZ3950View::recCount() {
00160 return count;
00161 }