From 375bf8c0dddace856e8d3e1ef87be4698ed77c46 Mon Sep 17 00:00:00 2001 From: DanB Date: Tue, 25 Mar 2014 16:00:33 +0100 Subject: [PATCH] CdrExporter returns stats for successfuly and unsuccessfuly exported CDRs --- apier/apier_local_test.go | 2 +- apier/cdre.go | 25 +++++++++++++++++++------ utils/apitpdata.go | 6 ++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/apier/apier_local_test.go b/apier/apier_local_test.go index bd23e5466..92d775b54 100644 --- a/apier/apier_local_test.go +++ b/apier/apier_local_test.go @@ -1344,7 +1344,7 @@ func TestExportCdrsToFile(t *testing.T) { t.Error("Failed to detect missing parameter") } req.CdrFormat = utils.CDRE_DRYRUN - expectReply := &utils.ExportedFileCdrs{NumberOfRecords: 2} + expectReply := &utils.ExportedFileCdrs{TotalRecords: 2} if err := rater.Call("ApierV1.ExportCdrsToFile", req, &reply); err != nil { t.Error(err.Error()) } else if !reflect.DeepEqual(reply, expectReply) { diff --git a/apier/cdre.go b/apier/cdre.go index ba29fa0e6..38a28c923 100644 --- a/apier/cdre.go +++ b/apier/cdre.go @@ -62,10 +62,16 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E if err != nil { return err } else if len(cdrs) == 0 { - *reply = utils.ExportedFileCdrs{"", 0} + *reply = utils.ExportedFileCdrs{ExportedFilePath: ""} return nil } switch cdrFormat { + case utils.CDRE_DRYRUN: + exportedIds := make([]string, len(cdrs)) + for idxCdr, cdr := range cdrs { + exportedIds[idxCdr] = cdr.CgrId + } + *reply = utils.ExportedFileCdrs{ExportedFilePath: utils.CDRE_DRYRUN, TotalRecords: len(cdrs), ExportedCgrIds: exportedIds} case utils.CDRE_CSV: if len(fileName) == 0 { fileName = fmt.Sprintf("cdre_%s.csv", exportId) @@ -86,13 +92,17 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E } defer fileOut.Close() csvWriter := cdre.NewCsvCdrWriter(fileOut, roundDecimals, exportedFields) + exportedIds := make([]string, 0) + unexportedIds := make(map[string]string) for _, cdr := range cdrs { if err := csvWriter.WriteCdr(cdr); err != nil { - os.Remove(filePath) - return err + unexportedIds[cdr.CgrId] = err.Error() + } else { + exportedIds = append(exportedIds, cdr.CgrId) } } csvWriter.Close() + *reply = utils.ExportedFileCdrs{ExportedFilePath: filePath, TotalRecords: len(cdrs), ExportedCgrIds: exportedIds, UnexportedCgrIds: unexportedIds} case utils.CDRE_FIXED_WIDTH: if len(fileName) == 0 { fileName = fmt.Sprintf("cdre_%s.fwv", exportId) @@ -115,15 +125,18 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E } defer fileOut.Close() fww, _ := cdre.NewFWCdrWriter(self.LogDb, fileOut, exportTemplate, exportId, roundDecimals) + exportedIds := make([]string, 0) + unexportedIds := make(map[string]string) for _, cdr := range cdrs { if err := fww.WriteCdr(cdr); err != nil { - os.Remove(filePath) - return err + unexportedIds[cdr.CgrId] = err.Error() + } else { + exportedIds = append(exportedIds, cdr.CgrId) } } fww.Close() + *reply = utils.ExportedFileCdrs{ExportedFilePath: filePath, TotalRecords: len(cdrs), ExportedCgrIds: exportedIds, UnexportedCgrIds: unexportedIds} } - *reply = utils.ExportedFileCdrs{fileName, len(cdrs)} return nil } diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 469b535fe..ee7adb5bd 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -343,8 +343,10 @@ type AttrRemCdrs struct { } type ExportedFileCdrs struct { - ExportedFilePath string // Full path to the newly generated export file - NumberOfRecords int // Number of CDRs in the export file + ExportedFilePath string // Full path to the newly generated export file + TotalRecords int // Number of CDRs to be exported + ExportedCgrIds []string // List of successfuly exported cgrids in the file + UnexportedCgrIds map[string]string // Map of errored CDRs, map key is cgrid, value will be the error string } type AttrRateCdrs struct {