00001
00002
00003
00004
00005
00006
00007
00008 #include "ODBCTapeStream.h"
00009
00010 list<tapepair *> ODBCTapeStream::tslist;
00011 ODBCTapeStream::ODBCTapeStream(){
00012 dbconn=0;
00013 Reset();
00014 }
00015
00016 ODBCTapeStream::ODBCTapeStream(char *fname, char *flags){
00017 dbconn=0;
00018 char host[256], uid[256], pwd[64], objname[1024];
00019 if(sscanf(fname, "%256[^:]:%256[^:]:%64[^:]:%1024[^:]", host, uid, pwd, objname)==4){
00020
00021 Open(host, objname, uid, pwd, flags);
00022 }
00023 else if(sscanf(fname, "%256[^:]:%1024[^:]", host, objname)==2){
00024
00025 Open(host, objname, flags);
00026 }
00027
00028 }
00029
00030 ODBCTapeStream::ODBCTapeStream(char *servername, char *objectname, char *filemode){
00031 dbconn=0;
00032 Open(servername, objectname, filemode);
00033 }
00034
00035 ODBCTapeStream::ODBCTapeStream(char *host, char *uid, char *pwd, char *objname, char *flags){
00036 dbconn=0;
00037 Open(host, uid, pwd, objname, flags);
00038 }
00039
00040 ODBCTapeStream::~ODBCTapeStream(){
00041
00042 }
00043
00044
00045 int ODBCTapeStream::Open(char *servername, char *objname, char *filemode){
00046 return Open(servername, objname, "", "", filemode);
00047 }
00048
00049 int ODBCTapeStream::Open(char *servername, char *objname, char *uid, char *pwd, char *_mode){
00050 Reset();
00051 static char buffer[256];
00052 memset(buffer, 0, 256);
00053 SetFileMode(_mode);
00054 dbconn=ODBCConnMgr::GetMgr()->ConnectToHost(servername, uid, pwd);
00055 if(0 == dbconn){
00056 state=TSO_DONE;
00057 return 0;
00058 }
00059 strncpy(objectname, objname, 63);
00060 if(filemode[0]=='r'){
00061 sprintf(buffer, "SELECT EVENT_TIME, EVENT_VAL FROM EVENT_TABLE WHERE EVENT_OBJECT_NAME='%s' ORDER BY EVENT_LINE", objname);
00062 try{
00063 PreparedStatement *feeder=dbconn->GetConn()->prepareStatement(buffer, 1, 0);
00064 lines = feeder->executeQuery();
00065 if(lines->last()){
00066 line_max=lines->getRow();
00067 lines->first();
00068 state=TSO_OPEN;
00069 line_cur=1;
00070 return line_max;
00071 }
00072 state=TSO_DONE;
00073 return 0;
00074 } catch(SQLException& e) {
00075 cout << "Exception caught: "<<e.getMessage()<<endl;
00076 }
00077 return 2;
00078 }
00079 if(filemode[0]=='w' && filemode[1] != '+'){
00080 try{
00081
00082 sprintf(buffer, "DELETE FROM HEADER_TABLE WHERE HEADER_OBJECT_NAME='%s';", objectname);
00083 PreparedStatement *feeder = dbconn->GetConn()->prepareStatement(buffer);
00084
00085 sprintf(buffer, "DELETE FROM EVENT_TABLE WHERE EVENT_OBJECT_NAME='%s';", objname);
00086 feeder=dbconn->GetConn()->prepareStatement(buffer);
00087 feeder->executeUpdate();
00088 state=TSO_OPEN;
00089 return 1;
00090 } catch(SQLException& e) {
00091 cout << "Exception caught: "<<e.getMessage()<<endl;
00092 }
00093 return 2;
00094 }
00095
00096 state=TSO_OPEN;
00097 return 1;
00098 }
00099
00100 char *ODBCTapeStream::ReadLine(){
00101 static char buffer[1024];
00102 return ReadLine(buffer, 1024);
00103 }
00104
00105 char *ODBCTapeStream::ReadLine(char *buffer, unsigned int size){
00106 memset(buffer, 0, size);
00107 if(state != TSO_OPEN) return NULL;
00108 sprintf(buffer, "%s,%s", lines->getString(1).c_str(), lines->getString(2).c_str());
00109 ++line_cur;
00110 if(!lines->next())
00111 state = TSO_DONE;
00112 return buffer;
00113 }
00114
00115
00116 int ODBCTapeStream::ReadShape(char *objname, float *scale){
00117
00118
00119
00120
00121
00122
00123
00124
00125 return 1;
00126 }
00127
00128
00129
00130
00131
00132 int ODBCTapeStream::Write(char *inbuffer){
00133 return 0;
00134 }
00135
00136
00137 int ODBCTapeStream::Write(char *timestamp, char *value){
00138 double event_val=atof(value);
00139 odbc::PreparedStatement *feeder=dbconn->GetConn()->prepareStatement("INSERT INTO OBJECT_TABLE VALUES (?, ?, ?, ?)");
00140 feeder->setString(1, objectname);
00141 feeder->setInt(2, ++line_cur);
00142 feeder->setString(3, timestamp);
00143 feeder->setString(4, value);
00144 int rows=feeder->executeUpdate();
00145 return 0;
00146 }
00147
00148
00149
00150 void ODBCTapeStream::PrintHeader(char *timestr, char *uname, char *hostname, char *targstr,
00151 char *prop, char *trigger, long interval, long limit){
00152 PreparedStatement *feeder = dbconn->GetConn()->prepareStatement("INSERT INTO HEADER_TABLE VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?);");
00153 feeder->setString(1, objectname);
00154 feeder->setString(2, timestr);
00155 feeder->setString(3, uname);
00156 feeder->setString(4, hostname);
00157 feeder->setString(5, targstr);
00158 feeder->setString(6, prop);
00159 feeder->setString(7, trigger);
00160 feeder->setLong(8, interval);
00161 feeder->setLong(9, limit);
00162 int affectedRows=feeder->executeUpdate();
00163 }
00164
00165 void ODBCTapeStream::Close(){
00166 Reset();
00167 }
00168
00169 void ODBCTapeStream::HardClose(){
00170
00171 line_cur=0;
00172 line_max=0;
00173
00174 }
00175
00176 int ODBCTapeStream::Rewind(){
00177 line_cur=1;
00178 return 0;
00179 }
00180
00181 void ODBCTapeStream::Reset(){
00182 memset(objectname, 0, 64);
00183 line_cur=0;
00184 line_max=0;
00185
00186 if(dbconn)
00187 dbconn->DisconnectTape(this);
00188 }
00189
00190
00191
00192
00193
00194 TapeStream *ODBCTapeStream::OpenStream(void *my, char *fname, char *flags){
00195 char host[256], uid[256], pwd[64], objname[1024];
00196 tapepair *pair=0;
00197
00198 if(sscanf(fname, "%256[^:]:%256[^:]:%64[^:]:%1024[^:]", host, uid, pwd, objname)==4)
00199 pair=new tapepair(new ODBCTapeStream(host, uid, pwd, objname, flags), my);
00200
00201 else if(sscanf(fname, "%256[^:]:%1024[^:]", host, objname)==2)
00202 pair=new tapepair(new ODBCTapeStream(host, objname, flags), my);
00203 if(0==pair) return 0;
00204 tslist.push_back(pair);
00205 return pair->tape;
00206 }
00207
00208 void ODBCTapeStream::CloseStream(void *my){
00209 list<tapepair *>::iterator itr=tslist.begin();
00210 do{
00211 if((*itr)->name == my){
00212 (*itr)->tape->Close();
00213 delete (*itr)->tape;
00214 tslist.erase(itr);
00215 return;
00216 }
00217 ++itr;
00218 } while(itr != tslist.end());
00219 }
00220
00221 void ODBCTapeStream::CloseAllStream(){
00222 while(!tslist.empty()){
00223 tslist.back()->tape->Close();
00224 delete tslist.back()->tape;
00225 tslist.pop_back();
00226 }
00227 }
00228
00229