blob: 364aefd7a537dcc5fa2c60e8f7c6d47b4c993226 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/******************************************************************************
2*(C) Copyright 2011 Marvell International Ltd.
3* All Rights Reserved
4******************************************************************************/
5/*--------------------------------------------------------------------------------------------------------------------
6 * -------------------------------------------------------------------------------------------------------------------
7 *
8 * Filename: sql_repo.c
9 *
10 * Description: The API to record the file states and opreations into the sqlite3 based database.
11 *
12 * History:
13 * July, 22 2013 - Zhongmin Wu(zmwu@marvell.com) Creation of file
14 *
15 * Notes:
16 *
17 ******************************************************************************/
18
19#include <stdlib.h>
20#include <errno.h>
21#include "nvm_repo.h"
22#ifndef DISABLE_SQL_NVM
23#include "sqlite3.h"
24#endif
25#include "pxa_dbg.h"
26
27#ifndef DISABLE_SQL_NVM
28
29#define TABLE_SIZE 100
30/*
31--------------------------------------------------------------------------
32|id |filename|targetname |operation |attribute |offset |size |state |crc | time |reserved|
33--------------------------------------------------------------------------
34*/
35static list_file_info * list_file = NULL;
36
37static sqlite3 * sqlite;
38
39static list_file_info * file_info_malloc(void)
40{
41 list_file_info * p = malloc(sizeof(list_file_info));
42 if( p == NULL)
43 ERRMSG("Can't malloc file info!");
44 else
45 memset(p, 0, sizeof(list_file_info));
46 return p;
47}
48
49static void file_info_free(list_file_info * p)
50{
51 if(p)
52 {
53 if(p->file_name)
54 free(p->file_name);
55 if(p->target_name)
56 free(p->target_name);
57 free(p);
58 }
59}
60static void insert_list_file(list_file_info *p)
61{
62 if(p)
63 {
64 if(list_file == NULL)
65 {
66 list_file = p;
67 }
68 else
69 {
70 p->next = list_file->next;
71 list_file->next = p;
72 }
73 }
74}
75
76static void format_table_name(const char * file_name, char * table_name)
77{
78 while(*file_name)
79 {
80 *table_name = (*file_name == '.' )? '_' : *file_name;
81 file_name ++;
82 table_name ++;
83 }
84 *table_name = *file_name;
85}
86static int process_sql(const char * sql, sqlite3_callback callback, void *arg)
87{
88 int rc = 0;
89 char * error = NULL;
90 DBGMSG("Begin to process sql :%s", sql);
91 rc = sqlite3_exec(sqlite, sql, callback, arg, &error);
92 if(error)
93 {
94 ERRMSG("process sql error : %s", error);
95 sqlite3_free(error);
96 }
97 DBGMSG("Process sql result : %d", rc);
98 if(rc != SQLITE_OK)
99 {
100 rc = -1;
101 }
102 return rc;
103}
104
105static list_file_info * create_file_info(sqlite3 * sqldb, const char * table_name)
106{
107 int rc;
108 char **azResult;
109 int nRow;
110 int nColumn;
111 char *zErrMsg = NULL;
112 list_file_info * file_info = NULL;
113 file_info = file_info_malloc();
114 if(file_info)
115 {
116 if(table_name)
117 {
118 char * sql = NULL;
119 asprintf(&sql,
120 "SELECT filename, targetname, operation, state, crc FROM %s ORDER BY id DESC LIMIT 0, 1",
121 table_name);
122 if(!sql)
123 goto error;
124 rc = sqlite3_get_table(sqldb, sql, &azResult, &nRow, &nColumn, &zErrMsg);
125 if( zErrMsg )
126 {
127 ERRMSG("Error: %s\n", zErrMsg);
128 sqlite3_free(zErrMsg);
129 }
130 if( rc != SQLITE_OK )
131 {
132 ERRMSG("Error: querying %s\n", table_name);
133 rc = -1;
134 }
135 else
136 {
137
138 if(azResult[3 + nColumn])
139 file_info->status = atoi(azResult[3 + nColumn]);
140 if(azResult[2 + nColumn])
141 file_info->operation = atoi(azResult[2 + nColumn]);
142 if(file_info->operation == RENAME)
143 asprintf(&file_info->target_name, "%s", azResult[1 + nColumn]);
144 asprintf(&file_info->file_name, "%s", azResult[0 + nColumn]);
145
146 if( (file_info->status == STAGED || file_info->status == COMMITTED) && file_info->operation == UPDATE)
147 {
148 if(azResult[4 + nColumn])
149 {
150 char * endchar;
151
152 errno = 0;
153 file_info->crc = strtoul(azResult[4 + nColumn], &endchar, 10);
154 if(errno == ERANGE)
155 {
156 ERRMSG("out of range");
157 }
158 if(endchar == azResult[4 + nColumn])
159 {
160 ERRMSG("no digits");
161 }
162 }
163 }
164
165 DBGMSG("get file %s info: status:%d, operation %d, target name:%s, crc:%u, next:%p",
166 file_info->file_name, file_info->status, file_info->operation, file_info->target_name, file_info->crc, file_info->next);
167 rc = 0;
168 }
169 sqlite3_free_table(azResult);
170 free(sql);
171 if(rc < 0)
172 goto error;
173 }
174 else
175 goto error;
176 }
177 goto exit;
178error:
179 free(file_info);
180 file_info = NULL;
181exit:
182 return file_info;
183
184}
185static int init_list_file_info(sqlite3 * sqldb)
186{
187 int rc;
188 char **azResult;
189 int nRow;
190 char *zErrMsg = NULL;
191 if(sqldb == NULL)
192 return -1;
193 rc = sqlite3_get_table(sqldb,
194 "SELECT name FROM sqlite_master "
195 "WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' "
196 "UNION ALL "
197 "SELECT name FROM sqlite_temp_master "
198 "WHERE type IN ('table', 'view') "
199 "ORDER BY 1",
200 &azResult, &nRow, 0, &zErrMsg);
201 if( zErrMsg )
202 {
203 ERRMSG("Error: %s\n", zErrMsg);
204 sqlite3_free(zErrMsg);
205 }
206 if( rc != SQLITE_OK )
207 {
208 ERRMSG("Error: querying sqlite_master and sqlite_temp_master\n");
209 rc = -1;
210 }
211 else
212 {
213 int i;
214 for(i=1; i<=nRow; i++)
215 {
216 list_file_info * p;
217 if( azResult[i] == NULL ) continue;
218 p = create_file_info(sqldb,azResult[i]);
219 insert_list_file(p);
220 }
221 rc = 0;
222 }
223 sqlite3_free_table(azResult);
224 return rc;
225
226}
227
228static void deinit_list_file_info(void)
229{
230 list_file_info * p = list_file;
231 while(p)
232 {
233 list_file_info * current = p;
234 p = p->next;
235 file_info_free(current);
236 }
237 list_file = NULL;
238}
239
240static int set_sql_db(void)
241{
242 process_sql("PRAGMA journal_mode=WAL", NULL, NULL);
243 process_sql("PRAGMA synchronous=NORMAL", NULL, NULL);
244 process_sql("PRAGMA temp_store=MEMORY", NULL, NULL);
245 process_sql("PRAGMA wal_autocheckpoint=0", NULL, NULL);
246 return 0;
247}
248int nvm_repo_init(const char * repo_name)
249{
250 char * dbfile = NULL;
251 int ret;
252 asprintf(&dbfile,"%s.db", repo_name);
253 if(dbfile)
254 {
255 ret = sqlite3_open(dbfile, &sqlite);
256 if(ret != SQLITE_OK)
257 {
258 ERRMSG("Can't open data base:%s", dbfile);
259 free(dbfile);
260 return -1;
261 }
262 set_sql_db();
263 init_list_file_info(sqlite);
264 free(dbfile);
265 return 0;
266 }
267 return -1;
268}
269
270int nvm_repo_deinit(void)
271{
272 int ret;
273 ret = sqlite3_close(sqlite);
274 if(ret != SQLITE_OK)
275 {
276 ERRMSG("Can't close data base.");
277 return -1;
278 }
279 deinit_list_file_info();
280 return 0;
281}
282
283list_file_info * get_file_info(const char * file_name)
284{
285 list_file_info * p = list_file;
286 while(p)
287 {
288 if( p->file_name && !strcmp(p->file_name, file_name))
289 return p;
290 p = p->next;
291 }
292 return NULL;
293}
294
295
296static list_file_info * delete_file_info(const char * file_name)
297{
298 list_file_info * p = list_file;
299 list_file_info * pre = NULL;
300 if(p == NULL)
301 return NULL;
302 if(strcmp(p->file_name, file_name) == 0)
303 {
304 list_file = p->next;
305 return p;
306 }
307 pre = p;
308 p = p->next;
309 while(p != NULL)
310 {
311 if(strcmp(p->file_name, file_name) == 0)
312 {
313 pre->next = p->next;
314 return p;
315 }
316 pre = p;
317 p = p->next;
318 };
319 return NULL;
320
321}
322list_file_info * get_tracked_files(void)
323{
324 return list_file;
325}
326
327static int create_table_size_trigger(const char * file_name, int size)
328{
329 char * sql = NULL;
330 int rc =-1;
331 char *table_name;
332 char *trigger_name;
333 table_name = malloc(strlen(file_name) + 1);
334 if(!table_name)
335 return -1;
336 format_table_name(file_name, table_name);
337 asprintf(&trigger_name, "%s_size_trigger", table_name);
338 if(!trigger_name)
339 {
340 free(table_name);
341 return -1;
342 }
343
344 asprintf(&sql, "CREATE TRIGGER %s UPDATE of state ON %s WHEN (NEW.state=%d) AND ( (select count(*) from %s) > %d) "
345 "BEGIN DELETE from %s WHERE "
346 "(id<(SELECT id FROM (SELECT * FROM %s ORDER BY id DESC LIMIT 0, %d) "
347 "WHERE state=%d LIMIT 0,1)) AND (id>1); END",
348 trigger_name, table_name, COMMITTED, table_name, size, table_name, table_name, size, COMMITTED);
349 if(sql)
350 {
351 rc = process_sql(sql, NULL, NULL);
352 free(sql);
353 }
354
355 free(table_name);
356 free(trigger_name);
357 return rc;
358}
359
360int track_file(const char * file_name)
361{
362 int rc = 0;
363 char *zErrMsg;
364 char *table_name;
365
366 if(get_file_info(file_name) == NULL)
367 {
368 char * sql = NULL;
369 table_name = malloc(strlen(file_name) + 1);
370 if(!table_name)
371 return -1;
372 format_table_name(file_name, table_name);
373
374 asprintf(&sql, "CREATE TABLE %s ("
375 "id integer primary key autoincrement, "
376 "filename nvarchar(256), "
377 "targetname nvarchar(256), "
378 "operation integer, "
379 "attribute nvarchar(8), "
380 "offset integer, "
381 "size integer, "
382 "state integer, "
383 "crc integer, "
384 "time timestamp NOT NULL DEFAULT (strftime('%%m-%%d %%H:%%M:%%f', 'now', 'localtime')), "
385 "reserved)",
386 table_name);
387 if(sql)
388 {
389 rc = process_sql(sql, NULL, NULL);
390 free(sql);
391 if( rc == 0)
392 {
393 char *sql = NULL;
394 asprintf(&sql, "INSERT INTO %s (filename, state, operation) VALUES ('%s', %d, %d)",
395 table_name, file_name, COMMITTED, CREATED);
396 rc = -1;
397 if(sql)
398 {
399 rc = process_sql(sql, NULL, NULL);
400 if(rc == 0)
401 {
402 list_file_info * p = file_info_malloc();
403 if(p)
404 {
405 asprintf(&p->file_name, "%s", file_name);
406 p->status = COMMITTED;
407 insert_list_file(p);
408 }
409 rc = create_table_size_trigger(file_name, TABLE_SIZE);
410 }
411 free(sql);
412 }
413 }
414 }
415 else
416 rc = -1;
417 free(table_name);
418 }
419 return rc;
420}
421
422int insert_file_operation(const char * file_name, const char * target_name, enum_file_operation operation,
423 int offset, int size, const void * data)
424{
425 char *sql = NULL;
426 int rc = -1;
427 char *table_name;
428 table_name = malloc(strlen(file_name) + 1);
429 if(!table_name)
430 return -1;
431 format_table_name(file_name, table_name);
432 if(operation == RENAME)
433 {
434 asprintf(&sql, "INSERT INTO %s "
435 "(filename, targetname, operation, offset, size, state) "
436 "VALUES ('%s', '%s', %d, %d, %d, %d)",
437 table_name, file_name, target_name, operation, offset, size, CHANGED);
438 }
439 else
440 {
441 asprintf(&sql, "INSERT INTO %s "
442 "(filename, operation, offset, size, state) "
443 "VALUES ('%s', %d, %d, %d, %d)",
444 table_name, file_name, operation, offset, size, CHANGED);
445 }
446 if(sql)
447 {
448 rc = process_sql(sql, NULL, NULL);
449 free(sql);
450 }
451 free(table_name);
452 return rc;
453}
454
455int record_file_operation(const char * file_name, const char * target_name, enum_file_operation operation,
456 int offset, int size, unsigned crc, enum_file_status status)
457{
458 char *sql = NULL;
459 int rc = -1;
460 char *table_name;
461 table_name = malloc(strlen(file_name) + 1);
462 if(!table_name)
463 return -1;
464 format_table_name(file_name, table_name);
465 if(operation == RENAME)
466 {
467 asprintf(&sql, "INSERT INTO %s "
468 "(filename, targetname, operation, offset, size, state) "
469 "VALUES ('%s', '%s', %d, %d, %d, %d)",
470 table_name, file_name, target_name, operation, offset, size, status);
471 }
472 else
473 {
474 asprintf(&sql, "INSERT INTO %s "
475 "(filename, operation, offset, size, state, crc) "
476 "VALUES ('%s', %d, %d, %d, %d, %u)",
477 table_name, file_name, operation, offset, size, status, crc);
478 }
479 if(sql)
480 {
481 rc = process_sql(sql, NULL, NULL);
482 free(sql);
483 }
484 free(table_name);
485 if(rc == 0)
486 sqlite3_wal_checkpoint(sqlite, NULL);
487 return rc;
488}
489
490static int select_file_callback( void * para, int n_column, char ** column_value, char ** column_name)
491{
492 list_file_info * p = (list_file_info *) para;
493 if(p != NULL)
494 {
495 DBGMSG("file %s info is updating from operation:%d state:%d, crc:%u", p->file_name, p->operation,
496 p->status, p->crc);
497 if(column_value[1])
498 p->operation = atoi(column_value[1]);
499 if(column_value[2])
500 p->status = atoi(column_value[2]);
501 if(p->operation == RENAME)
502 {
503 if(p->target_name)
504 free(p->target_name);
505 asprintf(&p->target_name, "%s", column_value[0]);
506 }
507 p->crc = 0;
508 if( (p->status == STAGED || p->status == COMMITTED) && p->operation == UPDATE)
509 {
510 if(column_value[3])
511 {
512 char * endchar;
513
514 errno = 0;
515 p->crc = strtoul(column_value[3], &endchar, 10);
516 if(errno == ERANGE)
517 {
518 ERRMSG("out of range");
519 }
520 if(endchar == column_value[3])
521 {
522 ERRMSG("no digits");
523 }
524 }
525 }
526 DBGMSG("file %s info is updated to operation:%d state:%d, crc:%u", p->file_name, p->operation,
527 p->status, p->crc);
528 }
529 return 0;
530}
531
532static int update_file_info(const char * file_name)
533{
534 char * sql = NULL;
535 int rc =-1;
536 char *table_name;
537 table_name = malloc(strlen(file_name) + 1);
538 if(!table_name)
539 return -1;
540 format_table_name(file_name, table_name);
541
542 asprintf(&sql,
543 "SELECT targetname, operation, state, crc FROM %s ORDER BY id DESC LIMIT 0, 1",
544 table_name);
545 if(sql)
546 {
547 list_file_info * p = get_file_info(file_name);
548 rc = process_sql(sql,select_file_callback,p);
549 free(sql);
550 }
551 free(table_name);
552 return rc;
553}
554
555static int recorder_number_callbak( void * para, int n_column, char ** column_value, char ** column_name)
556{
557 int * number = ( int * )para;
558 if(column_value[0])
559 *number = atoi(column_value[0]);
560 else
561 *number = 0;
562 return 0;
563}
564
565static int get_recorder_number(const char * file_name)
566{
567 char * sql = NULL;
568 int rc =-1;
569 int number = 0;
570 char *table_name;
571 table_name = malloc(strlen(file_name) + 1);
572 if(!table_name)
573 return -1;
574 format_table_name(file_name, table_name);
575 asprintf(&sql, "SELECT count(*) from %s", table_name);
576 if(sql)
577 {
578 rc = process_sql(sql,recorder_number_callbak, &number);
579 DBGMSG(" get_recorder_number file %s number %d",file_name, number);
580 free(sql);
581 }
582 free(table_name);
583 return number;
584}
585
586static int keep_table_size(const char * file_name, int size)
587{
588 char * sql = NULL;
589 int rc =-1;
590 char *table_name;
591 table_name = malloc(strlen(file_name) + 1);
592 if(!table_name)
593 return -1;
594 format_table_name(file_name, table_name);
595
596 DBGMSG(" keep file %s table size to %d", file_name, size);
597 if(get_recorder_number(file_name) > size)
598 {
599 asprintf(&sql, "DELETE from %s WHERE "
600 "(id<(SELECT id FROM (SELECT * FROM %s ORDER BY id DESC LIMIT 0, %d) "
601 "WHERE state=%d LIMIT 0,1)) AND (id>1)", table_name, table_name, size, COMMITTED);
602 if(sql)
603 {
604 rc = process_sql(sql, NULL, NULL);
605 free(sql);
606 }
607 }
608 else
609 rc = 0;
610 free(table_name);
611 return rc;
612}
613
614static int change_last_state(const char * file_name, enum_file_status state, unsigned int crc)
615{
616 char * sql = NULL;
617 int rc = -1;
618 char *table_name;
619 table_name = malloc(strlen(file_name) + 1);
620 if(!table_name)
621 return -1;
622 format_table_name(file_name, table_name);
623
624 if(crc > 0)
625 asprintf(&sql, "UPDATE %s "
626 "SET state=%d, "
627 "crc=%u, "
628 "time=strftime('%%m-%%d %%H:%%M:%%f', 'now', 'localtime') "
629 "WHERE id IN "
630 "(SELECT id FROM %s ORDER BY id DESC LIMIT 0,1)",
631 table_name, state, crc, table_name);
632 else
633 asprintf(&sql, "UPDATE %s "
634 "SET state=%d, "
635 "time=strftime('%%m-%%d %%H:%%M:%%f', 'now', 'localtime') "
636 "WHERE id IN "
637 "(SELECT id FROM %s ORDER BY id DESC LIMIT 0,1)",
638 table_name, state, table_name);
639 if(sql)
640 {
641 rc = process_sql(sql, NULL, NULL);
642 if(rc == 0)
643 {
644 //update_file_info(file_name);
645 list_file_info * p = get_file_info(file_name);
646 p->crc = crc;
647 p->status = state;
648 }
649 free(sql);
650 }
651 free(table_name);
652 return rc;
653}
654
655int stage_file(const char * file_name)
656{
657 int rc;
658 rc = change_last_state(file_name, STAGED, 0);
659 sqlite3_wal_checkpoint(sqlite, NULL);
660 return rc;
661}
662
663int commit_file(const char * file_name)
664{
665
666 int rc;
667 rc = change_last_state(file_name, COMMITTED, 0);
668 sqlite3_wal_checkpoint(sqlite, NULL);
669 return rc;
670}
671
672int stage_file_crc(const char * file_name, unsigned int crc)
673{
674 int rc;
675 rc = change_last_state(file_name, STAGED, crc);
676 sqlite3_wal_checkpoint(sqlite, NULL);
677 return rc;
678}
679
680int commit_file_crc(const char * file_name, unsigned int crc)
681{
682 int rc;
683 rc = change_last_state(file_name, COMMITTED, crc);
684 sqlite3_wal_checkpoint(sqlite, NULL);
685 return rc;
686}
687
688static int rebase_file_state(const char * file_name, enum_file_status state)
689{
690 char * sql = NULL;
691 int rc =-1;
692 char *table_name;
693 table_name = malloc(strlen(file_name) + 1);
694 if(!table_name)
695 return -1;
696 format_table_name(file_name, table_name);
697 asprintf(&sql, "DELETE FROM %s "
698 "WHERE id > "
699 "(SELECT id FROM %s WHERE state=%d ORDER BY id DESC LIMIT 0,1)",
700 table_name, table_name, state);
701 if(sql)
702 {
703 rc = process_sql(sql, NULL, NULL);
704 if(rc == 0)
705 {
706 update_file_info(file_name);
707 sqlite3_wal_checkpoint(sqlite, NULL);
708 }
709 free(sql);
710 }
711 free(table_name);
712 return rc;
713}
714
715int reset_file_id(const char * file_name, unsigned int id)
716{
717 char * sql = NULL;
718 int rc =-1;
719 char *table_name;
720 table_name = malloc(strlen(file_name) + 1);
721 if(!table_name)
722 return -1;
723 format_table_name(file_name, table_name);
724
725
726 asprintf(&sql, "DELETE FROM %s "
727 "WHERE id > %u",
728 table_name, id);
729 if(sql)
730 {
731 rc = process_sql(sql, NULL, NULL);
732 if(rc == 0)
733 {
734 update_file_info(file_name);
735 sqlite3_wal_checkpoint(sqlite, NULL);
736 }
737 free(sql);
738 }
739 free(table_name);
740 return rc;
741}
742
743int revert_last_commit(const char * file_name)
744{
745 return rebase_file_state(file_name, COMMITTED);
746}
747
748static int find_commit_callbak( void * para, int n_column, char ** column_value, char ** column_name)
749{
750 unsigned int * id = (unsigned int *)para;
751 if(n_column > 0)
752 {
753 char *end;
754 *id = strtol(column_value[0], &end, 10);
755 DBGMSG("find_commit_callbak find id %u", *id);
756 }
757 else
758 {
759 *id = 0;
760 DBGMSG("find_commit_callbak find error", *id);
761 }
762 return 0;
763}
764
765unsigned int find_commit(const char * file_name, enum_file_status state, unsigned long crc)
766{
767 char * sql = NULL;
768 int rc =-1;
769 unsigned int id = 0;
770 char *table_name;
771 table_name = malloc(strlen(file_name) + 1);
772 if(!table_name)
773 return -1;
774
775 format_table_name(file_name, table_name);
776
777 asprintf(&sql, "SELECT id "
778 "FROM %s WHERE state = %d "
779 "AND crc=%lu ORDER BY id DESC LIMIT 0,1",
780 table_name, state, crc);
781 if(sql)
782 {
783 rc = process_sql(sql, find_commit_callbak, &id);
784 DBGMSG("find_commit find id %u", id);
785 free(sql);
786 }
787 free(table_name);
788 return id;
789}
790
791int reset_to_commit(const char * file_name, enum_file_status state, unsigned long crc)
792{
793 unsigned int id;
794 int rc = -1;
795 id = find_commit(file_name, state, crc);
796 if( id == 0)
797 {
798 return -1;
799 }
800 else
801 {
802 rc = reset_file_id(file_name, id);
803 return rc;
804 }
805}
806int untrack_file(const char * file_name)
807{
808 char * sql = NULL;
809 int rc =-1;
810 char *table_name;
811 table_name = malloc(strlen(file_name) + 1);
812 if(!table_name)
813 return -1;
814 format_table_name(file_name, table_name);
815 asprintf(&sql, "DROP TABLE %s", table_name);
816 if(sql)
817 {
818 DBGMSG("untracke_file %s in table %s", file_name, table_name);
819 rc = process_sql(sql, NULL, NULL);
820 if(rc == 0)
821 {
822 list_file_info *p;
823 p = delete_file_info(file_name);
824 file_info_free(p);
825 }
826 free(sql);
827 }
828 free(table_name);
829 return rc;
830}
831
832int begin_transaction(void)
833{
834 return process_sql("begin transaction", NULL,NULL);
835}
836
837int end_transaction(void)
838{
839 return process_sql("end transaction", NULL,NULL);
840}
841
842#else /* DISABLE_SQL_NVM is defined */
843
844typedef struct sqlite3 sqlite3;
845typedef int (*sqlite3_callback)(void*,int,char**, char**);
846
847static list_file_info * file_info_malloc(void)
848{
849 return 0;
850}
851static void file_info_free(list_file_info * p __attribute__ ((unused)))
852{
853 return;
854}
855static void insert_list_file(list_file_info *p __attribute__ ((unused)))
856{
857 return;
858}
859static void format_table_name(const char * file_name __attribute__ ((unused)),
860 char * table_name __attribute__ ((unused)))
861{
862 return;
863}
864static int process_sql(const char * sql __attribute__ ((unused)),
865 sqlite3_callback callback __attribute__ ((unused)),
866 void *arg __attribute__ ((unused)))
867{
868 return 0;
869}
870static list_file_info * create_file_info(sqlite3 * sqldb __attribute__ ((unused)),
871 const char * table_name __attribute__ ((unused)))
872{
873 return 0;
874}
875static int init_list_file_info(sqlite3 * sqldb __attribute__ ((unused)))
876{
877 return 0;
878}
879static void deinit_list_file_info(void)
880{
881 return;
882}
883static int set_sql_db(void)
884{
885 return 0;
886}
887int nvm_repo_init(const char * repo_name __attribute__ ((unused)))
888{
889 return 0;
890}
891int nvm_repo_deinit(void)
892{
893 return 0;
894}
895list_file_info * get_file_info(const char * file_name __attribute__ ((unused)))
896{
897 return 0;
898}
899static list_file_info * delete_file_info(const char * file_name __attribute__ ((unused)))
900{
901 return 0;
902}
903list_file_info * get_tracked_files(void)
904{
905 return 0;
906}
907static int create_table_size_trigger(const char * file_name __attribute__ ((unused)),
908 int size __attribute__ ((unused)))
909{
910 return 0;
911}
912int track_file(const char * file_name __attribute__ ((unused)))
913{
914 return 0;
915}
916int insert_file_operation(const char * file_name __attribute__ ((unused)),
917 const char * target_name __attribute__ ((unused)),
918 enum_file_operation operation __attribute__ ((unused)),
919 int offset __attribute__ ((unused)),
920 int size __attribute__ ((unused)),
921 const void * data __attribute__ ((unused)))
922{
923 return 0;
924}
925static int select_file_callback( void * para __attribute__ ((unused)),
926 int n_column __attribute__ ((unused)),
927 char ** column_value __attribute__ ((unused)),
928 char ** column_name __attribute__ ((unused)))
929{
930 return 0;
931}
932static int update_file_info(const char * file_name __attribute__ ((unused)))
933{
934 return 0;
935}
936static int recorder_number_callbak( void * para __attribute__ ((unused)),
937 int n_column __attribute__ ((unused)),
938 char ** column_value __attribute__ ((unused)),
939 char ** column_name __attribute__ ((unused)))
940{
941 return 0;
942}
943static int get_recorder_number(const char * file_name __attribute__ ((unused)))
944{
945 return 0;
946}
947static int keep_table_size(const char * file_name __attribute__ ((unused)),
948 int size __attribute__ ((unused)))
949{
950 return 0;
951}
952static int change_last_state(const char * file_name __attribute__ ((unused)),
953 enum_file_status state __attribute__ ((unused)),
954 unsigned int crc __attribute__ ((unused)))
955{
956 return 0;
957}
958int stage_file(const char * file_name __attribute__ ((unused)))
959{
960 return 0;
961}
962int commit_file(const char * file_name __attribute__ ((unused)))
963{
964 return 0;
965}
966int stage_file_crc(const char * file_name __attribute__ ((unused)),
967 unsigned int crc __attribute__ ((unused)))
968{
969 return 0;
970}
971int commit_file_crc(const char * file_name __attribute__ ((unused)),
972 unsigned int crc __attribute__ ((unused)))
973{
974 return 0;
975}
976static int rebase_file_state(const char * file_name __attribute__ ((unused)),
977 enum_file_status state __attribute__ ((unused)))
978{
979 return 0;
980}
981int reset_file_id(const char * file_name __attribute__ ((unused)),
982 unsigned int id __attribute__ ((unused)))
983{
984 return 0;
985}
986int revert_last_commit(const char * file_name __attribute__ ((unused)))
987{
988 return 0;
989}
990static int find_commit_callbak(void * para __attribute__ ((unused)),
991 int n_column __attribute__ ((unused)),
992 char ** column_value __attribute__ ((unused)),
993 char ** column_name __attribute__ ((unused)))
994{
995 return 0;
996}
997unsigned int find_commit(const char * file_name __attribute__ ((unused)),
998 enum_file_status state __attribute__ ((unused)),
999 unsigned long crc __attribute__ ((unused)))
1000{
1001 return 0;
1002}
1003int reset_to_commit(const char * file_name __attribute__ ((unused)),
1004 enum_file_status state __attribute__ ((unused)),
1005 unsigned long crc __attribute__ ((unused)))
1006{
1007 return 0;
1008}
1009int untrack_file(const char * file_name __attribute__ ((unused)))
1010{
1011 return 0;
1012}
1013int begin_transaction(void)
1014{
1015 return 0;
1016}
1017int end_transaction(void)
1018{
1019 return 0;
1020}
1021
1022#endif /* DISABLE_SQL_NVM */