Skip to content

Commit eed2c8e

Browse files
committed
Handle UTF16 and UTF32 strings properly when binding to an SQLite table
1 parent 470b5cf commit eed2c8e

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/SQLite.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,13 @@ bind!(stmt::Stmt,i::Int,val::Int32) = (sqlite3_bind_int(stmt.handle,i,v
126126
bind!(stmt::Stmt,i::Int,val::Int64) = (sqlite3_bind_int64(stmt.handle,i,val); return nothing)
127127
bind!(stmt::Stmt,i::Int,val::NullType) = (sqlite3_bind_null(stmt.handle,i); return nothing)
128128
bind!(stmt::Stmt,i::Int,val::AbstractString) = (sqlite3_bind_text(stmt.handle,i,val); return nothing)
129-
bind!(stmt::Stmt,i::Int,val::PointerString) = (sqlite3_bind_text(stmt.handle,i,val.ptr,val.len); return nothing)
129+
bind!(stmt::Stmt,i::Int,val::PointerString{UInt8}) = (sqlite3_bind_text(stmt.handle,i,val.ptr,val.len); return nothing)
130+
bind!(stmt::Stmt,i::Int,val::PointerString{UInt16}) = (sqlite3_bind_text16(stmt.handle,i,val.ptr,val.len*2); return nothing)
130131
bind!(stmt::Stmt,i::Int,val::UTF16String) = (sqlite3_bind_text16(stmt.handle,i,val); return nothing)
132+
function bind!(stmt::Stmt,i::Int,val::PointerString{UInt32})
133+
A = UTF32String(pointer_to_array(val.ptr, val.len+1, false))
134+
return bind!(stmt, i, convert(UTF8String,A))
135+
end
131136
# We may want to track the new ByteVec type proposed at https://github.com/JuliaLang/julia/pull/8964
132137
# as the "official" bytes type instead of Vector{UInt8}
133138
"bind a byte vector as an SQLite BLOB"

src/api.jl

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,23 @@ function sqlite3_bind_text(stmt::Ptr{Void},col::Int,value::AbstractString)
9898
Cint, (Ptr{Void},Cint,Ptr{UInt8},Cint,Ptr{Void}),
9999
stmt,col,value,sizeof(value),C_NULL)
100100
end
101-
function sqlite3_bind_text(stmt::Ptr{Void},col::Int,ptr::Ptr,len::Int)
101+
function sqlite3_bind_text(stmt::Ptr{Void},col::Int,ptr::Ptr{UInt8},len::Int)
102102
return ccall( (:sqlite3_bind_text, sqlite3_lib),
103103
Cint, (Ptr{Void},Cint,Ptr{UInt8},Cint,Ptr{Void}),
104104
stmt,col,ptr,len,C_NULL)
105105
end
106106
# SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
107107
function sqlite3_bind_text16(stmt::Ptr{Void},col::Int,value::UTF16String)
108-
return ccall( (:sqlite3_bind_text, sqlite3_lib),
108+
return ccall( (:sqlite3_bind_text16, sqlite3_lib),
109109
Cint, (Ptr{Void},Cint,Ptr{UInt16},Cint,Ptr{Void}),
110110
stmt,col,value,sizeof(value),C_NULL)
111111
end
112+
function sqlite3_bind_text16(stmt::Ptr{Void},col::Int,ptr::Ptr{UInt16},len::Int)
113+
return ccall( (:sqlite3_bind_text16, sqlite3_lib),
114+
Cint, (Ptr{Void},Cint,Ptr{UInt16},Cint,Ptr{Void}),
115+
stmt,col,ptr,len,C_NULL)
116+
end
117+
112118
# SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
113119
function sqlite3_bind_blob(stmt::Ptr{Void},col::Int,value)
114120
return ccall( (:sqlite3_bind_blob, sqlite3_lib),

0 commit comments

Comments
 (0)