2016-08-11 12:43:56 +03:00
package main
import (
"archive/zip"
"bytes"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"path"
"path/filepath"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main ( ) {
site := "https://www.sqlite.org/download.html"
fmt . Printf ( "scraping %v\n" , site )
doc , err := goquery . NewDocument ( site )
if err != nil {
log . Fatal ( err )
}
var url string
doc . Find ( "a" ) . Each ( func ( _ int , s * goquery . Selection ) {
if url == "" && strings . HasPrefix ( s . Text ( ) , "sqlite-amalgamation-" ) {
url = "https://www.sqlite.org/2016/" + s . Text ( )
}
} )
if url == "" {
return
}
fmt . Printf ( "downloading %v\n" , url )
resp , err := http . Get ( url )
if err != nil {
log . Fatal ( err )
}
b , err := ioutil . ReadAll ( resp . Body )
if err != nil {
2016-10-28 11:11:52 +03:00
resp . Body . Close ( )
2016-08-11 12:43:56 +03:00
log . Fatal ( err )
}
fmt . Printf ( "extracting %v\n" , path . Base ( url ) )
r , err := zip . NewReader ( bytes . NewReader ( b ) , resp . ContentLength )
if err != nil {
2016-10-28 11:11:52 +03:00
resp . Body . Close ( )
2016-08-11 12:43:56 +03:00
log . Fatal ( err )
}
2016-10-28 11:11:52 +03:00
resp . Body . Close ( )
2016-08-11 12:43:56 +03:00
for _ , zf := range r . File {
var f * os . File
switch path . Base ( zf . Name ) {
case "sqlite3.c" :
f , err = os . Create ( "sqlite3-binding.c" )
case "sqlite3.h" :
f , err = os . Create ( "sqlite3-binding.h" )
case "sqlite3ext.h" :
f , err = os . Create ( "sqlite3ext.h" )
default :
continue
}
if err != nil {
log . Fatal ( err )
}
zr , err := zf . Open ( )
if err != nil {
log . Fatal ( err )
}
2016-10-28 11:11:52 +03:00
_ , err = io . WriteString ( f , "#ifndef USE_LIBSQLITE3\n" )
if err != nil {
zr . Close ( )
f . Close ( )
log . Fatal ( err )
}
2016-08-11 12:43:56 +03:00
_ , err = io . Copy ( f , zr )
if err != nil {
2016-10-28 11:11:52 +03:00
zr . Close ( )
f . Close ( )
2016-08-11 12:43:56 +03:00
log . Fatal ( err )
}
2016-10-28 11:11:52 +03:00
_ , err = io . WriteString ( f , "#else // USE_LIBSQLITE3\n // If users really want to link against the system sqlite3 we\n// need to make this file a noop.\n #endif" )
if err != nil {
zr . Close ( )
f . Close ( )
log . Fatal ( err )
}
zr . Close ( )
f . Close ( )
2016-08-11 12:43:56 +03:00
fmt . Printf ( "extracted %v\n" , filepath . Base ( f . Name ( ) ) )
}
}