github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/migration/v2_to_v3/cmd/decompress_docs/main.back (about)

     1  // Script de décompression générale des documents.
     2  // S'applique sur une base v3, et enlève la compression gzip
     3  // des contenus.
     4  package main
     5  
     6  import (
     7  	"bytes"
     8  	"compress/gzip"
     9  	"flag"
    10  	"fmt"
    11  	"io"
    12  	"log"
    13  
    14  	"github.com/benoitkugler/goACVE/server/core/rawdata"
    15  	"github.com/benoitkugler/goACVE/logs"
    16  )
    17  
    18  func main() {
    19  	dev := flag.Bool("dev", true, "which DB to use")
    20  	flag.Parse()
    21  
    22  	logsDB := logs.DBProd
    23  	if *dev {
    24  		logsDB = logs.DBDev
    25  	}
    26  
    27  	fmt.Println("Connecting on", logsDB.Host, logsDB.Name)
    28  
    29  	db, err := rawdata.ConnectDB(logsDB)
    30  	if err != nil {
    31  		log.Fatal(err)
    32  	}
    33  	defer db.Close()
    34  
    35  	tx, err := db.Begin()
    36  	if err != nil {
    37  		log.Fatal(err)
    38  	}
    39  
    40  	var totalLengthCompressed, totalLengthUncompressed int
    41  
    42  	fmt.Println("Downloading documents...")
    43  	rds, err := rawdata.SelectAllContenuDocuments(tx)
    44  	if err != nil {
    45  		log.Fatal(err)
    46  	}
    47  
    48  	for i, contenu := range rds {
    49  		if i%5 == 0 {
    50  			fmt.Printf("\r Decompressing document %d / %d (%d %%) ...", i+1, len(rds), 100*(i+1)/len(rds))
    51  		}
    52  		totalLengthCompressed += len(contenu.Contenu)
    53  		r, err := gzip.NewReader(bytes.NewReader(contenu.Contenu))
    54  		if err != nil {
    55  			log.Fatal(err)
    56  		}
    57  		var uncompressed bytes.Buffer
    58  		_, err = io.Copy(&uncompressed, r)
    59  		if err != nil {
    60  			log.Fatal(err)
    61  		}
    62  		_ = r.Close()
    63  
    64  		totalLengthUncompressed += uncompressed.Len()
    65  		contenu.Contenu = uncompressed.Bytes()
    66  
    67  		_, err = tx.Exec("UPDATE contenu_documents SET contenu = $1 WHERE id_document = $2", contenu.Contenu, contenu.IdDocument)
    68  		if err != nil {
    69  			log.Fatal(err)
    70  		}
    71  
    72  		// les miniatures sont déjà décompressées
    73  	}
    74  
    75  	err = tx.Commit()
    76  	if err != nil {
    77  		log.Fatal(err)
    78  	}
    79  
    80  	fmt.Printf("Compression analysis: %f.03 %% (%d / %d)\n",
    81  		100*float32(totalLengthCompressed)/float32(totalLengthUncompressed), totalLengthCompressed/1000, totalLengthUncompressed/1000)
    82  }