Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
d944e227
Commit
d944e227
authored
Nov 10, 2009
by
Srikanth Raju
Committed by
Laurent Aimar
Nov 10, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Sql: Include interface for prepared statements.
Signed-off-by:
Laurent Aimar
<
fenrir@videolan.org
>
parent
6f121876
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
324 additions
and
8 deletions
+324
-8
include/vlc_sql.h
include/vlc_sql.h
+324
-8
No files found.
include/vlc_sql.h
View file @
d944e227
...
...
@@ -39,11 +39,38 @@ extern "C" {
* General structure: SQL object.
*****************************************************************************/
/**
* Return values for the function @see sql_Run()
*/
#define VLC_SQL_ROW 1
#define VLC_SQL_DONE 2
typedef
struct
sql_t
sql_t
;
typedef
struct
sql_sys_t
sql_sys_t
;
typedef
struct
sql_stmt_t
sql_stmt_t
;
typedef
int
(
*
sql_query_callback_t
)
(
void
*
,
int
,
char
**
,
char
**
);
typedef
enum
{
SQL_NULL
,
SQL_INT
,
SQL_DOUBLE
,
SQL_TEXT
,
SQL_BLOB
}
sql_type_e
;
typedef
struct
{
int
length
;
union
{
int
i
;
double
dbl
;
char
*
psz
;
void
*
ptr
;
}
value
;
}
sql_value_t
;
struct
sql_t
{
VLC_COMMON_MEMBERS
...
...
@@ -60,6 +87,7 @@ struct sql_t
/** Internal data */
sql_sys_t
*
p_sys
;
/** All the functions are implemented as threadsafe functions */
/** Perform a query with a row-by-row callback function */
int
(
*
pf_query_callback
)
(
sql_t
*
,
const
char
*
,
sql_query_callback_t
,
void
*
);
...
...
@@ -79,12 +107,36 @@ struct sql_t
int
(
*
pf_begin
)
(
sql_t
*
);
/** Commit transaction */
void
(
*
pf_commit
)
(
sql_t
*
);
int
(
*
pf_commit
)
(
sql_t
*
);
/** Rollback transaction */
void
(
*
pf_rollback
)
(
sql_t
*
);
};
int
(
*
pf_rollback
)
(
sql_t
*
);
/** Create a statement object */
sql_stmt_t
*
(
*
pf_prepare
)
(
sql_t
*
p_sql
,
const
char
*
p_fmt
,
int
i_length
);
/** Bind parameters to a statement */
int
(
*
pf_bind
)
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_pos
,
unsigned
int
type
,
const
sql_value_t
*
p_value
);
/** Run the prepared statement */
int
(
*
pf_run
)
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
);
/** Reset the prepared statement */
int
(
*
pf_reset
)
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
);
/** Destroy the statement object */
int
(
*
pf_finalize
)
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
);
/** Get the datatype for a specified column */
int
(
*
pf_gettype
)
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
int
*
type
);
/** Get the data from a specified column */
int
(
*
pf_getcolumn
)
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
int
type
,
sql_value_t
*
p_res
);
};
/*****************************************************************************
* SQL Function headers
...
...
@@ -125,7 +177,8 @@ VLC_EXPORT( void, sql_Destroy, ( vlc_object_t *obj ) );
* 4th is the columns names (array of strings).
* @param p_opaque Any pointer to an object you may need in the callback.
* @return VLC_SUCCESS or VLC_EGENERIC.
* @note The query will not necessarily be processed in a separate thread!
* @note The query will not necessarily be processed in a separate thread, but
* it is threadsafe
**/
static
inline
int
sql_QueryCallback
(
sql_t
*
p_sql
,
const
char
*
psz_query
,
sql_query_callback_t
pf_callback
,
...
...
@@ -151,6 +204,7 @@ static inline int sql_QueryCallback( sql_t *p_sql, const char *psz_query,
* *pi_rows will be the number of result rows, so that the number of text rows
* in ppsz_result will be (*pi_rows + 1) (because of row 0).
* To get result[row,col] use (*pppsz_result)[ (row+1) * (*pi_cols) + col ].
* This function is threadsafe
**/
static
inline
int
sql_Query
(
sql_t
*
p_sql
,
const
char
*
psz_query
,
char
***
pppsz_result
,
int
*
pi_rows
,
int
*
pi_cols
)
...
...
@@ -164,6 +218,7 @@ static inline int sql_Query( sql_t *p_sql, const char *psz_query,
* @param pppsz_tables Pointer to an array of strings. Dynamically allocated.
* Similar to pppsz_result of sql_Query but with only one row.
* @return Number of tables or <0 in case of error.
* @note This function is threadsafe
**/
static
inline
int
sql_GetTables
(
sql_t
*
p_sql
,
char
***
pppsz_tables
)
{
...
...
@@ -175,6 +230,7 @@ static inline int sql_GetTables( sql_t *p_sql, char ***pppsz_tables )
* @param p_sql This SQL object.
* @param ppsz_result The result of sql_Query or sql_GetTables. See above.
* @return Nothing.
* @note This function is threadsafe
**/
static
inline
void
sql_Free
(
sql_t
*
p_sql
,
char
**
ppsz_result
)
{
...
...
@@ -215,6 +271,7 @@ static inline char* sql_VPrintf( sql_t *p_sql, const char *psz_fmt,
* @brief Begin a SQL transaction
* @param p_sql The SQL object
* @return VLC error code or success
* @note This function is threadsafe
**/
static
inline
int
sql_BeginTransaction
(
sql_t
*
p_sql
)
{
...
...
@@ -225,20 +282,279 @@ static inline int sql_BeginTransaction( sql_t *p_sql )
* @brief Commit a SQL transaction
* @param p_sql The SQL object
* @return VLC error code or success
* @note This function is threadsafe
**/
static
inline
void
sql_CommitTransaction
(
sql_t
*
p_sql
)
static
inline
int
sql_CommitTransaction
(
sql_t
*
p_sql
)
{
p_sql
->
pf_commit
(
p_sql
);
return
p_sql
->
pf_commit
(
p_sql
);
}
/**
* @brief Rollback a SQL transaction
* @param p_sql The SQL object
* @return VLC error code or success
* @note This function is threadsafe
**/
static
inline
void
sql_RollbackTransaction
(
sql_t
*
p_sql
)
static
inline
int
sql_RollbackTransaction
(
sql_t
*
p_sql
)
{
return
p_sql
->
pf_rollback
(
p_sql
);
}
/**
* @brief Prepare an sql statement
* @param p_sql The SQL object
* @param p_fmt SQL query string
* @param i_length length of the string. If negative, length will be
* considered upto the first \0 character equivalent to strlen(p_fmt).
* Otherwise the first i_length bytes will be used
* @return a sql_stmt_t pointer or NULL on failure
*/
static
inline
sql_stmt_t
*
sql_Prepare
(
sql_t
*
p_sql
,
const
char
*
p_fmt
,
int
i_length
)
{
return
p_sql
->
pf_prepare
(
p_sql
,
p_fmt
,
i_length
);
}
/**
* @brief Bind arguments to a sql_stmt_t object
* @param p_sql The SQL object
* @param p_stmt Statement Object
* @param type Data type of the value
* @param p_value Value to be bound
* @param i_pos Position at which the parameter should be bound
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_BindGeneric
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_pos
,
int
type
,
const
sql_value_t
*
p_value
)
{
return
p_sql
->
pf_bind
(
p_sql
,
p_stmt
,
i_pos
,
type
,
p_value
);
}
/**
* @brief Bind a NULL value to a position
* @param p_sql The SQL object
* @param p_stmt Statement Object
* @param i_pos Position at which the parameter should be bound
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_BindNull
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_pos
)
{
int
i_ret
=
sql_BindGeneric
(
p_sql
,
p_stmt
,
i_pos
,
SQL_NULL
,
NULL
);
return
i_ret
;
}
/**
* @brief Bind an integer to the statement object at some position
* @param p_sql The SQL object
* @param p_stmt Statement Object
* @param i_pos Position at which the parameter should be bound
* @param i_int Value to be bound
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_BindInteger
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_pos
,
int
i_int
)
{
sql_value_t
value
;
value
.
length
=
0
;
value
.
value
.
i
=
i_int
;
int
i_ret
=
sql_BindGeneric
(
p_sql
,
p_stmt
,
i_pos
,
SQL_INT
,
&
value
);
return
i_ret
;
}
/**
* @brief Bind a double to the statement object at some position
* @param p_sql The SQL object
* @param p_stmt Statement Object
* @param i_pos Position at which the parameter should be bound
* @param d_dbl Value to be bound
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_BindDouble
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_pos
,
double
d_dbl
)
{
sql_value_t
value
;
value
.
length
=
0
;
value
.
value
.
dbl
=
d_dbl
;
int
i_ret
=
sql_BindGeneric
(
p_sql
,
p_stmt
,
i_pos
,
SQL_INT
,
&
value
);
return
i_ret
;
}
/**
* @brief Bind Text to the statement
* @param p_sql The SQL object
* @param p_stmt Statement Object
* @param i_pos Position at which the parameter should be bound
* @param p_fmt Value to be bound
* @param i_length Length of text. If -ve text upto the first null char
* will be selected.
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_BindText
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_pos
,
char
*
p_fmt
,
int
i_length
)
{
sql_value_t
value
;
value
.
length
=
i_length
;
value
.
value
.
psz
=
p_fmt
;
int
i_ret
=
sql_BindGeneric
(
p_sql
,
p_stmt
,
i_pos
,
SQL_TEXT
,
&
value
);
return
i_ret
;
}
/**
* @brief Bind a binary object to the statement
* @param p_sql The SQL object
* @param p_stmt Statement Object
* @param i_pos Position at which the parameter should be bound
* @param p_ptr Value to be bound
* @param i_length Size of the blob to read
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_BindBlob
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_pos
,
void
*
p_ptr
,
int
i_length
)
{
sql_value_t
value
;
value
.
length
=
i_length
;
value
.
value
.
ptr
=
p_ptr
;
int
i_ret
=
sql_BindGeneric
(
p_sql
,
p_stmt
,
i_pos
,
SQL_INT
,
&
value
);
return
i_ret
;
}
/**
* @brief Run the SQL statement. If the statement fetches data, then only
* one row of the data is fetched at a time. Run this function again to
* fetch the next row.
* @param p_sql The SQL object
* @param p_stmt The statement
* @return VLC_SQL_DONE if done fetching all rows or there are no rows to fetch
* VLC_SQL_ROW if a row was fetched for this statement.
* VLC_EGENERIC if this function failed
*/
static
inline
int
sql_Run
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
)
{
return
p_sql
->
pf_run
(
p_sql
,
p_stmt
);
}
/**
* @brief Reset the SQL statement. Resetting the statement will unbind all
* the values that were bound on this statement
* @param p_sql The SQL object
* @param p_stmt The sql statement object
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_Reset
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
)
{
return
p_sql
->
pf_reset
(
p_sql
,
p_stmt
);
}
/**
* @brief Destroy the sql statement object. This will free memory.
* @param p_sql The SQL object
* @param p_stmt The statement object
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_Finalize
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
)
{
return
p_sql
->
pf_finalize
(
p_sql
,
p_stmt
);
}
/**
* @brief Get the datatype of the result of the column
* @param p_sql The SQL object
* @param p_stmt The sql statement object
* @param i_col The column
* @param type pointer to datatype of the given column
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_GetColumnType
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
int
*
type
)
{
return
p_sql
->
pf_gettype
(
p_sql
,
p_stmt
,
i_col
,
type
);
}
/**
* @brief Get the column data
* @param p_sql The SQL object
* @param p_stmt The statement object
* @param i_col The column number
* @param type Datatype of result
* @param p_res The structure which contains the value of the result
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_GetColumn
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
int
type
,
sql_value_t
*
p_res
)
{
return
p_sql
->
pf_getcolumn
(
p_sql
,
p_stmt
,
i_col
,
type
,
p_res
);
}
/**
* @brief Get an integer from the results of a statement
* @param p_sql The SQL object
* @param p_stmt The statement object
* @param i_col The column number
* @param i_res Pointer of the location for result to be stored
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_GetColumnInteger
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
int
*
pi_res
)
{
sql_value_t
tmp
;
int
i_ret
=
p_sql
->
pf_getcolumn
(
p_sql
,
p_stmt
,
i_col
,
SQL_INT
,
&
tmp
);
if
(
i_ret
==
VLC_SUCCESS
)
*
pi_res
=
tmp
.
value
.
i
;
return
i_ret
;
}
/**
* @brief Get a double from the results of a statement
* @param p_sql The SQL object
* @param p_stmt The statement object
* @param i_col The column number
* @param d_res Pointer of the location for result to be stored
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_GetColumnDouble
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
double
*
pd_res
)
{
sql_value_t
tmp
;
int
i_ret
=
p_sql
->
pf_getcolumn
(
p_sql
,
p_stmt
,
i_col
,
SQL_DOUBLE
,
&
tmp
);
if
(
i_ret
==
VLC_SUCCESS
)
*
pd_res
=
tmp
.
value
.
dbl
;
return
i_ret
;
}
/**
* @brief Get some text from the results of a statement
* @param p_sql The SQL object
* @param p_stmt The statement object
* @param i_col The column number
* @param pp_res Pointer of the location for result to be stored
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_GetColumnText
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
char
**
pp_res
)
{
sql_value_t
tmp
;
int
i_ret
=
p_sql
->
pf_getcolumn
(
p_sql
,
p_stmt
,
i_col
,
SQL_TEXT
,
&
tmp
);
if
(
i_ret
==
VLC_SUCCESS
)
*
pp_res
=
tmp
.
value
.
psz
;
return
i_ret
;
}
/**
* @brief Get a blob from the results of a statement
* @param p_sql The SQL object
* @param p_stmt The statement object
* @param i_col The column number
* @param pp_res Pointer of the location for result to be stored
* @return VLC_SUCCESS or VLC_EGENERIC
*/
static
inline
int
sql_GetColumnBlob
(
sql_t
*
p_sql
,
sql_stmt_t
*
p_stmt
,
int
i_col
,
void
**
pp_res
)
{
p_sql
->
pf_rollback
(
p_sql
);
sql_value_t
tmp
;
int
i_ret
=
p_sql
->
pf_getcolumn
(
p_sql
,
p_stmt
,
i_col
,
SQL_BLOB
,
&
tmp
);
if
(
i_ret
==
VLC_SUCCESS
)
*
pp_res
=
tmp
.
value
.
ptr
;
return
i_ret
;
}
# ifdef __cplusplus
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment