mutecomm / go-sqlcipher

Self-contained Go sqlite3 driver with an AES-256 encrypted sqlite3 database
Other
159 stars 60 forks source link

v4.4.2 pragma support only key and cipher_page_size ? #22

Open zhaobingss opened 3 years ago

zhaobingss commented 3 years ago

I hpoe support multy pragam just like add code bellow:

pragmaMap := map[string]string{}
pragmaKey := ""
pragmaCipherPageSize := -1

pos := strings.IndexRune(dsn, '?')
if pos >= 1 {
        params, err := url.ParseQuery(dsn[pos+1:])
        if err != nil {
            return nil, err
        }

        // support multi pragma
        for key, strArr := range params {
            if strings.Contains(key, "_pragma_") {
                pragmaMap[key[8:]] = strArr[0]
            }
        }
        .....
}

// _pragma_key
if pragmaKey != "" {
        query := fmt.Sprintf("PRAGMA key = \"%s\";", pragmaKey)
        if err := exec(query); err != nil {
            C.sqlite3_close_v2(db)
            return nil, err
        }
}

// _pragma_cipher_page_size
if pragmaCipherPageSize != -1 {
        query := fmt.Sprintf("PRAGMA cipher_page_size = %d;",
            pragmaCipherPageSize)
        if err := exec(query); err != nil {
            C.sqlite3_close_v2(db)
            return nil, err
        }
}

// support multi pragma
for key, val := range pragmaMap {
        if val != "" && key != "key" && key != "cipher_page_size" {
            query := fmt.Sprintf("PRAGMA %s = %s;", key, val)
            if err := exec(query); err != nil {
                C.sqlite3_close_v2(db)
                return nil, err
            }
        }
    }