ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/lte-telephony/apps/NVM_Proxy/source/sql_repo.c b/marvell/lte-telephony/apps/NVM_Proxy/source/sql_repo.c
new file mode 100644
index 0000000..364aefd
--- /dev/null
+++ b/marvell/lte-telephony/apps/NVM_Proxy/source/sql_repo.c
@@ -0,0 +1,1022 @@
+/******************************************************************************
+*(C) Copyright 2011 Marvell International Ltd.
+* All Rights Reserved
+******************************************************************************/
+/*--------------------------------------------------------------------------------------------------------------------
+ * -------------------------------------------------------------------------------------------------------------------
+ *
+ * Filename: sql_repo.c
+ *
+ * Description: The API to record the file states and opreations into the sqlite3 based database.
+ *
+ * History:
+ * July, 22 2013 - Zhongmin Wu(zmwu@marvell.com) Creation of file
+ *
+ * Notes:
+ *
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <errno.h>
+#include "nvm_repo.h"
+#ifndef DISABLE_SQL_NVM
+#include "sqlite3.h"
+#endif
+#include "pxa_dbg.h"
+
+#ifndef DISABLE_SQL_NVM
+
+#define TABLE_SIZE 100
+/*
+--------------------------------------------------------------------------
+|id |filename|targetname |operation |attribute |offset |size |state |crc | time |reserved|
+--------------------------------------------------------------------------
+*/
+static list_file_info * list_file = NULL;
+
+static sqlite3 * sqlite;
+
+static list_file_info * file_info_malloc(void)
+{
+ list_file_info * p = malloc(sizeof(list_file_info));
+ if( p == NULL)
+ ERRMSG("Can't malloc file info!");
+ else
+ memset(p, 0, sizeof(list_file_info));
+ return p;
+}
+
+static void file_info_free(list_file_info * p)
+{
+ if(p)
+ {
+ if(p->file_name)
+ free(p->file_name);
+ if(p->target_name)
+ free(p->target_name);
+ free(p);
+ }
+}
+static void insert_list_file(list_file_info *p)
+{
+ if(p)
+ {
+ if(list_file == NULL)
+ {
+ list_file = p;
+ }
+ else
+ {
+ p->next = list_file->next;
+ list_file->next = p;
+ }
+ }
+}
+
+static void format_table_name(const char * file_name, char * table_name)
+{
+ while(*file_name)
+ {
+ *table_name = (*file_name == '.' )? '_' : *file_name;
+ file_name ++;
+ table_name ++;
+ }
+ *table_name = *file_name;
+}
+static int process_sql(const char * sql, sqlite3_callback callback, void *arg)
+{
+ int rc = 0;
+ char * error = NULL;
+ DBGMSG("Begin to process sql :%s", sql);
+ rc = sqlite3_exec(sqlite, sql, callback, arg, &error);
+ if(error)
+ {
+ ERRMSG("process sql error : %s", error);
+ sqlite3_free(error);
+ }
+ DBGMSG("Process sql result : %d", rc);
+ if(rc != SQLITE_OK)
+ {
+ rc = -1;
+ }
+ return rc;
+}
+
+static list_file_info * create_file_info(sqlite3 * sqldb, const char * table_name)
+{
+ int rc;
+ char **azResult;
+ int nRow;
+ int nColumn;
+ char *zErrMsg = NULL;
+ list_file_info * file_info = NULL;
+ file_info = file_info_malloc();
+ if(file_info)
+ {
+ if(table_name)
+ {
+ char * sql = NULL;
+ asprintf(&sql,
+ "SELECT filename, targetname, operation, state, crc FROM %s ORDER BY id DESC LIMIT 0, 1",
+ table_name);
+ if(!sql)
+ goto error;
+ rc = sqlite3_get_table(sqldb, sql, &azResult, &nRow, &nColumn, &zErrMsg);
+ if( zErrMsg )
+ {
+ ERRMSG("Error: %s\n", zErrMsg);
+ sqlite3_free(zErrMsg);
+ }
+ if( rc != SQLITE_OK )
+ {
+ ERRMSG("Error: querying %s\n", table_name);
+ rc = -1;
+ }
+ else
+ {
+
+ if(azResult[3 + nColumn])
+ file_info->status = atoi(azResult[3 + nColumn]);
+ if(azResult[2 + nColumn])
+ file_info->operation = atoi(azResult[2 + nColumn]);
+ if(file_info->operation == RENAME)
+ asprintf(&file_info->target_name, "%s", azResult[1 + nColumn]);
+ asprintf(&file_info->file_name, "%s", azResult[0 + nColumn]);
+
+ if( (file_info->status == STAGED || file_info->status == COMMITTED) && file_info->operation == UPDATE)
+ {
+ if(azResult[4 + nColumn])
+ {
+ char * endchar;
+
+ errno = 0;
+ file_info->crc = strtoul(azResult[4 + nColumn], &endchar, 10);
+ if(errno == ERANGE)
+ {
+ ERRMSG("out of range");
+ }
+ if(endchar == azResult[4 + nColumn])
+ {
+ ERRMSG("no digits");
+ }
+ }
+ }
+
+ DBGMSG("get file %s info: status:%d, operation %d, target name:%s, crc:%u, next:%p",
+ file_info->file_name, file_info->status, file_info->operation, file_info->target_name, file_info->crc, file_info->next);
+ rc = 0;
+ }
+ sqlite3_free_table(azResult);
+ free(sql);
+ if(rc < 0)
+ goto error;
+ }
+ else
+ goto error;
+ }
+ goto exit;
+error:
+ free(file_info);
+ file_info = NULL;
+exit:
+ return file_info;
+
+}
+static int init_list_file_info(sqlite3 * sqldb)
+{
+ int rc;
+ char **azResult;
+ int nRow;
+ char *zErrMsg = NULL;
+ if(sqldb == NULL)
+ return -1;
+ rc = sqlite3_get_table(sqldb,
+ "SELECT name FROM sqlite_master "
+ "WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' "
+ "UNION ALL "
+ "SELECT name FROM sqlite_temp_master "
+ "WHERE type IN ('table', 'view') "
+ "ORDER BY 1",
+ &azResult, &nRow, 0, &zErrMsg);
+ if( zErrMsg )
+ {
+ ERRMSG("Error: %s\n", zErrMsg);
+ sqlite3_free(zErrMsg);
+ }
+ if( rc != SQLITE_OK )
+ {
+ ERRMSG("Error: querying sqlite_master and sqlite_temp_master\n");
+ rc = -1;
+ }
+ else
+ {
+ int i;
+ for(i=1; i<=nRow; i++)
+ {
+ list_file_info * p;
+ if( azResult[i] == NULL ) continue;
+ p = create_file_info(sqldb,azResult[i]);
+ insert_list_file(p);
+ }
+ rc = 0;
+ }
+ sqlite3_free_table(azResult);
+ return rc;
+
+}
+
+static void deinit_list_file_info(void)
+{
+ list_file_info * p = list_file;
+ while(p)
+ {
+ list_file_info * current = p;
+ p = p->next;
+ file_info_free(current);
+ }
+ list_file = NULL;
+}
+
+static int set_sql_db(void)
+{
+ process_sql("PRAGMA journal_mode=WAL", NULL, NULL);
+ process_sql("PRAGMA synchronous=NORMAL", NULL, NULL);
+ process_sql("PRAGMA temp_store=MEMORY", NULL, NULL);
+ process_sql("PRAGMA wal_autocheckpoint=0", NULL, NULL);
+ return 0;
+}
+int nvm_repo_init(const char * repo_name)
+{
+ char * dbfile = NULL;
+ int ret;
+ asprintf(&dbfile,"%s.db", repo_name);
+ if(dbfile)
+ {
+ ret = sqlite3_open(dbfile, &sqlite);
+ if(ret != SQLITE_OK)
+ {
+ ERRMSG("Can't open data base:%s", dbfile);
+ free(dbfile);
+ return -1;
+ }
+ set_sql_db();
+ init_list_file_info(sqlite);
+ free(dbfile);
+ return 0;
+ }
+ return -1;
+}
+
+int nvm_repo_deinit(void)
+{
+ int ret;
+ ret = sqlite3_close(sqlite);
+ if(ret != SQLITE_OK)
+ {
+ ERRMSG("Can't close data base.");
+ return -1;
+ }
+ deinit_list_file_info();
+ return 0;
+}
+
+list_file_info * get_file_info(const char * file_name)
+{
+ list_file_info * p = list_file;
+ while(p)
+ {
+ if( p->file_name && !strcmp(p->file_name, file_name))
+ return p;
+ p = p->next;
+ }
+ return NULL;
+}
+
+
+static list_file_info * delete_file_info(const char * file_name)
+{
+ list_file_info * p = list_file;
+ list_file_info * pre = NULL;
+ if(p == NULL)
+ return NULL;
+ if(strcmp(p->file_name, file_name) == 0)
+ {
+ list_file = p->next;
+ return p;
+ }
+ pre = p;
+ p = p->next;
+ while(p != NULL)
+ {
+ if(strcmp(p->file_name, file_name) == 0)
+ {
+ pre->next = p->next;
+ return p;
+ }
+ pre = p;
+ p = p->next;
+ };
+ return NULL;
+
+}
+list_file_info * get_tracked_files(void)
+{
+ return list_file;
+}
+
+static int create_table_size_trigger(const char * file_name, int size)
+{
+ char * sql = NULL;
+ int rc =-1;
+ char *table_name;
+ char *trigger_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+ asprintf(&trigger_name, "%s_size_trigger", table_name);
+ if(!trigger_name)
+ {
+ free(table_name);
+ return -1;
+ }
+
+ asprintf(&sql, "CREATE TRIGGER %s UPDATE of state ON %s WHEN (NEW.state=%d) AND ( (select count(*) from %s) > %d) "
+ "BEGIN DELETE from %s WHERE "
+ "(id<(SELECT id FROM (SELECT * FROM %s ORDER BY id DESC LIMIT 0, %d) "
+ "WHERE state=%d LIMIT 0,1)) AND (id>1); END",
+ trigger_name, table_name, COMMITTED, table_name, size, table_name, table_name, size, COMMITTED);
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ free(sql);
+ }
+
+ free(table_name);
+ free(trigger_name);
+ return rc;
+}
+
+int track_file(const char * file_name)
+{
+ int rc = 0;
+ char *zErrMsg;
+ char *table_name;
+
+ if(get_file_info(file_name) == NULL)
+ {
+ char * sql = NULL;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+
+ asprintf(&sql, "CREATE TABLE %s ("
+ "id integer primary key autoincrement, "
+ "filename nvarchar(256), "
+ "targetname nvarchar(256), "
+ "operation integer, "
+ "attribute nvarchar(8), "
+ "offset integer, "
+ "size integer, "
+ "state integer, "
+ "crc integer, "
+ "time timestamp NOT NULL DEFAULT (strftime('%%m-%%d %%H:%%M:%%f', 'now', 'localtime')), "
+ "reserved)",
+ table_name);
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ free(sql);
+ if( rc == 0)
+ {
+ char *sql = NULL;
+ asprintf(&sql, "INSERT INTO %s (filename, state, operation) VALUES ('%s', %d, %d)",
+ table_name, file_name, COMMITTED, CREATED);
+ rc = -1;
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ if(rc == 0)
+ {
+ list_file_info * p = file_info_malloc();
+ if(p)
+ {
+ asprintf(&p->file_name, "%s", file_name);
+ p->status = COMMITTED;
+ insert_list_file(p);
+ }
+ rc = create_table_size_trigger(file_name, TABLE_SIZE);
+ }
+ free(sql);
+ }
+ }
+ }
+ else
+ rc = -1;
+ free(table_name);
+ }
+ return rc;
+}
+
+int insert_file_operation(const char * file_name, const char * target_name, enum_file_operation operation,
+ int offset, int size, const void * data)
+{
+ char *sql = NULL;
+ int rc = -1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+ if(operation == RENAME)
+ {
+ asprintf(&sql, "INSERT INTO %s "
+ "(filename, targetname, operation, offset, size, state) "
+ "VALUES ('%s', '%s', %d, %d, %d, %d)",
+ table_name, file_name, target_name, operation, offset, size, CHANGED);
+ }
+ else
+ {
+ asprintf(&sql, "INSERT INTO %s "
+ "(filename, operation, offset, size, state) "
+ "VALUES ('%s', %d, %d, %d, %d)",
+ table_name, file_name, operation, offset, size, CHANGED);
+ }
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ free(sql);
+ }
+ free(table_name);
+ return rc;
+}
+
+int record_file_operation(const char * file_name, const char * target_name, enum_file_operation operation,
+ int offset, int size, unsigned crc, enum_file_status status)
+{
+ char *sql = NULL;
+ int rc = -1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+ if(operation == RENAME)
+ {
+ asprintf(&sql, "INSERT INTO %s "
+ "(filename, targetname, operation, offset, size, state) "
+ "VALUES ('%s', '%s', %d, %d, %d, %d)",
+ table_name, file_name, target_name, operation, offset, size, status);
+ }
+ else
+ {
+ asprintf(&sql, "INSERT INTO %s "
+ "(filename, operation, offset, size, state, crc) "
+ "VALUES ('%s', %d, %d, %d, %d, %u)",
+ table_name, file_name, operation, offset, size, status, crc);
+ }
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ free(sql);
+ }
+ free(table_name);
+ if(rc == 0)
+ sqlite3_wal_checkpoint(sqlite, NULL);
+ return rc;
+}
+
+static int select_file_callback( void * para, int n_column, char ** column_value, char ** column_name)
+{
+ list_file_info * p = (list_file_info *) para;
+ if(p != NULL)
+ {
+ DBGMSG("file %s info is updating from operation:%d state:%d, crc:%u", p->file_name, p->operation,
+ p->status, p->crc);
+ if(column_value[1])
+ p->operation = atoi(column_value[1]);
+ if(column_value[2])
+ p->status = atoi(column_value[2]);
+ if(p->operation == RENAME)
+ {
+ if(p->target_name)
+ free(p->target_name);
+ asprintf(&p->target_name, "%s", column_value[0]);
+ }
+ p->crc = 0;
+ if( (p->status == STAGED || p->status == COMMITTED) && p->operation == UPDATE)
+ {
+ if(column_value[3])
+ {
+ char * endchar;
+
+ errno = 0;
+ p->crc = strtoul(column_value[3], &endchar, 10);
+ if(errno == ERANGE)
+ {
+ ERRMSG("out of range");
+ }
+ if(endchar == column_value[3])
+ {
+ ERRMSG("no digits");
+ }
+ }
+ }
+ DBGMSG("file %s info is updated to operation:%d state:%d, crc:%u", p->file_name, p->operation,
+ p->status, p->crc);
+ }
+ return 0;
+}
+
+static int update_file_info(const char * file_name)
+{
+ char * sql = NULL;
+ int rc =-1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+
+ asprintf(&sql,
+ "SELECT targetname, operation, state, crc FROM %s ORDER BY id DESC LIMIT 0, 1",
+ table_name);
+ if(sql)
+ {
+ list_file_info * p = get_file_info(file_name);
+ rc = process_sql(sql,select_file_callback,p);
+ free(sql);
+ }
+ free(table_name);
+ return rc;
+}
+
+static int recorder_number_callbak( void * para, int n_column, char ** column_value, char ** column_name)
+{
+ int * number = ( int * )para;
+ if(column_value[0])
+ *number = atoi(column_value[0]);
+ else
+ *number = 0;
+ return 0;
+}
+
+static int get_recorder_number(const char * file_name)
+{
+ char * sql = NULL;
+ int rc =-1;
+ int number = 0;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+ asprintf(&sql, "SELECT count(*) from %s", table_name);
+ if(sql)
+ {
+ rc = process_sql(sql,recorder_number_callbak, &number);
+ DBGMSG(" get_recorder_number file %s number %d",file_name, number);
+ free(sql);
+ }
+ free(table_name);
+ return number;
+}
+
+static int keep_table_size(const char * file_name, int size)
+{
+ char * sql = NULL;
+ int rc =-1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+
+ DBGMSG(" keep file %s table size to %d", file_name, size);
+ if(get_recorder_number(file_name) > size)
+ {
+ asprintf(&sql, "DELETE from %s WHERE "
+ "(id<(SELECT id FROM (SELECT * FROM %s ORDER BY id DESC LIMIT 0, %d) "
+ "WHERE state=%d LIMIT 0,1)) AND (id>1)", table_name, table_name, size, COMMITTED);
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ free(sql);
+ }
+ }
+ else
+ rc = 0;
+ free(table_name);
+ return rc;
+}
+
+static int change_last_state(const char * file_name, enum_file_status state, unsigned int crc)
+{
+ char * sql = NULL;
+ int rc = -1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+
+ if(crc > 0)
+ asprintf(&sql, "UPDATE %s "
+ "SET state=%d, "
+ "crc=%u, "
+ "time=strftime('%%m-%%d %%H:%%M:%%f', 'now', 'localtime') "
+ "WHERE id IN "
+ "(SELECT id FROM %s ORDER BY id DESC LIMIT 0,1)",
+ table_name, state, crc, table_name);
+ else
+ asprintf(&sql, "UPDATE %s "
+ "SET state=%d, "
+ "time=strftime('%%m-%%d %%H:%%M:%%f', 'now', 'localtime') "
+ "WHERE id IN "
+ "(SELECT id FROM %s ORDER BY id DESC LIMIT 0,1)",
+ table_name, state, table_name);
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ if(rc == 0)
+ {
+ //update_file_info(file_name);
+ list_file_info * p = get_file_info(file_name);
+ p->crc = crc;
+ p->status = state;
+ }
+ free(sql);
+ }
+ free(table_name);
+ return rc;
+}
+
+int stage_file(const char * file_name)
+{
+ int rc;
+ rc = change_last_state(file_name, STAGED, 0);
+ sqlite3_wal_checkpoint(sqlite, NULL);
+ return rc;
+}
+
+int commit_file(const char * file_name)
+{
+
+ int rc;
+ rc = change_last_state(file_name, COMMITTED, 0);
+ sqlite3_wal_checkpoint(sqlite, NULL);
+ return rc;
+}
+
+int stage_file_crc(const char * file_name, unsigned int crc)
+{
+ int rc;
+ rc = change_last_state(file_name, STAGED, crc);
+ sqlite3_wal_checkpoint(sqlite, NULL);
+ return rc;
+}
+
+int commit_file_crc(const char * file_name, unsigned int crc)
+{
+ int rc;
+ rc = change_last_state(file_name, COMMITTED, crc);
+ sqlite3_wal_checkpoint(sqlite, NULL);
+ return rc;
+}
+
+static int rebase_file_state(const char * file_name, enum_file_status state)
+{
+ char * sql = NULL;
+ int rc =-1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+ asprintf(&sql, "DELETE FROM %s "
+ "WHERE id > "
+ "(SELECT id FROM %s WHERE state=%d ORDER BY id DESC LIMIT 0,1)",
+ table_name, table_name, state);
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ if(rc == 0)
+ {
+ update_file_info(file_name);
+ sqlite3_wal_checkpoint(sqlite, NULL);
+ }
+ free(sql);
+ }
+ free(table_name);
+ return rc;
+}
+
+int reset_file_id(const char * file_name, unsigned int id)
+{
+ char * sql = NULL;
+ int rc =-1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+
+
+ asprintf(&sql, "DELETE FROM %s "
+ "WHERE id > %u",
+ table_name, id);
+ if(sql)
+ {
+ rc = process_sql(sql, NULL, NULL);
+ if(rc == 0)
+ {
+ update_file_info(file_name);
+ sqlite3_wal_checkpoint(sqlite, NULL);
+ }
+ free(sql);
+ }
+ free(table_name);
+ return rc;
+}
+
+int revert_last_commit(const char * file_name)
+{
+ return rebase_file_state(file_name, COMMITTED);
+}
+
+static int find_commit_callbak( void * para, int n_column, char ** column_value, char ** column_name)
+{
+ unsigned int * id = (unsigned int *)para;
+ if(n_column > 0)
+ {
+ char *end;
+ *id = strtol(column_value[0], &end, 10);
+ DBGMSG("find_commit_callbak find id %u", *id);
+ }
+ else
+ {
+ *id = 0;
+ DBGMSG("find_commit_callbak find error", *id);
+ }
+ return 0;
+}
+
+unsigned int find_commit(const char * file_name, enum_file_status state, unsigned long crc)
+{
+ char * sql = NULL;
+ int rc =-1;
+ unsigned int id = 0;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+
+ format_table_name(file_name, table_name);
+
+ asprintf(&sql, "SELECT id "
+ "FROM %s WHERE state = %d "
+ "AND crc=%lu ORDER BY id DESC LIMIT 0,1",
+ table_name, state, crc);
+ if(sql)
+ {
+ rc = process_sql(sql, find_commit_callbak, &id);
+ DBGMSG("find_commit find id %u", id);
+ free(sql);
+ }
+ free(table_name);
+ return id;
+}
+
+int reset_to_commit(const char * file_name, enum_file_status state, unsigned long crc)
+{
+ unsigned int id;
+ int rc = -1;
+ id = find_commit(file_name, state, crc);
+ if( id == 0)
+ {
+ return -1;
+ }
+ else
+ {
+ rc = reset_file_id(file_name, id);
+ return rc;
+ }
+}
+int untrack_file(const char * file_name)
+{
+ char * sql = NULL;
+ int rc =-1;
+ char *table_name;
+ table_name = malloc(strlen(file_name) + 1);
+ if(!table_name)
+ return -1;
+ format_table_name(file_name, table_name);
+ asprintf(&sql, "DROP TABLE %s", table_name);
+ if(sql)
+ {
+ DBGMSG("untracke_file %s in table %s", file_name, table_name);
+ rc = process_sql(sql, NULL, NULL);
+ if(rc == 0)
+ {
+ list_file_info *p;
+ p = delete_file_info(file_name);
+ file_info_free(p);
+ }
+ free(sql);
+ }
+ free(table_name);
+ return rc;
+}
+
+int begin_transaction(void)
+{
+ return process_sql("begin transaction", NULL,NULL);
+}
+
+int end_transaction(void)
+{
+ return process_sql("end transaction", NULL,NULL);
+}
+
+#else /* DISABLE_SQL_NVM is defined */
+
+typedef struct sqlite3 sqlite3;
+typedef int (*sqlite3_callback)(void*,int,char**, char**);
+
+static list_file_info * file_info_malloc(void)
+{
+ return 0;
+}
+static void file_info_free(list_file_info * p __attribute__ ((unused)))
+{
+ return;
+}
+static void insert_list_file(list_file_info *p __attribute__ ((unused)))
+{
+ return;
+}
+static void format_table_name(const char * file_name __attribute__ ((unused)),
+ char * table_name __attribute__ ((unused)))
+{
+ return;
+}
+static int process_sql(const char * sql __attribute__ ((unused)),
+ sqlite3_callback callback __attribute__ ((unused)),
+ void *arg __attribute__ ((unused)))
+{
+ return 0;
+}
+static list_file_info * create_file_info(sqlite3 * sqldb __attribute__ ((unused)),
+ const char * table_name __attribute__ ((unused)))
+{
+ return 0;
+}
+static int init_list_file_info(sqlite3 * sqldb __attribute__ ((unused)))
+{
+ return 0;
+}
+static void deinit_list_file_info(void)
+{
+ return;
+}
+static int set_sql_db(void)
+{
+ return 0;
+}
+int nvm_repo_init(const char * repo_name __attribute__ ((unused)))
+{
+ return 0;
+}
+int nvm_repo_deinit(void)
+{
+ return 0;
+}
+list_file_info * get_file_info(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+static list_file_info * delete_file_info(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+list_file_info * get_tracked_files(void)
+{
+ return 0;
+}
+static int create_table_size_trigger(const char * file_name __attribute__ ((unused)),
+ int size __attribute__ ((unused)))
+{
+ return 0;
+}
+int track_file(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+int insert_file_operation(const char * file_name __attribute__ ((unused)),
+ const char * target_name __attribute__ ((unused)),
+ enum_file_operation operation __attribute__ ((unused)),
+ int offset __attribute__ ((unused)),
+ int size __attribute__ ((unused)),
+ const void * data __attribute__ ((unused)))
+{
+ return 0;
+}
+static int select_file_callback( void * para __attribute__ ((unused)),
+ int n_column __attribute__ ((unused)),
+ char ** column_value __attribute__ ((unused)),
+ char ** column_name __attribute__ ((unused)))
+{
+ return 0;
+}
+static int update_file_info(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+static int recorder_number_callbak( void * para __attribute__ ((unused)),
+ int n_column __attribute__ ((unused)),
+ char ** column_value __attribute__ ((unused)),
+ char ** column_name __attribute__ ((unused)))
+{
+ return 0;
+}
+static int get_recorder_number(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+static int keep_table_size(const char * file_name __attribute__ ((unused)),
+ int size __attribute__ ((unused)))
+{
+ return 0;
+}
+static int change_last_state(const char * file_name __attribute__ ((unused)),
+ enum_file_status state __attribute__ ((unused)),
+ unsigned int crc __attribute__ ((unused)))
+{
+ return 0;
+}
+int stage_file(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+int commit_file(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+int stage_file_crc(const char * file_name __attribute__ ((unused)),
+ unsigned int crc __attribute__ ((unused)))
+{
+ return 0;
+}
+int commit_file_crc(const char * file_name __attribute__ ((unused)),
+ unsigned int crc __attribute__ ((unused)))
+{
+ return 0;
+}
+static int rebase_file_state(const char * file_name __attribute__ ((unused)),
+ enum_file_status state __attribute__ ((unused)))
+{
+ return 0;
+}
+int reset_file_id(const char * file_name __attribute__ ((unused)),
+ unsigned int id __attribute__ ((unused)))
+{
+ return 0;
+}
+int revert_last_commit(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+static int find_commit_callbak(void * para __attribute__ ((unused)),
+ int n_column __attribute__ ((unused)),
+ char ** column_value __attribute__ ((unused)),
+ char ** column_name __attribute__ ((unused)))
+{
+ return 0;
+}
+unsigned int find_commit(const char * file_name __attribute__ ((unused)),
+ enum_file_status state __attribute__ ((unused)),
+ unsigned long crc __attribute__ ((unused)))
+{
+ return 0;
+}
+int reset_to_commit(const char * file_name __attribute__ ((unused)),
+ enum_file_status state __attribute__ ((unused)),
+ unsigned long crc __attribute__ ((unused)))
+{
+ return 0;
+}
+int untrack_file(const char * file_name __attribute__ ((unused)))
+{
+ return 0;
+}
+int begin_transaction(void)
+{
+ return 0;
+}
+int end_transaction(void)
+{
+ return 0;
+}
+
+#endif /* DISABLE_SQL_NVM */