Branch data Line data Source code
1 : : #include "precizer.h"
2 : :
3 : : /**
4 : : * @brief Update the record in database
5 : : * @details Update information about the file, its
6 : : * metadata and checksum against the database
7 : : *
8 : : * @param[in] ID Database record identifier
9 : : * @param[in] offset File offset value
10 : : * @param[in] sha512 SHA512 checksum
11 : : * @param[in] stat File metadata structure
12 : : * @param[in] mdContext SHA512 context
13 : : *
14 : : * @return Return status code:
15 : : * - SUCCESS: Record updated successfully
16 : : * - FAILURE: Error occurred during update
17 : : *
18 : : * @note In dry run mode, the function returns SUCCESS without modifying the database
19 : : */
20 : 198 : Return db_update_the_record_by_id(
21 : : const sqlite3_int64 *ID,
22 : : const sqlite3_int64 *offset,
23 : : const unsigned char *sha512,
24 : : const CmpctStat *stat,
25 : : const SHA512_Context *mdContext,
26 : : const bool *zero_size_file,
27 : : const bool *wrong_file_type)
28 : : {
29 : : /* Status returned by this function through provide()
30 : : Default value assumes successful completion */
31 : 198 : Return status = SUCCESS;
32 : :
33 : : /* Skip database operations in dry run mode --dry-run */
34 [ + + ]: 198 : if(config->dry_run == true)
35 : : {
36 : 4 : provide(status);
37 : : }
38 : :
39 : 194 : int rc = 0;
40 : :
41 : 194 : sqlite3_stmt *update_stmt = NULL;
42 : :
43 : 194 : const char *update_sql = "UPDATE files SET offset = ?1,sha512 = ?2,stat = ?3,mdContext = ?4 WHERE ID = ?5;";
44 : :
45 : : /* Create SQL statement. Prepare to write */
46 : 194 : rc = sqlite3_prepare_v2(config->db,update_sql,-1,&update_stmt,NULL);
47 : :
48 [ - + ]: 194 : if(SQLITE_OK != rc)
49 : : {
50 : 0 : log_sqlite_error(config->db,rc,NULL,"Failed to prepare update statement %s",update_sql);
51 : 0 : status = FAILURE;
52 : : }
53 : :
54 : : /* Bind offset value */
55 [ + - ]: 194 : if(SUCCESS == status)
56 : : {
57 [ + - ]: 194 : if(*offset == 0)
58 : : {
59 : 194 : rc = sqlite3_bind_null(update_stmt,1);
60 : : } else {
61 : 0 : rc = sqlite3_bind_int64(update_stmt,1,*offset);
62 : : }
63 : :
64 [ - + ]: 194 : if(SQLITE_OK != rc)
65 : : {
66 : 0 : log_sqlite_error(config->db,rc,NULL,"Failed to bind offset value in update");
67 : 0 : status = FAILURE;
68 : : }
69 : : }
70 : :
71 [ + - ]: 194 : if(SUCCESS == status)
72 : : {
73 : 194 : rc = sqlite3_bind_int64(update_stmt,5,*ID);
74 : :
75 [ - + ]: 194 : if(SQLITE_OK != rc)
76 : : {
77 : 0 : log_sqlite_error(config->db,rc,NULL,"Error binding value in update");
78 : 0 : status = FAILURE;
79 : : }
80 : : }
81 : :
82 : : /* Bind SHA512 checksum */
83 [ + - ]: 194 : if(SUCCESS == status)
84 : : {
85 [ + - + + : 194 : if(*offset == 0 && *zero_size_file == false && *wrong_file_type == false)
+ - ]
86 : : {
87 : 192 : rc = sqlite3_bind_blob(update_stmt,2,sha512,SHA512_DIGEST_LENGTH,NULL);
88 : : } else {
89 : 2 : rc = sqlite3_bind_null(update_stmt,2);
90 : : }
91 : :
92 [ - + ]: 194 : if(SQLITE_OK != rc)
93 : : {
94 : 0 : log_sqlite_error(config->db,rc,NULL,"Failed to bind sha512 hash value in update");
95 : 0 : status = FAILURE;
96 : : }
97 : : }
98 : :
99 : : /* Copy and bind file metadata */
100 [ + - ]: 194 : if(SUCCESS == status)
101 : : {
102 : 194 : rc = sqlite3_bind_blob(update_stmt,3,stat,sizeof(CmpctStat),NULL);
103 : :
104 [ - + ]: 194 : if(SQLITE_OK != rc)
105 : : {
106 : 0 : log_sqlite_error(config->db,rc,NULL,"Error binding value in update");
107 : 0 : status = FAILURE;
108 : : }
109 : : }
110 : :
111 : : /* Bind SHA512 context */
112 [ + - ]: 194 : if(SUCCESS == status)
113 : : {
114 [ + - ]: 194 : if(*offset == 0)
115 : : {
116 : 194 : rc = sqlite3_bind_null(update_stmt,4);
117 : : } else {
118 : 0 : rc = sqlite3_bind_blob(update_stmt,4,mdContext,sizeof(SHA512_Context),NULL);
119 : : }
120 : :
121 [ - + ]: 194 : if(SQLITE_OK != rc)
122 : : {
123 : 0 : log_sqlite_error(config->db,rc,NULL,"Error binding value in update");
124 : 0 : status = FAILURE;
125 : : }
126 : : }
127 : :
128 : : /* Execute prepared statement */
129 [ + - ]: 194 : if(SUCCESS == status)
130 : : {
131 : 194 : rc = sqlite3_step(update_stmt);
132 : :
133 [ - + ]: 194 : if(SQLITE_DONE != rc)
134 : : {
135 : 0 : log_sqlite_error(config->db,rc,NULL,"Update statement failed");
136 : 0 : status = FAILURE;
137 : : }
138 : : }
139 : :
140 [ + - ]: 194 : if(SUCCESS == status)
141 : : {
142 : : /* Reflect changes in global */
143 : 194 : config->db_primary_file_modified = true;
144 : : }
145 : :
146 : 194 : sqlite3_finalize(update_stmt);
147 : :
148 : 194 : provide(status);
149 : : }
|