github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/core/datamodel/io.go (about) 1 package datamodel 2 3 import ( 4 "compress/gzip" 5 "encoding/json" 6 "io" 7 "log" 8 "os" 9 10 "github.com/benoitkugler/goACVE/logs" 11 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 12 ) 13 14 // ----------------------------- JSON ----------------------------- 15 16 // MarshalBaseLocale dumps la base en JSON, avec indentation 17 func MarshalBaseLocale(b *BaseLocale, out io.Writer) error { 18 enc := json.NewEncoder(out) 19 enc.SetIndent(" ", " ") 20 enc.SetEscapeHTML(false) 21 err := enc.Encode(b) 22 return err 23 } 24 25 // MarshalCompress marshal et compresse, sans indentation 26 func (b *BaseLocale) MarshalCompress(out io.Writer) error { 27 return marshalCompress(b, out) 28 } 29 30 func marshalCompress(v interface{}, out io.Writer) error { 31 gzOut := gzip.NewWriter(out) 32 33 enc := json.NewEncoder(gzOut) 34 enc.SetEscapeHTML(false) 35 36 err := enc.Encode(v) 37 if err != nil { 38 return err 39 } 40 err = gzOut.Close() 41 return err 42 } 43 44 func UnMarshalBaseLocale(in io.Reader) (BaseLocale, error) { 45 dec := json.NewDecoder(in) 46 var b BaseLocale 47 err := dec.Decode(&b) 48 return b, err 49 } 50 51 func DecompressUnMarshalBaseLocale(in io.Reader) (BaseLocale, error) { 52 gzIn, err := gzip.NewReader(in) 53 if err != nil { 54 return BaseLocale{}, err 55 } 56 defer gzIn.Close() 57 58 dec := json.NewDecoder(gzIn) 59 var b BaseLocale 60 err = dec.Decode(&b) 61 return b, err 62 } 63 64 // -------------------------------- SQL ------------------------------- 65 66 // a garder synchronisé 67 func loadLinksById(db rd.DB, items map[string][]int64) (out RawLinks, err error) { 68 out.EquipierContraintes, err = rd.SelectEquipierContraintesByIdEquipiers(db, items["EquipierContraintes"]...) 69 if err != nil { 70 return out, err 71 } 72 out.GroupeParticipants, err = rd.SelectGroupeParticipantsByIdParticipants(db, items["ParticipantGroupe"]...) 73 if err != nil { 74 return out, err 75 } 76 out.ParticipantEquipiers, err = rd.SelectParticipantEquipiersByIdParticipants(db, items["ParticipantEquipier"]...) 77 if err != nil { 78 return out, err 79 } 80 out.GroupeContraintes, err = rd.SelectGroupeContraintesByIdGroupes(db, items["GroupeContraintes"]...) 81 if err != nil { 82 return out, err 83 } 84 out.CampContraintes, err = rd.SelectCampContraintesByIdCamps(db, items["CampContraintes"]...) 85 if err != nil { 86 return out, err 87 } 88 out.DocumentPersonnes, err = rd.SelectDocumentPersonnesByIdDocuments(db, items["DocumentPersonnes"]...) 89 if err != nil { 90 return out, err 91 } 92 out.DocumentAides, err = rd.SelectDocumentAidesByIdDocuments(db, items["DocumentAides"]...) 93 if err != nil { 94 return out, err 95 } 96 out.DocumentCamps, err = rd.SelectDocumentCampsByIdDocuments(db, items["DocumentCamps"]...) 97 if err != nil { 98 return out, err 99 } 100 out.MessageDocuments, err = rd.SelectMessageDocumentsByIdMessages(db, items["MessageDocuments"]...) 101 if err != nil { 102 return out, err 103 } 104 out.MessageSondages, err = rd.SelectMessageSondagesByIdMessages(db, items["MessageSondages"]...) 105 if err != nil { 106 return out, err 107 } 108 out.MessagePlaceliberes, err = rd.SelectMessagePlaceliberesByIdMessages(db, items["MessagePlaceliberes"]...) 109 if err != nil { 110 return out, err 111 } 112 out.MessageAttestations, err = rd.SelectMessageAttestationsByIdMessages(db, items["MessageAttestations"]...) 113 if err != nil { 114 return out, err 115 } 116 out.MessageMessages, err = rd.SelectMessageMessagesByIdMessages(db, items["MessageMessages"]...) 117 if err != nil { 118 return out, err 119 } 120 out.DonDonateurs, err = rd.SelectDonDonateursByIdDons(db, items["DonDonateurs"]...) 121 if err != nil { 122 return out, err 123 } 124 return out, nil 125 } 126 127 func (b *BaseLocale) ProcessRawLinks(rl RawLinks) { 128 out := rd.Links{ 129 EquipierContraintes: rl.EquipierContraintes.ByIdEquipier(), 130 ParticipantGroupe: rl.GroupeParticipants.ByIdParticipant(), 131 ParticipantEquipier: rl.ParticipantEquipiers.ByIdParticipant(), 132 GroupeContraintes: rl.GroupeContraintes.ByIdGroupe(), 133 CampContraintes: rl.CampContraintes.ByIdCamp(), 134 DocumentPersonnes: rl.DocumentPersonnes.ByIdDocument(), 135 DocumentAides: rl.DocumentAides.ByIdDocument(), 136 DocumentCamps: rl.DocumentCamps.ByIdDocument(), 137 MessageDocuments: rl.MessageDocuments.ByIdMessage(), 138 MessageSondages: rl.MessageSondages.ByIdMessage(), 139 MessagePlaceliberes: rl.MessagePlaceliberes.ByIdMessage(), 140 MessageAttestations: rl.MessageAttestations.ByIdMessage(), 141 MessageMessages: rl.MessageMessages.ByIdMessage(), 142 DonDonateurs: rl.DonDonateurs.ByIdDon(), 143 } 144 b.Links = out 145 } 146 147 // GetBase renvoie la base de developpement distante. 148 // Utile pour des tests 149 func GetBase(dev bool) *BaseLocale { 150 logsDB := logs.DBProd 151 if dev { 152 logsDB = logs.DBDev 153 } 154 db, err := rd.ConnectDB(logsDB) 155 if err != nil { 156 log.Fatal(err) 157 } 158 defer db.Close() 159 base, err := LoadRemoteBaseLocale(db) 160 if err != nil { 161 log.Fatal(err) 162 } 163 return base 164 } 165 166 // GetLocalDBDev renvoie la base locale. 167 // A utiliser depuis le dossier principal 168 func GetLocalDBDev() *BaseLocale { 169 f, err := os.Open("local/DB.json") 170 if err != nil { 171 log.Fatal(err) 172 } 173 base, err := UnMarshalBaseLocale(f) 174 if err != nil { 175 log.Fatal(err) 176 } 177 return &base 178 }