12 struct lock
*next
, *prev
;
14 struct ctdb_lock
*lock
;
18 static unsigned int lock_id
;
19 static struct lock
*locks
;
21 static void readrecordlock_help(int argc
, char **argv
)
23 #include "generated-readrecordlock-help:readrecordlock"
25 <section id="c:readrecordlock">
26 <title><command>readrecordlock</command></title>
27 <para>Read and lock a record in a ctdb database</para>
29 <command>readrecordlock</command>
30 <arg choice="req"><replaceable>db-id</replaceable></arg>
31 <arg choice="req"><replaceable>key</replaceable></arg>
34 <para>Read and lock a record. Prints the record, and a 1-based
35 sequential handle on success, which should be handed to
36 <command>releaselock</command>
42 static void releaselock_help(int argc
, char **argv
)
44 #include "generated-readrecordlock-help:releaselock"
46 <section id="c:releaselock">
47 <title><command>releaselock</command></title>
48 <para>Unlock a record in a ctdb database</para>
50 <command>releaselock</command>
51 <arg choice="req"><replaceable>db-id</replaceable></arg>
52 <arg choice="req"><replaceable>lock-id</replaceable></arg>
55 <para>Unlock a record successfully locked by
56 <command>readrecordlock</command>. </para>
62 static void writerecord_help(int argc
, char **argv
)
64 #include "generated-readrecordlock-help:writerecord"
66 <section id="c:writerecord">
67 <title><command>writerecord</command></title>
68 <para>Write to a locked record in a ctdb database</para>
70 <command>writerecord</command>
71 <arg choice="req"><replaceable>db-id</replaceable></arg>
72 <arg choice="req"><replaceable>lock-id</replaceable></arg>
73 <arg choice="req"><replaceable>data</replaceable></arg>
76 <para>Once a record is locked with
77 <command>readrecordlock</command>, you can write to it. </para>
82 static int lock_destructor(struct lock
*lock
)
84 ctdb_release_lock(lock
->db
, lock
->lock
);
85 DLIST_REMOVE(locks
, lock
);
89 static bool releaselock(int argc
, char **argv
)
95 log_line(LOG_ALWAYS
, "Need database number and lock number");
99 db
= find_db_by_id(atoi(argv
[1]));
101 log_line(LOG_ALWAYS
, "Unknown db number %s", argv
[1]);
105 for (lock
= locks
; lock
; lock
= lock
->next
) {
106 if (lock
->id
== atoi(argv
[2]))
110 log_line(LOG_ALWAYS
, "Unknown lock number %s", argv
[2]);
117 static bool writerecord(int argc
, char **argv
)
124 log_line(LOG_ALWAYS
, "Need db-id, lock-id and data");
128 db
= find_db_by_id(atoi(argv
[1]));
130 log_line(LOG_ALWAYS
, "Unknown db number %s", argv
[1]);
134 for (lock
= locks
; lock
; lock
= lock
->next
) {
135 if (lock
->id
== atoi(argv
[2]))
139 log_line(LOG_ALWAYS
, "Unknown lock number %s", argv
[2]);
143 data
.dptr
= (unsigned char *)argv
[3];
144 data
.dsize
= strlen(argv
[3]);
146 if (!ctdb_writerecord(db
, lock
->lock
, data
)) {
147 log_line(LOG_UI
, "writerecordlock: failed %s", strerror(errno
));
153 static bool readrecordlock(int argc
, char **argv
)
155 struct lock
*lock
= talloc(working
, struct lock
);
159 log_line(LOG_ALWAYS
, "No ctdb connection");
163 log_line(LOG_ALWAYS
, "Need db-id and key");
167 lock
->db
= find_db_by_id(atoi(argv
[1]));
169 log_line(LOG_ALWAYS
, "Unknown db number %s", argv
[1]);
173 key
.dptr
= (unsigned char *)argv
[2];
174 key
.dsize
= strlen(argv
[2]);
176 lock
->lock
= ctdb_readrecordlock(get_ctdb(), lock
->db
, key
, &data
);
178 log_line(LOG_UI
, "readrecordlock: failed %s", strerror(errno
));
181 lock
->id
= ++lock_id
;
182 DLIST_ADD(locks
, lock
);
183 talloc_set_destructor(lock
, lock_destructor
);
185 log_line(LOG_UI
, "lock %u: data '%.*s'",
186 lock
->id
, data
.dsize
, (char *)data
.dptr
);
190 static void readrecordlock_init(void)
192 tui_register_command("readrecordlock",
193 readrecordlock
, readrecordlock_help
);
194 tui_register_command("releaselock", releaselock
, releaselock_help
);
195 tui_register_command("writerecord", writerecord
, writerecord_help
);
197 init_call(readrecordlock_init
);