5
5
6
6
int main (int argc , char * argv [])
7
7
{
8
- libsql_connection_t conn ;
9
- libsql_rows_t rows ;
10
- libsql_row_t row ;
11
- libsql_database_t db ;
8
+ libsql_connection_t conn = NULL ;
9
+ libsql_rows_t rows = NULL ;
10
+ libsql_row_t row = NULL ;
11
+ libsql_database_t db = NULL ;
12
12
libsql_config config ;
13
13
const char * err = NULL ;
14
14
int retval = 0 ;
@@ -20,9 +20,10 @@ int main(int argc, char *argv[])
20
20
char auth_token [1024 ];
21
21
auth_token [0 ] = '\0' ;
22
22
if (argc > 2 ) {
23
- strncpy (auth_token , argv [ 2 ], strlen ( argv [2 ]) );
23
+ snprintf (auth_token , sizeof ( auth_token ), "%s" , argv [2 ]);
24
24
}
25
- strncpy (db_path , "test.db" , strlen ("test.db" ));
25
+ snprintf (db_path , sizeof (db_path ), "%s" , "test.db" );
26
+ memset (& config , 0 , sizeof (config ));
26
27
config .db_path = db_path ;
27
28
config .primary_url = url ;
28
29
config .auth_token = auth_token ;
@@ -56,16 +57,123 @@ int main(int argc, char *argv[])
56
57
goto quit ;
57
58
}
58
59
59
- retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('hi there')" , & err );
60
- if (retval != 0 ) {
61
- fprintf (stderr , "%s\n" , err );
62
- goto quit ;
60
+ // --- ROLLBACK should discard changes
61
+ {
62
+ libsql_tx_t tx = NULL ;
63
+ retval = libsql_tx_begin (conn , 0 /* Deferred */ , & tx , & err );
64
+ if (retval != 0 ) {
65
+ fprintf (stderr , "tx_begin (rollback test): %s\n" , err );
66
+ goto quit ;
67
+ }
68
+
69
+ retval = libsql_execute (conn , "DELETE FROM guest_book_entries" , & err );
70
+ if (retval != 0 ) {
71
+ fprintf (stderr , "delete before rollback test: %s\n" , err );
72
+ libsql_tx_free (tx );
73
+ goto quit ;
74
+ }
75
+
76
+ retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('tx will be rolled back')" , & err );
77
+ if (retval != 0 ) {
78
+ fprintf (stderr , "insert (rollback test): %s\n" , err );
79
+ libsql_tx_free (tx );
80
+ goto quit ;
81
+ }
82
+
83
+ retval = libsql_tx_rollback (tx , & err );
84
+ if (retval != 0 ) {
85
+ fprintf (stderr , "tx_rollback: %s\n" , err );
86
+ libsql_tx_free (tx );
87
+ goto quit ;
88
+ }
89
+ tx = NULL ;
90
+
91
+ rows = NULL ; row = NULL ; err = NULL ;
92
+ retval = libsql_query (conn , "SELECT COUNT(*) FROM guest_book_entries" , & rows , & err );
93
+ if (retval != 0 ) {
94
+ fprintf (stderr , "query count after rollback: %s\n" , err );
95
+ goto quit ;
96
+ }
97
+ retval = libsql_next_row (rows , & row , & err );
98
+ if (retval != 0 || !row ) {
99
+ fprintf (stderr , "next_row (count after rollback): %s\n" , err ? err : "no row" );
100
+ goto quit ;
101
+ }
102
+ long long count = -1 ;
103
+ retval = libsql_get_int (row , 0 , & count , & err );
104
+ if (retval != 0 ) {
105
+ fprintf (stderr , "get_int (count after rollback): %s\n" , err );
106
+ goto quit ;
107
+ }
108
+ libsql_free_row (row ); row = NULL ;
109
+ libsql_free_rows (rows ); rows = NULL ;
110
+
111
+ if (count != 0 ) {
112
+ fprintf (stderr , "rollback test failed: expected 0 rows, got %lld\n" , count );
113
+ retval = 1 ;
114
+ goto quit ;
115
+ } else {
116
+ printf ("[tx-rollback] OK: count=%lld\n" , count );
117
+ }
63
118
}
64
119
65
- retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('some more hi there')" , & err );
66
- if (retval != 0 ) {
67
- fprintf (stderr , "%s\n" , err );
68
- goto quit ;
120
+ // --- COMMIT should persist changes
121
+ {
122
+ libsql_tx_t tx = NULL ;
123
+ retval = libsql_tx_begin (conn , 0 /* Deferred */ , & tx , & err );
124
+ if (retval != 0 ) {
125
+ fprintf (stderr , "tx_begin (commit test): %s\n" , err );
126
+ goto quit ;
127
+ }
128
+
129
+ retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('hello from tx-commit 1')" , & err );
130
+ if (retval != 0 ) {
131
+ fprintf (stderr , "insert 1 (commit test): %s\n" , err );
132
+ libsql_tx_free (tx );
133
+ goto quit ;
134
+ }
135
+ retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('hello from tx-commit 2')" , & err );
136
+ if (retval != 0 ) {
137
+ fprintf (stderr , "insert 2 (commit test): %s\n" , err );
138
+ libsql_tx_free (tx );
139
+ goto quit ;
140
+ }
141
+
142
+ retval = libsql_tx_commit (tx , & err );
143
+ if (retval != 0 ) {
144
+ fprintf (stderr , "tx_commit: %s\n" , err );
145
+ libsql_tx_free (tx );
146
+ goto quit ;
147
+ }
148
+
149
+ tx = NULL ;
150
+ rows = NULL ; row = NULL ; err = NULL ;
151
+ retval = libsql_query (conn , "SELECT COUNT(*) FROM guest_book_entries" , & rows , & err );
152
+ if (retval != 0 ) {
153
+ fprintf (stderr , "query count after commit: %s\n" , err );
154
+ goto quit ;
155
+ }
156
+ retval = libsql_next_row (rows , & row , & err );
157
+ if (retval != 0 || !row ) {
158
+ fprintf (stderr , "next_row (count after commit): %s\n" , err ? err : "no row" );
159
+ goto quit ;
160
+ }
161
+ long long count = -1 ;
162
+ retval = libsql_get_int (row , 0 , & count , & err );
163
+ if (retval != 0 ) {
164
+ fprintf (stderr , "get_int (count after commit): %s\n" , err );
165
+ goto quit ;
166
+ }
167
+ libsql_free_row (row ); row = NULL ;
168
+ libsql_free_rows (rows ); rows = NULL ;
169
+
170
+ if (count != 2 ) {
171
+ fprintf (stderr , "commit test failed: expected 2 rows, got %lld\n" , count );
172
+ retval = 1 ;
173
+ goto quit ;
174
+ } else {
175
+ printf ("[tx-commit] OK: count=%lld\n" , count );
176
+ }
69
177
}
70
178
71
179
retval = libsql_query (conn , "SELECT text FROM guest_book_entries" , & rows , & err );
@@ -87,6 +195,9 @@ int main(int argc, char *argv[])
87
195
libsql_free_string (value );
88
196
value = NULL ;
89
197
}
198
+
199
+ libsql_free_row (row );
200
+ row = NULL ;
90
201
err = NULL ;
91
202
}
92
203
@@ -106,9 +217,10 @@ int main(int argc, char *argv[])
106
217
}
107
218
108
219
quit :
109
- libsql_free_rows (rows );
110
- libsql_disconnect (conn );
111
- libsql_close (db );
220
+ if (row ) libsql_free_row (row );
221
+ if (rows ) libsql_free_rows (rows );
222
+ if (conn ) libsql_disconnect (conn );
223
+ if (db ) libsql_close (db );
112
224
113
225
return retval ;
114
226
}
0 commit comments