]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica3/parte2/set_server.cpp
Cosas de Distribuidos I.
[z.facultad/75.74/practicos.git] / practicas / practica3 / parte2 / set_server.cpp
1 /*
2  * This is sample code generated by rpcgen.
3  * These are only templates and you can use them
4  * as a guideline for developing your own functions.
5  */
6
7 #include "set.h"
8 #include "common.h"
9 #include <set>
10 #include <map>
11 #include <string>
12 #include <cstdlib>
13 #include <cstdio>
14
15 std::map< int, std::set< std::string > > sets;
16
17 enum { OK, NOT_FOUND, EXISTS };
18
19 static
20 void
21 get_file_name(int id, char* fname)
22 {
23     sprintf(fname, "cliente_%d", id);
24 }
25
26 static
27 FILE*
28 open_file(int id, char* mode)
29 {
30     char fname[32];
31     get_file_name(id, fname);
32     FILE* fp = fopen(fname, mode);
33     if (!fp)
34     {
35         perror("Error al abrir archivo");
36         exit(1);
37     }
38     return fp;
39 }
40
41 static
42 void
43 write_token(int id, const char* token)
44 {
45     FILE* fp = open_file(id, "a");
46     if (fprintf(fp, "%s ", token) != (signed)strlen(token)+1)
47     {
48         perror("Error al escribir archivo");
49         exit(1);
50     }
51     fclose(fp);
52 }
53
54 int *
55 put_1_svc(char *payload, int id, int end,  struct svc_req *rqstp)
56 {
57     static int  result;
58
59     result = OK;
60     write_token(id, payload);
61     print_msg(stdout, "%d: recibido PUT '%s', end=%d\n", id, payload, end);
62     if (end)
63     {
64         FILE* fp = open_file(id, "r");
65         std::string buffer;
66         char token[256];
67         while (fscanf(fp, "%s", token) != EOF)
68             buffer += token;
69         fclose(fp);
70         print_msg(stdout, "%d: procesando PUT '%s'\n", id, buffer.c_str());
71         if (sets[id].find(buffer) == sets[id].end())
72             sets[id].insert(buffer);
73         else
74             result = EXISTS;
75         get_file_name(id, token);
76         remove(token); // Elimino archivo temporal
77     }
78
79     return &result;
80 }
81
82 int *
83 find_1_svc(char *payload, int id, int end,  struct svc_req *rqstp)
84 {
85     static int  result;
86
87     result = OK;
88     write_token(id, payload);
89     print_msg(stdout, "%d: recibido FIND '%s', end=%d\n", id, payload, end);
90     if (end)
91     {
92         FILE* fp = open_file(id, "r");
93         std::string buffer;
94         char token[256];
95         while (fscanf(fp, "%s", token) != EOF)
96             buffer += token;
97         fclose(fp);
98         print_msg(stdout, "%d: procesando FIND '%s'\n", id, buffer.c_str());
99         if (sets[id].find(buffer) == sets[id].end())
100             result = NOT_FOUND;
101         get_file_name(id, token);
102         remove(token); // Elimino archivo temporal
103     }
104
105     return &result;
106 }
107
108 int *
109 del_1_svc(char *payload, int id, int end,  struct svc_req *rqstp)
110 {
111     static int  result;
112
113     result = OK;
114     write_token(id, payload);
115     print_msg(stdout, "%d: recibido DEL '%s', end=%d\n", id, payload, end);
116     if (end)
117     {
118         FILE* fp = open_file(id, "r");
119         std::string buffer;
120         char token[256];
121         while (fscanf(fp, "%s", token) != EOF)
122             buffer += token;
123         fclose(fp);
124         print_msg(stdout, "%d: procesando DEL '%s'\n", id, buffer.c_str());
125         if (!sets[id].erase(buffer))
126             result = NOT_FOUND;
127         get_file_name(id, token);
128         remove(token); // Elimino archivo temporal
129     }
130
131     return &result;
132 }
133
134 int *
135 quit_1_svc(int id,  struct svc_req *rqstp)
136 {
137     static int  result;
138
139     result = OK;
140     print_msg(stdout, "%d: recibido QUIT, limpiando set\n", id);
141     if (!sets.erase(id))
142         result = NOT_FOUND;
143
144     return &result;
145 }
146
147 // vim: set et sw=4 sts=4 :