mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-19 09:14:27 +08:00
import transaction from GnuCash database
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package gnucash
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"encoding/xml"
|
||||
|
||||
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
||||
)
|
||||
|
||||
// gnucashDatabaseReader defines the structure of gnucash database reader
|
||||
type gnucashDatabaseReader struct {
|
||||
xmlDecoder *xml.Decoder
|
||||
}
|
||||
|
||||
// read returns the imported gnucash data
|
||||
func (r *gnucashDatabaseReader) read(ctx core.Context) (*gnucashDatabase, error) {
|
||||
database := &gnucashDatabase{}
|
||||
|
||||
err := r.xmlDecoder.Decode(&database)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return database, nil
|
||||
}
|
||||
|
||||
func createNewGnuCashDatabaseReader(data []byte) (*gnucashDatabaseReader, error) {
|
||||
if len(data) > 2 && data[0] == 0x1F && data[1] == 0x8B { // gzip magic number
|
||||
gzipReader, err := gzip.NewReader(bytes.NewReader(data))
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
xmlDecoder := xml.NewDecoder(gzipReader)
|
||||
xmlDecoder.CharsetReader = utils.IdentReader
|
||||
|
||||
return &gnucashDatabaseReader{
|
||||
xmlDecoder: xmlDecoder,
|
||||
}, nil
|
||||
} else if len(data) > 5 && data[0] == 0x3C && data[1] == 0x3F && data[2] == 0x78 && data[3] == 0x6D && data[4] == 0x6C { // <?xml
|
||||
xmlDecoder := xml.NewDecoder(bytes.NewReader(data))
|
||||
xmlDecoder.CharsetReader = utils.IdentReader
|
||||
|
||||
return &gnucashDatabaseReader{
|
||||
xmlDecoder: xmlDecoder,
|
||||
}, nil
|
||||
}
|
||||
|
||||
return nil, errs.ErrInvalidGnuCashFile
|
||||
}
|
||||
Reference in New Issue
Block a user