[vlc-devel] commit: SQL/SQLite: Fix GetColumn functions in SQLite and implement a GetColumnSize function ( Srikanth Raju )

git version control git at videolan.org
Fri Dec 4 12:50:27 CET 2009


vlc | branch: master | Srikanth Raju <srikiraju at gmail.com> | Mon Nov 30 14:46:00 2009 +0530| [484f5608bc27d45bfb0a435ce4a7d53c95457d1d] | committer: Jean-Baptiste Kempf 

SQL/SQLite: Fix GetColumn functions in SQLite and implement a GetColumnSize function

Add a GetColumnSize function in the SQL API.

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=484f5608bc27d45bfb0a435ce4a7d53c95457d1d
---

 include/vlc_sql.h     |   16 ++++++++++++++++
 modules/misc/sqlite.c |   37 +++++++++++++++++++++++++++++++++++--
 2 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/include/vlc_sql.h b/include/vlc_sql.h
index ad325f5..ef4ebca 100644
--- a/include/vlc_sql.h
+++ b/include/vlc_sql.h
@@ -136,6 +136,9 @@ struct sql_t
     /** 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 );
+
+    /** Get column size of a specified column */
+    int (*pf_getcolumnsize) ( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col );
 };
 
 /*****************************************************************************
@@ -557,6 +560,19 @@ static inline int sql_GetColumnBlob( sql_t* p_sql, sql_stmt_t* p_stmt,
     return i_ret;
 }
 
+/**
+ * @brief Get the size of the column in bytes
+ * @param p_sql The SQL object
+ * @param p_stmt The sql statement object
+ * @param i_col The column
+ * @return Size of the column in bytes, excluding the zero terminator
+ */
+static inline int sql_GetColumnSize( sql_t* p_sql, sql_stmt_t* p_stmt,
+        int i_col )
+{
+    return p_sql->pf_getcolumnsize( p_sql, p_stmt, i_col );
+}
+
 # ifdef __cplusplus
 }
 # endif /* C++ extern "C" */
diff --git a/modules/misc/sqlite.c b/modules/misc/sqlite.c
index 7eb182f..6b47b1c 100644
--- a/modules/misc/sqlite.c
+++ b/modules/misc/sqlite.c
@@ -104,6 +104,9 @@ static int GetColumnTypeFromStatement( sql_t* p_sql,
                                        sql_stmt_t* p_stmt,
                                        int i_col,
                                        int* pi_type );
+static int GetColumnSize( sql_t* p_sql,
+                          sql_stmt_t* p_stmt,
+                          int i_col );
 
 /*****************************************************************************
  * Module description
@@ -160,6 +163,7 @@ static int load( vlc_object_t *p_this )
     p_sql->pf_finalize = StatementFinalize;
     p_sql->pf_gettype = GetColumnTypeFromStatement;
     p_sql->pf_getcolumn = GetColumnFromStatement;
+    p_sql->pf_getcolumnsize = GetColumnSize;
 
     return VLC_SUCCESS;
 }
@@ -657,6 +661,9 @@ static int GetColumnFromStatement( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col,
     assert( p_stmt->p_sqlitestmt );
     int i_ret = VLC_SUCCESS;
     vlc_mutex_lock( &p_sql->p_sys->lock );
+    const unsigned char* psz;
+    const void* ptr;
+    int size;
     switch( type )
     {
         case SQL_INT:
@@ -666,10 +673,22 @@ static int GetColumnFromStatement( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col,
             p_res->value.dbl = sqlite3_column_double( p_stmt->p_sqlitestmt, i_col );
             break;
         case SQL_TEXT:
-            p_res->value.psz = sqlite3_column_text( p_stmt->p_sqlitestmt, i_col );
+            psz = sqlite3_column_text( p_stmt->p_sqlitestmt, i_col );
+            if( psz )
+                p_res->value.psz = strdup( (const char* ) psz );
             break;
         case SQL_BLOB:
-            p_res->value.ptr = sqlite3_column_blob( p_stmt->p_sqlitestmt, i_col );
+            ptr = sqlite3_column_blob( p_stmt->p_sqlitestmt, i_col );
+            size = sqlite3_column_bytes( p_stmt->p_sqlitestmt, i_col );
+            if( ptr )
+            {
+                p_res->value.ptr = malloc( size );
+                p_res->length = size;
+                if( p_res->value.ptr )
+                    memcpy( p_res->value.ptr, ptr, size );
+                else
+                    i_ret = VLC_ENOMEM;
+            }
             break;
         case SQL_NULL:
         default:
@@ -720,3 +739,17 @@ static int GetColumnTypeFromStatement( sql_t* p_sql, sql_stmt_t* p_stmt, int i_c
     vlc_mutex_unlock( &p_sql->p_sys->lock );
     return i_ret;
 }
+
+/**
+ * @brief Get the size of the column in bytes
+ * @param p_sql The SQL object
+ * @param p_stmt The sql statement object
+ * @param i_col The column
+ * @return Size of the column in bytes, undefined for invalid columns
+ */
+static int GetColumnSize( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col )
+{
+    assert( p_sql->p_sys->db );
+    assert( p_stmt->p_sqlitestmt );
+    return sqlite3_column_bytes( p_stmt->p_sqlitestmt, i_col );
+}




More information about the vlc-devel mailing list