GRASS GIS 7 Programmer's Manual  7.0.2(2015)-r00000
rowio/get.c
Go to the documentation of this file.
1 
14 #include <stdio.h>
15 #include <grass/rowio.h>
16 
17 static void *my_select(ROWIO *, int);
18 static void pageout(ROWIO *, int);
19 
20 
41 void *Rowio_get(ROWIO * R, int row)
42 {
43  int i;
44  int age;
45  int cur;
46 
47  if (row < 0)
48  return NULL;
49 
50  if (row == R->cur)
51  return R->buf;
52 
53  for (i = 0; i < R->nrows; i++)
54  if (row == R->rcb[i].row)
55  return my_select(R, i);
56 
57  age = 0;
58  cur = 0;
59 
60  for (i = 0; i < R->nrows; i++)
61  if (R->rcb[i].row < 0) { /* free slot ! */
62  cur = i;
63  break;
64  }
65  else if (age < R->rcb[i].age) {
66  cur = i;
67  age = R->rcb[i].age;
68  }
69 
70  pageout(R, cur);
71 
72  i = (*R->getrow) (R->fd, R->rcb[cur].buf, R->rcb[cur].row = row, R->len);
73  R->rcb[cur].dirty = 0;
74  if (!i) {
75  R->rcb[cur].row = -1;
76  if (cur == R->cur)
77  R->cur = -1;
78  return NULL;
79  }
80 
81  return my_select(R, cur);
82 }
83 
89 void Rowio_flush(ROWIO * R)
90 {
91  int i;
92 
93  for (i = 0; i < R->nrows; i++)
94  pageout(R, i);
95 }
96 
97 static void pageout(ROWIO * R, int cur)
98 {
99  if (R->rcb[cur].row < 0)
100  return;
101  if (!R->rcb[cur].dirty)
102  return;
103  (*R->putrow) (R->fd, R->rcb[cur].buf, R->rcb[cur].row, R->len);
104  R->rcb[cur].dirty = 0;
105 }
106 
107 static void *my_select(ROWIO * R, int n)
108 {
109  int i;
110 
111  R->rcb[n].age = 0;
112  for (i = 0; i < R->nrows; i++)
113  R->rcb[i].age++;
114  R->cur = R->rcb[n].row;
115  R->buf = R->rcb[n].buf;
116  return R->buf;
117 }
void Rowio_flush(ROWIO *R)
Flush data.
Definition: rowio/get.c:89
#define NULL
Definition: ccmath.h:32
void * Rowio_get(ROWIO *R, int row)
Read a row.
Definition: rowio/get.c:41