16
#include "reftable-record.h"
17
#include "reftable-merged.h"
18
#include "writer.h"
19
-#include "tempfile.h"
19
20
static int stack_try_add(struct reftable_stack *st,
21
int (*write_table)(struct reftable_writer *wr,
866
struct reftable_buf tab_file_name = REFTABLE_BUF_INIT;
867
struct reftable_buf next_name = REFTABLE_BUF_INIT;
868
struct reftable_writer *wr = NULL;
870
- struct tempfile *tab_file = NULL;
869
+ struct reftable_tmpfile tab_file = REFTABLE_TMPFILE_INIT;
870
struct fd_writer writer = {
871
.opts = &add->stack->opts,
872
};
886
if (err < 0)
887
goto done;
888
890
- tab_file = mks_tempfile(temp_tab_file_name.buf);
891
- if (!tab_file) {
892
- err = REFTABLE_IO_ERROR;
889
+ err = tmpfile_from_pattern(&tab_file, temp_tab_file_name.buf);
890
+ if (err < 0)
891
goto done;
894
- }
892
if (add->stack->opts.default_permissions) {
896
- if (chmod(get_tempfile_path(tab_file),
893
+ if (chmod(tab_file.path,
894
add->stack->opts.default_permissions)) {
895
err = REFTABLE_IO_ERROR;
896
goto done;
897
}
898
}
899
903
- writer.fd = get_tempfile_fd(tab_file);
900
+ writer.fd = tab_file.fd;
901
err = reftable_writer_new(&wr, fd_writer_write, fd_writer_flush,
902
&writer, &add->stack->opts);
903
if (err < 0)
915
if (err < 0)
916
goto done;
917
921
- err = close_tempfile_gently(tab_file);
922
- if (err < 0) {
923
- err = REFTABLE_IO_ERROR;
918
+ err = tmpfile_close(&tab_file);
919
+ if (err < 0)
920
goto done;
925
- }
921
922
if (wr->min_update_index < add->next_update_index) {
923
err = REFTABLE_API_ERROR;
940
On windows, this relies on rand() picking a unique destination name.
941
Maybe we should do retry loop as well?
942
*/
948
- err = rename_tempfile(&tab_file, tab_file_name.buf);
949
- if (err < 0) {
950
- err = REFTABLE_IO_ERROR;
943
+ err = tmpfile_rename(&tab_file, tab_file_name.buf);
944
+ if (err < 0)
945
goto done;
952
- }
946
947
REFTABLE_ALLOC_GROW(add->new_tables, add->new_tables_len + 1,
948
add->new_tables_cap);
953
add->new_tables[add->new_tables_len++] = reftable_buf_detach(&next_name);
954
955
done:
963
- delete_tempfile(&tab_file);
956
+ tmpfile_delete(&tab_file);
957
reftable_buf_release(&temp_tab_file_name);
958
reftable_buf_release(&tab_file_name);
959
reftable_buf_release(&next_name);
973
static int stack_compact_locked(struct reftable_stack *st,
974
size_t first, size_t last,
975
struct reftable_log_expiry_config *config,
983
- struct tempfile **tab_file_out)
976
+ struct reftable_tmpfile *tab_file_out)
977
{
978
struct reftable_buf next_name = REFTABLE_BUF_INIT;
979
struct reftable_buf tab_file_path = REFTABLE_BUF_INIT;
981
struct fd_writer writer= {
982
.opts = &st->opts,
983
};
991
- struct tempfile *tab_file;
984
+ struct reftable_tmpfile tab_file = REFTABLE_TMPFILE_INIT;
985
int err = 0;
986
987
err = format_name(&next_name, reftable_reader_min_update_index(st->readers[first]),
997
if (err < 0)
998
goto done;
999
1007
- tab_file = mks_tempfile(tab_file_path.buf);
1008
- if (!tab_file) {
1009
- err = REFTABLE_IO_ERROR;
1000
+ err = tmpfile_from_pattern(&tab_file, tab_file_path.buf);
1001
+ if (err < 0)
1002
goto done;
1011
- }
1003
1004
if (st->opts.default_permissions &&
1014
- chmod(get_tempfile_path(tab_file), st->opts.default_permissions) < 0) {
1005
+ chmod(tab_file.path, st->opts.default_permissions) < 0) {
1006
err = REFTABLE_IO_ERROR;
1007
goto done;
1008
}
1009
1019
- writer.fd = get_tempfile_fd(tab_file);
1010
+ writer.fd = tab_file.fd;
1011
err = reftable_writer_new(&wr, fd_writer_write, fd_writer_flush,
1012
&writer, &st->opts);
1013
if (err < 0)
1021
if (err < 0)
1022
goto done;
1023
1033
- err = close_tempfile_gently(tab_file);
1024
+ err = tmpfile_close(&tab_file);
1025
if (err < 0)
1026
goto done;
1027
1028
*tab_file_out = tab_file;
1038
- tab_file = NULL;
1029
+ tab_file = REFTABLE_TMPFILE_INIT;
1030
1031
done:
1041
- delete_tempfile(&tab_file);
1032
+ tmpfile_delete(&tab_file);
1033
reftable_writer_free(wr);
1034
reftable_buf_release(&next_name);
1035
reftable_buf_release(&tab_file_path);
1162
struct reftable_buf table_name = REFTABLE_BUF_INIT;
1163
struct lock_file tables_list_lock = LOCK_INIT;
1164
struct lock_file *table_locks = NULL;
1174
- struct tempfile *new_table = NULL;
1165
+ struct reftable_tmpfile new_table = REFTABLE_TMPFILE_INIT;
1166
int is_empty_table = 0, err = 0;
1167
size_t first_to_replace, last_to_replace;
1168
size_t i, nlocks = 0;
1430
if (err < 0)
1431
goto done;
1432
1442
- err = rename_tempfile(&new_table, new_table_path.buf);
1443
- if (err < 0) {
1444
- err = REFTABLE_IO_ERROR;
1433
+ err = tmpfile_rename(&new_table, new_table_path.buf);
1434
+ if (err < 0)
1435
goto done;
1446
- }
1436
}
1437
1438
/*
1504
rollback_lock_file(&table_locks[i]);
1505
reftable_free(table_locks);
1506
1518
- delete_tempfile(&new_table);
1507
+ tmpfile_delete(&new_table);
1508
reftable_buf_release(&new_table_name);
1509
reftable_buf_release(&new_table_path);
1510
reftable_buf_release(&tables_list_buf);