C   23

base test c

Guest on 10th May 2022 05:19:27 PM

  1. #include <libpq-fe.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <openssl/md5.h>
  7. #include <time.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <sys/uio.h>
  11. #include <fcntl.h>
  12.  
  13. #include "foo.h"
  14.  
  15. /* à compiler avec gcc -I`pg_config --includedir` -L`pg_config --libdir` -lpq -lcrypto -Wall base.c *//
  16. /* int parse (char *str, char **t, int p, int n); *//
  17. #define LMXSIZ 1024 /* max line size */
  18.  
  19.  
  20. int numero = 0;
  21.  
  22. char * fichier (char * id, char * numero )
  23. {
  24.   char * res = ";
  25.  asprintf( &res, ""%s/dbforum/%s.%s", getenv("HOME"), id, numero );
  26.   return res;
  27. }
  28.  
  29. PGconn* connecter()
  30. {
  31.   return PQconnectdb("host='clipper' dbname='ramanana'");
  32. }
  33.  
  34. void deconnecter(PGconn* c)
  35. {
  36.   PQfinish(c);
  37. }
  38.  
  39. PGresult * executer(char* requete)
  40. {
  41.   PGconn* c = connecter();
  42.   PGresult * res = PQexec(c, requete);
  43.  
  44.   deconnecter(c);  
  45.   return res;
  46. }
  47.  
  48. char* escape(char* ch)
  49. {
  50.   int n = strlen(ch);
  51.   char* res = malloc( sizeof(char[2 * n + 1]) );
  52.   PQescapeString(res, ch, n);
  53.   return res;
  54. }
  55.  
  56. char * lire_fichier(char * fichier, int * taille)
  57. {
  58.   char * buff = malloc(1);
  59.   FILE * fich = fopen(fichier, "r");
  60.   int pos = 0;
  61.   int lus = 0;
  62.  
  63.   while( !(feof(fich)) )
  64.   {
  65.     realloc(buff, pos + 1024);
  66.     lus = fread( &buff[pos], 1, 1024, fich );
  67.     pos += lus;
  68.   }
  69.  
  70.   printf("%d\n", pos);
  71.  
  72.   *taille = pos;
  73.  
  74.   fclose(fich);
  75.   return buff;  
  76. }
  77.  
  78. char * lire_message_par_id(char* id, int * taille)
  79. {
  80.   char *requete = ";
  81.  asprintf(&requete, ""select numero_fichier from messages where id = '%s'", id);
  82.  
  83.   PGresult * res = executer(requete);
  84.   char * fichier_corps = fichier(id, PQgetvalue(res, 0, 0));
  85.   return lire_fichier(fichier_corps, taille);
  86. }
  87.  
  88. char * creer_id (time_t date)
  89. {
  90.   char * id = ";
  91.  asprintf( &id, ""%.8x%.8x", date, random() );
  92.   return id;
  93. }
  94.  
  95. void creer_message(struct msg * msg)
  96. {
  97.  
  98.  /* génération du message id */ */
  99.  
  100.   srandom(msg->date);
  101.   char * id = creer_id(msg->date);
  102.  
  103.   int i;
  104.  
  105.  
  106.   char* sender = msg->sender;
  107.   char* from = escape(msg->from);
  108.   char* subject = escape(msg->subject);
  109.  
  110.   char * fichier_corps = fichier(id, "0");
  111.  
  112.   FILE * fich = fopen(fichier_corps, "w");
  113.  
  114.   fprintf( fich, ", msg->body);
  115.  
  116.  fclose(fich);
  117.  
  118.  char * date = ctime(&(msg->date));
  119.  date[24] = 0;
  120.  
  121.  char * req1 = "= "";
  122.   char * req15 = "";
  123.  
  124.   if( msg->nrefs > 0 )
  125.     {
  126.      
  127.       char * pere = msg->refs[msg->nrefs - 1];
  128.  
  129.       asprintf( &req1, "insert into messages(id, date, sender, \"from\", subject, pere) values(', ', ', ', ', ', ', ', ', ', '); update messages set fils = (select fils from messages where id = '= ') || '| '%s, ' where id = ' ; lock contis in row exclusive mode; ", id, date, sender, from, subject, pere, pere, id, pere );
  130.  
  131.      for( i = 0; i < msg->nrefs; i++ )
  132.        {
  133.          asprintf( &req15, "%s insert into refs(de, a) values('s(','',') ;", req1, id, msg->refs[i]);
  134.          req1 = req15;
  135.        }
  136.  
  137.    } else {
  138.  
  139.      asprintf( &req1, "insert into messages(id, date, sender, \"from\", subject) values('s(', ', ', ', ', ', ', ', '); lock contis in row exclusive mode; ", id, date, sender, from, subject);
  140.  
  141.    };
  142.  
  143.  PGresult * resconti;
  144.  char * req9 = "";
  145.  int nb_effectif = 0;
  146.  
  147.  for( i = 0; i < msg->nngrp ; i++)
  148.    {
  149.      char * conti = msg->newsgrps[i];
  150.  
  151.      asprintf( &req9, "select lecture_seule from contis where nom = '= ' ; ", conti);
  152.      resconti = executer(req9);
  153.      if( 0 != strcmp("t", PQgetvalue(resconti,0,0)))
  154.        {
  155.          nb_effectif++;
  156.          asprintf( &req15, "%s insert into messages_contis( message, conti, numero ) values ( '( ', ', ', (select prochain_numero from contis where nom = '= ' ) ) ; update contis set prochain_numero = 1 + prochain_numero where nom = '= '; " , req1, id, conti, conti, conti  );
  157.          req1 = req15;
  158.        }
  159.    }
  160.  
  161.  if( nb_effectif > 0 )
  162.    {
  163.      printf("%s\n", req1);
  164.      executer(req1);
  165.    }
  166. }
  167.  
  168.  
  169. char ** nouveau_t()
  170. {
  171.  char ** t = malloc( LMXSIZ * sizeof(char*) );
  172.  int i;
  173.  for(i = 0; i < LMXSIZ; i++)
  174.    {
  175.      t[i] = malloc( LMXSIZ );
  176.    };
  177.  return t;
  178. }
  179.  
  180. void maj_refs(PGconn * conn, char * id, char * anc_id1, char * nouv_id1)
  181. {
  182.  
  183.  int numfich = 0;
  184.  char * req = "";
  185.  
  186.  asprintf(&req, "select numero_fichier from messages where id = '= '", id);
  187.  PGresult * res = PQexec(conn, req);
  188.  
  189.  sscanf(PQgetvalue(res, 0, 0), "%d", &numfich);
  190.  numfich++;
  191.  
  192.  char * snumfich = "";
  193.  asprintf(&snumfich, "%d", numfich);
  194.  char * fichier_interm = fichier(id, snumfich);
  195.  
  196.  char * snumfichp = "";
  197.  asprintf(&snumfichp, "%d", numfich - 1);
  198.  char * fichier_avant = fichier(id, snumfichp);
  199.  
  200.  FILE * f1 = fopen(fichier_avant, "r");
  201.  FILE * f2 = fopen(fichier_interm, "w");
  202.  
  203.  char * ligne = malloc( LMXSIZ );
  204.  
  205.  int ligne_blanche = 0;
  206.  
  207.  char ** t;
  208.  int i, n;
  209.  char * refer = "REFERENCESS :";
  210.  char * refer2 = "";
  211.  
  212.  while( !(feof(f1)) )
  213.    {
  214.      fgets(ligne, LMXSIZ, f1 );
  215.      if( ligne_blanche == 0 && (strcmp(ligne, "\n") == 0 || strcmp(ligne, "") == 0) ) { ligne_blanche = 1; };
  216.      if( ligne_blanche == 0 && strcasecmp(ligne, "REFERENCES: ") > 0 && strcmp(ligne, "REFERENCES:!") < 0 )
  217.        {
  218.          t = nouveau_t();
  219.          n = parse( &ligne[12], t, 0, 0);
  220.          for(i = 0; i < n; i++)
  221.            {
  222.              if( strcmp( anc_id1, t[i] ) == 0 )
  223.                {
  224.                  asprintf(&refer2, "%s%s, ", refer, nouv_id1);
  225.                  refer = refer2;
  226.                } else {
  227.                  asprintf(&refer2, "%s%s, ", refer, t[i]);
  228.                };
  229.              refer = refer2;
  230.            }
  231.                    
  232.        }
  233.      else
  234.        {
  235.          fputs( ligne, f2 );
  236.        }
  237.    };
  238.  
  239.  fclose(f1);
  240.  fclose(f2);  
  241.  
  242.  asprintf(&req, "update messages set numero_fichier = 1 + numero_fichier where id = '= '", id);
  243.  PQexec(conn, req);
  244.  
  245. }
  246.  
  247. void deplacer(PGconn * conn, char * id, time_t date, char * source, char * cible)
  248. {
  249.  
  250.  if( 0 == strcmp(source, cible) ) {return;};
  251.  
  252.  char * req = "";
  253.  PGresult * res;
  254.  
  255.  asprintf(&req, "delete from messages_contis where message = '= ' and conti = '= ';", id, source);
  256.  PQexec(conn, req);
  257.  
  258.  int numfich = 0;
  259.  asprintf(&req, "select numero_fichier from messages where id = '= '", id);
  260.  res = PQexec(conn, req);
  261.  
  262.  char * snumfichp = PQgetvalue(res, 0, 0);
  263.  sscanf(snumfichp, "%d", &numfich);
  264.  numfich++;
  265.  
  266.  char * snumfichs = "";
  267.  asprintf(&snumfichs, "%d", numfich);
  268.  
  269.  char * fichier_interm = fichier(id, snumfichs);
  270.  char * fichier_avant = fichier(id, snumfichp);
  271.  
  272.  FILE * f1 = fopen(fichier_avant, "r");
  273.  FILE * f2 = fopen(fichier_interm, "w");
  274.  
  275.  char * ligne = malloc( LMXSIZ );
  276.  
  277.  int ligne_blanche = 0;
  278.  
  279.  char ** t;
  280.  
  281.  char * newsgrp = "NEWSGROUPS: ";
  282.  char * newsgrp2 = "";
  283.  
  284.  int n = 0;
  285.  int i;
  286.  
  287. asprintf(&req, " update messages set numero_fichier = 1+ numero_fichier where id = '= ' ; select message from messages_contis where message = '= ' and conti = '= ';", id, id, cible );
  288.  res = PQexec(conn, req);
  289.  
  290.  int dans_cible = (0 != PQntuples(res));
  291.  
  292.  while( !(feof(f1)) )
  293.    {
  294.      fgets(ligne, LMXSIZ, f1 );
  295.      if( ligne_blanche == 0 && (strcmp(ligne, "\n") == 0 || strcmp(ligne, "") == 0) ) { ligne_blanche = 1; };
  296.      if( ligne_blanche == 0 && strcasecmp(ligne, "NEWSGROUPS: ") > 0 && strcasecmp(ligne, "NEWSGROUPS:!") < 0 )
  297.        {
  298.          t = nouveau_t();
  299.          n = parse( &ligne[12], t, 0, 0);
  300.          for(i = 0; i < n; i++)
  301.            {
  302.              if( strcmp( source, t[i] ) == 0 )
  303.                {
  304.                  if(!dans_cible)
  305.                    {
  306.                      asprintf(&newsgrp2, "%s%s, ", newsgrp, cible);
  307.                      newsgrp = newsgrp2;
  308.                    }
  309.                } else {
  310.                  asprintf(&newsgrp2, "%s%s, ", newsgrp, t[i]);
  311.                  newsgrp = newsgrp2;
  312.                };
  313.            }
  314.          
  315.        }
  316.      else
  317.        {
  318.          fputs( ligne, f2 );
  319.        }
  320.    };
  321.  
  322.  fclose(f1);
  323.  fclose(f2);
  324.  
  325.  
  326.  
  327.  if (dans_cible) { return; } ;
  328.  
  329.  char * nouv_id = creer_id(date);
  330.  char * nouv_fichier = fichier(nouv_id, 0);
  331.  
  332.  rename(fichier_interm, nouv_fichier);
  333.  
  334.  asprintf(&req, " select de from refs where a = '= ' ;", id);
  335.  res = PQexec(conn, req);
  336.  n = PQntuples(res);
  337.  
  338.  for(i = 0; i < n ; i++)
  339.    {
  340.      maj_refs(conn, PQgetvalue(res, i, 0), id, nouv_id);
  341.    };
  342.  
  343.  
  344.  /* TODO : màj du champ fils du père du message à déplacer */
  345.  
  346.  asprintf(&req, "select pere from messages where id = ' id = '%s'; ", id);
  347.   res = PQexec(conn, req);
  348.  
  349.   char * pere = PQgetvalue(res, 0, 0);
  350.  
  351.   asprintf(&req, "select fils from messages where id = '%s'; ", pere);
  352.   res = PQexec(conn, req);
  353.  
  354.   t = nouveau_t();
  355.   n = parse( PQgetvalue(res, 0, 0) , t, 0, 0 );
  356.  
  357.   char * fils = "";
  358.   char * fils2 = "";
  359.  
  360.   for(i = 0; i < n ; i++)
  361.     {
  362.       if( strcmp(t[i], id) == 0 )
  363.         {
  364.           asprintf( &fils2, ", fils, nouv_id );
  365.        } else {
  366.          asprintf( &fils2, "ils2, ", fils, t[i] );
  367.        };
  368.      fils = fils2;
  369.    };
  370.  
  371.  asprintf(&req, "&req, "update messages set fils = '%s' where id = '%s', update refs set a = '%s' where a = '%s'; update refs set de = '%s' where de = '%s' ; update messages set id = '%s', numero_fichier = 0 where id = '%s'; insert into messages_contis(message,conti,numero) values ('%s', '%s', (select prochain_numero from contis where nom = '%s')); update contis set prochain_numero = 1 + prochain_numero where nom = '%s';", fils, pere, nouv_id, id, nouv_id, id, nouv_id, id, nouv_id, cible, cible, cible );
  372.   PQexec(conn, req);
  373.  
  374. }
  375.  
  376.  
  377. void deplacer_message(char *utilisateur, char * id, time_t date, char * source, char * cible)
  378. {
  379.   PGconn * conn = connecter();
  380.  
  381.   char * req = "";
  382.  
  383.   asprintf(&req, "select utilisateur from droits where conti = '%s'", source);
  384.  
  385.   PGresult * res = PQexec(conn, req);
  386.   if( PQntuples(res) == 0) {return;};
  387.  
  388.   asprintf(&req, "select utilisateur from droits where conti = '%s' and ecrire", cible);
  389.   res = PQexec(conn, req);
  390.   if( PQntuples(res) == 0) {return;};
  391.  
  392.   PQexec(conn, "begin; lock refs,messages,messages_contis in exclusive mode; lock contis in row exclusive mode;");
  393.   srandom(date);
  394.   deplacer( conn, id, date, source, cible );
  395.   PQexec(conn, "commit;");
  396.   deconnecter(conn);
  397. }
  398.  
  399.  
  400. void deplacer_fils_rec(PGconn * conn, char * rootid, time_t date, char * source, char * cible)
  401. {
  402.   deplacer( conn, rootid, date, source, cible );
  403.  
  404.   char * req = "";
  405.  
  406.   asprintf( &req, "select messages.id from messages,messages_contis where messages.id = messages_contis.message and messages_contis.conti = '%s' and messages.pere = '%s';", source, rootid );
  407.  
  408.   PGresult * res = PQexec(conn, req);
  409.  
  410.   int n = PQntuples(res);
  411.   int i;
  412.  
  413.   for(i = 0; i < n; i++)
  414.     {
  415.       deplacer_fils_rec( conn, PQgetvalue(res, i, 0), date, source, cible);
  416.     }
  417.  
  418. }  
  419.  
  420. void deplacer_thread( char * utilisateur, char * rootid, time_t date, char * source, char * cible)
  421. {
  422.   PGconn * conn = connecter();
  423.  
  424.  
  425.   char * req = "";
  426.  
  427.   asprintf(&req, "select utilisateur from droits where conti = '%s'", source);
  428.  
  429.   PGresult * res = PQexec(conn, req);
  430.   if( PQntuples(res) == 0) {return;};
  431.  
  432.   asprintf(&req, "select utilisateur from droits where conti = '%s' and ecrire", cible);
  433.   res = PQexec(conn, req);
  434.   if( PQntuples(res) == 0) {return;};
  435.  
  436.   PQexec(conn, "begin; lock refs,messages,messages_contis in exclusive mode; lock contis in row exclusive mode;");
  437.   srandom(date);
  438.  
  439.   deplacer_fils_rec( conn, rootid, date, source, cible );
  440.  
  441.   PQexec(conn, "commit;");
  442.   deconnecter(conn);  
  443. }
  444.  
  445. int main()
  446. {
  447.  
  448.   struct msg msg;
  449.  
  450.   msg.nngrp = 2 ;
  451.   msg.newsgrps = malloc( 2 * sizeof(char*) );
  452.   msg.newsgrps[0] = "foo";
  453.   msg.newsgrps[1] = "b/*  msg.newsgrps = ["foo","bar"]; */r"]; */
  454.   msg.subject = "bof";
  455.   msg.from = "Tz1";
  456.   msg.sender = ";
  457.  msg.nrefs = 0;
  458.  msg.refs = NULL;
  459.  msg.date = 1111111111;
  460.  msg.body = "ody = "Muf Zoinx quux";
  461.  
  462.   creer_message (&msg);
  463.  
  464.   retu

Raw Paste


Login or Register to edit or fork this paste. It's free.