homme.io
Clean.Precise.Quick.
..
[env]
[sources]
[Makefile]
[sakura.service]
[C client]
[resty/sakura.lua]
[lua client]
Performance test
[2do list]
Моно-но аварэ
Сакура в японской культуре

[C client]

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"
#include "unistd.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "netinet/in.h"
#include "arpa/inet.h"

#ifdef UNIX
#define SOC_FILE            "/var/run/soc"
#endif

#define MAX_LEN           4000
#define TEXT_LEN          3730


int _get_byte4(unsigned char *a)
{
  return  a[0] | (a[1] << 8) | (a[2] << 16) | (a[3] << 24);
}

void write_answer(int soc, char typ, char *a)
{
  if (typ == 'G')
  {
    char dummy[3];
    dummy[0] = 'S';
    dummy[1] = 'O';
    dummy[2] = 'G';
    write(soc, dummy, 3);
    return;
  }

  if (typ == 'D')
  {
    char dummy[3];
    dummy[0] = 'S';
    dummy[1] = 'O';
    dummy[2] = 'D';
    write(soc, dummy, 3);
    return;
  }


  int n = strlen(a);
  unsigned char d[n+7]; //+8 if we uncomment d[i+7] = '\0';
  int rc;

  d[0] = 'S';  //(S)akura protocol
  d[1] = 'O';  //(O)racle database
  d[2] = typ;

  d[3] = n & 0xFF;
  d[4] = (n >> 8) & 0xFF;
  d[5] = (n >> 16) & 0xFF;
  d[6] = (n >> 24) & 0xFF;

  int i=0;
  while(a[i]){
    d[i+7] = a[i];
    i++;
  }
  //d[i+7] = '\0';

  rc = write(soc, d, i+7);
  if (rc<0)
  {
    perror("write answer failure");
    exit(EXIT_FAILURE);
  }
}



int main(void)
{
  int soc;
#ifdef UNIX
  struct sockaddr_un addr;
#else
  struct sockaddr_in addr;
#endif

  unsigned char packet_len[4];

  int rc;

  char header[3];
  char answer[MAX_LEN];

#ifdef UNIX
  soc = socket(AF_UNIX, SOCK_STREAM, 0);
  if(soc == -1) {
    perror("get socket failed");
    exit(EXIT_FAILURE);
  }

  memset(&addr, 0, sizeof(addr));
  addr.sun_family = AF_UNIX;
  strcpy(addr.sun_path, SOC_FILE);
#else
  soc = socket(AF_INET, SOCK_STREAM, 0);

  addr.sin_family = AF_INET;
  addr.sin_port = htons(2733);
#endif

  rc = connect(soc, (struct sockaddr *)&addr, sizeof(addr));
  if (rc == -1) {
    perror("client connect failed");
    exit(EXIT_FAILURE);
  }


  char s[100] = "pax/pax";
  int len;

//connect

  write_answer(soc, 'C', s);

  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for connect failed");
    exit(EXIT_FAILURE);
  }

  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for connect failed");
    exit(EXIT_FAILURE);
  }

  len = _get_byte4(packet_len);
  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for connect failed");
    exit(EXIT_FAILURE);
  }
  answer[len] = '\0';

//select
  //char sel[100] = "select f2 from t1 where f1=7";

  char sel[300] = "select n, praenomen, brevis, dsc, fd  from praenomen_masc where sysdate between fd and td and rownum<=2"; 
  write_answer(soc, 'S', sel);

  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for select failed");
    exit(EXIT_FAILURE);
  }

  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for select failed");
    exit(EXIT_FAILURE);
  }

  len = _get_byte4(packet_len);
  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for select failed");
    exit(EXIT_FAILURE);
  }
  answer[len] = '\0';
  printf("%s\n", answer);


//disconnect
  write_answer(soc, 'D', s);

  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for disconnect failed");
    exit(EXIT_FAILURE);
  }

  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for disconnect failed");
    exit(EXIT_FAILURE);
  }

  len = _get_byte4(packet_len);
  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for disconnect failed");
    exit(EXIT_FAILURE);
  }
//  printf("%s\n", answer);



/*
  write_answer(soc, 'G', s);

  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for disconnect failed");
    exit(EXIT_FAILURE);
  }

  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for disconnect failed");
    exit(EXIT_FAILURE);
  }

  len = _get_byte4(packet_len);

  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for connect failed");
    exit(EXIT_FAILURE);
  }
  answer[TEXT_LEN] = '\0';
  printf("%s\n", answer);
*/

  close(soc);
  exit(EXIT_SUCCESS);
}

sdmrnv, 2022-09-04 [0.406ms, s]