?? database.cpp~
字號:
qstmp.sprintf("%s",tmps2.data());FieldList.append(qstmp); iStart=i; } tmps2=SqlStr.mid(iStart+1,index-iStart-1); j=tmps2.find("=",iStart+1);tmps2=tmps2.mid(iStart+1,j-iStart-1); qstmp.sprintf("%s",tmps2.data());FieldList.append(qstmp); WhereStr=SqlStr.mid(index+1); } else if(tmps1=="DELETE") { FieldList.clear(); index=SqlStr.find(" from ",0);if(index<0) index=SqlStr.find(" From ",0); if(index<0) index=SqlStr.find(" FROM ",0); if(index<0) return; iStart=index; index=SqlStr.find(" where ",iStart+1);if(index<0) index=SqlStr.find(" Where ",iStart+1); if(index<0) index=SqlStr.find(" WHERE ",iStart+1); if(index<0) index=SqlStr.length(); Table=SqlStr.mid(iStart+6,index-iStart-6); WhereStr=SqlStr.mid(index+1); } else { Table="";FieldList.clear();WhereStr=""; }}Oid CDataBase :: importfile(long hdbc,char *filename){ PGconn *conn=(PGconn*)hdbc; Oid lobjId;int lobj_fd;char buf[BUFSIZE];int nbytes,tmp,fd; //open file fd=open(filename,O_RDONLY,0660); if(fd<0) { fprintf(stderr,"不能打開文件:%s\n",filename);return 0; } //create the large object lobjId=lo_creat(conn,INV_READ|INV_WRITE); if(lobjId==0) { fprintf(stderr,"不能創建大對象\n");(void)close(fd);return 0; } lobj_fd=lo_open(conn,lobjId,INV_WRITE); if(lobj_fd<0) { fprintf(stderr,"不能打開大對象:%d\n",lobjId);(void)close(fd);return 0; } while((nbytes=read(fd,buf,BUFSIZE))>0) { tmp=lo_write(conn,lobj_fd,buf,nbytes); if(tmp<nbytes) { fprintf(stderr,"讀大對象出錯\n"); (void)close(fd);(void)lo_close(conn,lobj_fd);return 0; } } (void)close(fd);(void)lo_close(conn,lobj_fd);return lobjId;}bool CDataBase :: pickout(long hdbc,Oid lobjId,int start,int len,void* retbuf){ int lobj_fd;char *buf;int nbytes,nread; PGconn *conn=(PGconn*)hdbc; if(retbuf==NULL) return 0; lobj_fd=lo_open(conn,lobjId,INV_READ); if(lobj_fd<0) { fprintf(stderr,"不能打開大對象:%d\n",lobjId);return 0; } lo_lseek(conn,lobj_fd,start,SEEK_SET); buf=(char*)malloc(len+1);nread=0; while(len-nread>0) { nbytes=lo_read(conn,lobj_fd,buf,len-nread); memcpy((char*)retbuf+nread,buf,nbytes); nread+=nbytes; } free(buf);lo_close(conn,lobj_fd); return 1;}bool CDataBase :: overwrite(long hdbc,Oid lobjId,int start,int len,void* srcbuf){ int lobj_fd;char *buf;int nbytes,nwritten; if(srcbuf==NULL) return 0; PGconn *conn=(PGconn*)hdbc; lobj_fd=lo_open(conn,lobjId,INV_READ|INV_WRITE); if(lobj_fd<0) { fprintf(stderr,"不能打開大對象:%d\n",lobjId);return 0; } lo_lseek(conn,lobj_fd,start,SEEK_SET); buf=(char*)malloc(len+1); memset(buf,0x00,len+1); memcpy(buf,(char*)srcbuf,len); nwritten=0; while(len-nwritten>0) { nbytes=lo_write(conn,lobj_fd,buf+nwritten,len-nwritten); nwritten+=nbytes; } free(buf);lo_close(conn,lobj_fd); return 1;}bool CDataBase :: exportfile(long hdbc,Oid lobjId,char *filename){ int lobj_fd;char buf[BUFSIZE];int nbytes,tmp,fd; PGconn *conn=(PGconn*)hdbc; lobj_fd=lo_open(conn,lobjId,INV_READ); if(lobj_fd<0) { fprintf(stderr,"不能打開大對象:%d\n",lobjId);return 0; } fd=open(filename,O_CREAT|O_WRONLY,0660); if(fd<0) { fprintf(stderr,"不能打開或創建文件:%s\n",filename);lo_close(conn,lobj_fd);return 0; } while((nbytes=lo_read(conn,lobj_fd,buf,BUFSIZE))>0) { tmp=write(fd,buf,nbytes); if(tmp<nbytes) { break; } } (void)lo_close(conn,lobj_fd);(void)close(fd);return 1;}//******************************************************************//*插入帶有大對象的函數//*SqlStr="Insert into image(name,photo1,photo2) values('12345',?,?);"//*photo1,photo2為大對象的字段//*FileList是文件的列表,類似Windows VC++中的CStringArray//*返回=0表示失敗;=1表示成功//******************************************************************bool CDataBase :: InsertWithLargeObject(long hdbc,QCString SqlStr,QStringList FileList){ int iCount=FileList.count(); QString s1;Oid tmpid;bool bret=1;QCString param; QPtrList<Oid> OidArray;OidArray.clear(); PGresult *res = PQexec((PGconn*)hdbc, "begin"); if(!res) { PQclear(res);return 0; } for(int i=0;i<iCount;i++) { s1=*(FileList.at(i)); tmpid = lo_import((PGconn*)hdbc, s1.data()); if(tmpid<=0) { bret=0;continue; } param.sprintf("%d",tmpid); SqlStr=FillParam(SqlStr,i+1,0,param); OidArray.append(&tmpid); } res = PQexec((PGconn*)hdbc, SqlStr.data()); if (!res) { PQclear(res);bret=0; //記錄插入失敗,刪除大對象 for(int j=0;j<(int)OidArray.count();j++) { lo_unlink((PGconn*)hdbc,*(OidArray.at(j))); } } res = PQexec((PGconn*)hdbc, "end"); PQclear(res); return bret;}//******************************************************************//*刪除帶有大對象的記錄函數:Table=表名;WhereStr=刪除條件;FieldList=存放大對象的字段數組//*bDeleRow=1表示先刪除大對象再刪除對應的記錄//*返回=0表示失敗;=1表示成功//******************************************************************bool CDataBase :: DeleteWithLargeObject(long hdbc,QCString Table,QCString WhereStr,QStringList FieldList, bool bForceDele,bool bDeleRow){ QCString tmpsql,tmps; tmpsql="Select ";QString FieldName; for(int i=0;i<(int)FieldList.count();i++) { FieldName=*(FieldList.at(i)); tmps.sprintf("%s",FieldName.data()); tmpsql+=tmps; if(i<(int)FieldList.count()-1) tmpsql+=","; } tmpsql+=" from "+Table+" "+WhereStr; //開始數據庫事務 PGresult *res = PQexec((PGconn*)hdbc, "BEGIN"); if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "BEGIN command failed\n");PQclear(res);return 0; } PQclear(res); //執行查詢語句 res = PQexec((PGconn*)hdbc,tmpsql.data()); if( PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr,"Exec Query Fauled!\\n");PQclear(res);return 0; } int i = PQntuples(res); int t = PQnfields(res);Oid tmpOid=0;int ret=0; for(int s=0; s<i; s++) { ret=0; for (int k = 0; k<t; k++) { tmps.sprintf("%s",PQgetvalue(res,s,k)); tmpOid=(Oid)tmps.toUInt(); if(tmpOid<=0) continue; //該字段無對應的大對象 ret=lo_unlink((PGconn*)hdbc,tmpOid); //刪除大對象 if(ret<0&&bForceDele==0) break; //刪除失敗 } if(ret<0&&bForceDele==0) break; //刪除失敗 } PQclear(res); //如果出錯回滾否則繼續 if(ret<0&&bForceDele==0) { res = PQexec((PGconn*)hdbc, "ROLLBACK"); if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "ROLLBACK command failed\n");PQclear(res);return 0; } PQclear(res); } //是否刪除數據庫記錄 if(bDeleRow) { tmpsql=" Delete from "+Table+" "+WhereStr; res = PQexec((PGconn*)hdbc,tmpsql.data());PQclear(res); } res = PQexec((PGconn*)hdbc, "COMMIT"); if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "COMMIT command failed\n");PQclear(res);return 0; } PQclear(res); return 1;}//******************************************************************//*修改帶有大對象的記錄函數:SqlStr=Update 表名 Set field1=?,field2=? where recordindex='111'//*FileList=文件名數組//*返回=0表示失敗;=1表示成功//******************************************************************bool CDataBase :: UpdateLargeObject(long hdbc,QCString SqlStr,QStringList FileList){ QCString Table,WhereStr;QStringList FieldList;QString s1;Oid tmpid;bool bret=1;QCString param; QPtrList<Oid> OidArray;OidArray.clear(); //得到表名,字段,條件 GetTableFromSql(SqlStr,Table,WhereStr,FieldList); //刪除原來的大對象[強制+不刪除記錄] DeleteWithLargeObject(hdbc,Table,WhereStr,FieldList,1,0); //開始數據庫事務 PGresult *res = PQexec((PGconn*)hdbc, "begin"); if(!res) { PQclear(res);return 0; } //保存數據庫大對象 int iCount=FileList.count(); for(int i=0;i<iCount;i++) { s1=*(FileList.at(i)); tmpid = lo_import((PGconn*)hdbc, s1.data()); if(tmpid<=0) { bret=0;continue; } param.sprintf("%d",tmpid); SqlStr=FillParam(SqlStr,i+1,0,param); OidArray.append(&tmpid); } res = PQexec((PGconn*)hdbc, SqlStr.data()); if (!res) { PQclear(res);bret=0; //記錄插入失敗,刪除大對象 for(int j=0;j<(int)OidArray.count();j++) { lo_unlink((PGconn*)hdbc,*(OidArray.at(j))); } } res = PQexec((PGconn*)hdbc, "end"); PQclear(res); return bret;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -