Skip to content

Commit

Permalink
golang mysql examples [T633] (cossacklabs#190)
Browse files Browse the repository at this point in the history
* support mysql in examples for golang
* change hardcoded connector address to variable usage
  • Loading branch information
Lagovas authored Jun 19, 2018
1 parent 003c4cd commit 80846a6
Showing 3 changed files with 162 additions and 110 deletions.
2 changes: 0 additions & 2 deletions acra-censor/acra-censor_test.go
Original file line number Diff line number Diff line change
@@ -15,7 +15,6 @@ import (
func TestWhitelistQueries(t *testing.T) {

sqlSelectQueries := []string{
"SELECT * FROM Schema.Tables;",
"SELECT Student_ID FROM STUDENT;",
"SELECT * FROM STUDENT;",
"SELECT * FROM STUDENT;",
@@ -522,7 +521,6 @@ func TestSerialization(t *testing.T) {
func TestLogging(t *testing.T) {

testQueries := []string{
"SELECT * FROM Schema.Tables;",
"SELECT Student_ID FROM STUDENT;",
"SELECT * FROM STUDENT;",
"SELECT * FROM X;",
111 changes: 69 additions & 42 deletions examples/golang/src/example/example.go
Original file line number Diff line number Diff line change
@@ -17,75 +17,102 @@ package main

import (
"database/sql"
"flag"
"fmt"
"math/rand"

"github.com/cossacklabs/acra/acra-writer"
"github.com/cossacklabs/acra/keystore"
"github.com/cossacklabs/acra/utils"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
log "github.com/sirupsen/logrus"
"math/rand"
"time"
)

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const CONNECTION_STRING string = "user=andrey dbname=acra host=127.0.0.1 port=9494"
func main() {
mysql := flag.Bool("mysql", false, "Use MySQL driver")
_ = flag.Bool("postgresql", false, "Use PostgreSQL driver (default if nothing else set)")
dbname := flag.String("db_name", "acra", "Database name")
host := flag.String("host", "127.0.0.1", "Database host")
port := flag.Int("port", 9494, "Database port")
user := flag.String("db_user", "test", "Database user")
password := flag.String("db_password", "password", "Database user's password")
data := flag.String("data", "", "Data to save")
printData := flag.Bool("print", false, "Print data from database")
publicKey := flag.String("public_key", "", "Path to public key")
flag.Parse()

func RandString(n int) []byte {
b := make([]byte, n)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
connectionString := fmt.Sprintf("user=%v password=%v dbname=%v host=%v port=%v", *user, *password, *dbname, *host, *port)
driver := "postgres"
if *mysql {
// username:password@protocol(address)/dbname?param=value
// https://github.com/go-sql-driver/mysql#dsn-data-source-name
connectionString = fmt.Sprintf("%v:%v@tcp(%v:%v)/%v", *user, *password, *host, *port, *dbname)
driver = "mysql"
}
return b
}

func main() {
rand.Seed(time.Now().UnixNano())
acraPublic, err := utils.LoadPublicKey(fmt.Sprintf("%v/client_server.pub", keystore.DEFAULT_KEY_DIR_SHORT))
acraPublic, err := utils.LoadPublicKey(*publicKey)
if err != nil {
panic(err)
}
//some_data := []byte("test data for acra from go")
someData := RandString(20)
fmt.Printf("Generated test data: %v\n", string(someData))

acrastruct, err := acrawriter.CreateAcrastruct(someData, acraPublic, nil)
db, err := sql.Open(driver, connectionString)
if err != nil {
log.Fatal("can't create acrastruct - ", err)
log.Fatal(err)
}

db, err := sql.Open("postgres", CONNECTION_STRING)
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("Create test table with command: 'CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY, data BYTEA, raw_data TEXT);'")
_, err = db.Exec("CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY, data BYTEA, raw_data TEXT);")
if err != nil {
panic(err)
}

fmt.Println("Insert test data to table")
_, err = db.Exec("insert into test (id, data, raw_data) values ($1, $2, $3);", rand.Int31(), acrastruct, string(someData))
if *mysql {
query := "CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY, data VARBINARY(1000), raw_data VARCHAR(1000));"
fmt.Printf("Create test table with command: '%v'\n", query)
_, err = db.Exec(query)

} else {
query := "CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY, data BYTEA, raw_data TEXT);"
fmt.Printf("Create test table with command: '%v'\n", query)
_, err = db.Exec(query)
}
if err != nil {
panic(err)
}

fmt.Println("Select from db with command: 'SELECT data, raw_data FROM test;'")
rows, err := db.Query(`SELECT data, raw_data FROM test;`)
defer rows.Close()
if err != nil {
log.Fatal(err)
}
var data []byte
var rawData string
fmt.Println("data - raw_data")
for rows.Next() {
err := rows.Scan(&data, &rawData)
if *data != "" {
acrastruct, err := acrawriter.CreateAcrastruct([]byte(*data), acraPublic, nil)
if err != nil {
fmt.Println("ERROR")
fmt.Println(err)
return
log.Fatal("can't create acrastruct - ", err)
}
fmt.Println("Insert test data to table")
if *mysql {
_, err = db.Exec("insert into test (id, data, raw_data) values (?, ?, ?);", rand.Int31(), acrastruct, *data)
} else {
_, err = db.Exec("insert into test (id, data, raw_data) values ($1, $2, $3);", rand.Int31(), acrastruct, *data)
}
if err != nil {
panic(err)
}
} else if *printData {
query := `SELECT data, raw_data FROM test;`
fmt.Printf("Select from db with command: '%v'\n", query)
rows, err := db.Query(query)
defer rows.Close()
if err != nil {
log.Fatal(err)
}
var data []byte
var rawData string
fmt.Println("data - raw_data")
for rows.Next() {
err := rows.Scan(&data, &rawData)
if err != nil {
panic(err)
return
}
fmt.Printf("data: %v\nraw_data: %v\n\n", string(data), string(rawData))
}
fmt.Printf("data: %v\nraw_data: %v\n\n", string(data), string(rawData))
}

fmt.Println("Finish")
}
159 changes: 93 additions & 66 deletions examples/golang/src/example_with_zone/example_with_zone.go
Original file line number Diff line number Diff line change
@@ -18,103 +18,130 @@ package main
import (
"database/sql"
"encoding/json"
"flag"
"fmt"
"github.com/cossacklabs/acra/acra-writer"
"github.com/cossacklabs/themis/gothemis/keys"
_ "github.com/lib/pq"
log "github.com/sirupsen/logrus"
"io/ioutil"
"math/rand"
"net/http"
"time"
)

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const CONNECTION_STRING string = "user=postgres password=postgres dbname=acra host=127.0.0.1 port=9494"
"github.com/cossacklabs/acra/acra-writer"
"github.com/cossacklabs/themis/gothemis/keys"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
log "github.com/sirupsen/logrus"
)

func RandString(n int) []byte {
b := make([]byte, n)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
return b
}
var AcraConnectorAddress = "http://127.0.0.1:9191"

type ZoneData struct {
Id string
Public_key []byte
}

func main() {
rand.Seed(time.Now().UnixNano())
//some_data := []byte("test data for acra from go")
someData := RandString(20)
fmt.Printf("Generated test data: %v\n", string(someData))
mysql := flag.Bool("mysql", false, "Use MySQL driver")
_ = flag.Bool("postgresql", false, "Use PostgreSQL driver (default if nothing else set)")
dbname := flag.String("db_name", "acra", "Database name")
host := flag.String("host", "127.0.0.1", "Database host")
port := flag.Int("port", 9494, "Database port")
user := flag.String("db_user", "test", "Database user")
password := flag.String("db_password", "password", "Database user's password")
data := flag.String("data", "", "Data to save")
printData := flag.Bool("print", false, "Print data from database")
zoneId := flag.String("zone_id", "", "Zone id to fetch")
flag.Parse()

//get new zone over http
resp, err := http.Get("http://127.0.0.1:9191/getNewZone")
if err != nil {
panic("Error: getting new zone data (need start Acra with zones (-z) )")
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
zoneData := []byte(body)
//geting zone done
// zone_data := []byte(`{"id":"ZXCxJAAWWbelaVCEcNp","public_key":"VUVDMgAAAC3zSak+Ah5wtcenUuD9PorpT8nmlecK2fG78nWsXZ9NEdotnH1B"}`)
//var parsed_zone_data map[string][]byte
var parsedZoneData ZoneData
err = json.Unmarshal(zoneData, &parsedZoneData)
if err != nil {
panic(err)
}
zonePublic := parsedZoneData.Public_key
zoneId := []byte(parsedZoneData.Id)

acrastruct, err := acrawriter.CreateAcrastruct(someData, &keys.PublicKey{Value: zonePublic}, zoneId)
if err != nil {
panic(err)
connectionString := fmt.Sprintf("user=%v password=%v dbname=%v host=%v port=%v", *user, *password, *dbname, *host, *port)
driver := "postgres"
if *mysql {
// username:password@protocol(address)/dbname?param=value
// https://github.com/go-sql-driver/mysql#dsn-data-source-name
connectionString = fmt.Sprintf("%v:%v@tcp(%v:%v)/%v", *user, *password, *host, *port, *dbname)
driver = "mysql"
}

db, err := sql.Open("postgres", CONNECTION_STRING)
db, err := sql.Open(driver, connectionString)
if err != nil {
log.Fatal(err)
}

err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("Create test2 table with command: 'CREATE TABLE IF NOT EXISTS test2(id INTEGER PRIMARY KEY, zone BYTEA, data BYTEA, raw_data TEXT);'")
_, err = db.Exec("CREATE TABLE IF NOT EXISTS test2(id INTEGER PRIMARY KEY, zone BYTEA, data BYTEA, raw_data TEXT);")
if err != nil {
panic(err)
if *mysql {
query := "CREATE TABLE IF NOT EXISTS test_example_with_zone(id INTEGER PRIMARY KEY, zone BINARY(24), data VARBINARY(1000), raw_data VARCHAR(1000));"
fmt.Printf("Create test_example_with_zone table with command: '%v'\n", query)
_, err = db.Exec(query)
} else {
query := "CREATE TABLE IF NOT EXISTS test_example_with_zone(id INTEGER PRIMARY KEY, zone BYTEA, data BYTEA, raw_data TEXT);"
fmt.Printf("Create test_example_with_zone table with command: '%v'\n", query)
_, err = db.Exec(query)
}

fmt.Println("Insert test data to table")
_, err = db.Exec("insert into test2 (id, zone, data, raw_data) values ($1, $2, $3, $4);", rand.Int31(), zoneId, acrastruct, string(someData))
if err != nil {
panic(err)
}

fmt.Println("Select from db with command: 'SELECT zone, data, raw_data FROM test2;'")
rows, err := db.Query(`SELECT zone, data, raw_data FROM test2;`)
defer rows.Close()
if err != nil {
log.Fatal(err)
}
var zone, data []byte
var rawData string
fmt.Println("zone, data - raw_data")
for rows.Next() {
err := rows.Scan(&zone, &data, &rawData)
if *data != "" {
rand.Seed(time.Now().UnixNano())
//get new zone over http
resp, err := http.Get(fmt.Sprintf("%s/getNewZone", AcraConnectorAddress))
if err != nil {
panic("Error: getting new zone data (need start Acra with zones (-z) )")
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
zoneData := []byte(body)
var parsedZoneData ZoneData
err = json.Unmarshal(zoneData, &parsedZoneData)
if err != nil {
fmt.Println("ERROR")
fmt.Println(err)
return
panic(err)
}
zonePublic := parsedZoneData.Public_key
zoneId := []byte(parsedZoneData.Id)

acrastruct, err := acrawriter.CreateAcrastruct([]byte(*data), &keys.PublicKey{Value: zonePublic}, zoneId)
if err != nil {
panic(err)
}
fmt.Printf("Insert test data to table with zoneid=%v\n", string(zoneId))
if *mysql {
_, err = db.Exec("insert into test_example_with_zone (id, zone, data, raw_data) values (?, ?, ?, ?);", rand.Int31(), zoneId, acrastruct, *data)
} else {
_, err = db.Exec("insert into test_example_with_zone (id, zone, data, raw_data) values ($1, $2, $3, $4);", rand.Int31(), zoneId, acrastruct, *data)
}
if err != nil {
panic(err)
}
} else if *printData {
var query string
if *mysql {
query = `SELECT ?, data, raw_data, zone FROM test_example_with_zone;`
} else {
query = `SELECT $1::bytea, data, raw_data, zone FROM test_example_with_zone;`
}

fmt.Printf("Select from db with command: '%v'\n", query)
rows, err := db.Query(query, []byte(*zoneId))
defer rows.Close()
if err != nil {
log.Fatal(err)
}
var zone, rawZone, data []byte
var rawData string
fmt.Println("zone, data - raw_data")
for rows.Next() {
err := rows.Scan(&zone, &data, &rawData, &rawZone)
if err != nil {
panic(err)
return
}
fmt.Printf("zone: %v\ndata: %v\nraw_data: %v\nrow zone: %v\n\n", string(zone), string(data), string(rawData), string(rawZone))
}
fmt.Printf("zone: %v\ndata: %v\nraw_data: %v\n\n", string(zone), string(data), string(rawData))
}
fmt.Println("Finish")
}

0 comments on commit 80846a6

Please sign in to comment.