GRASS Programmer's Manual  6.5.svn(2014)-r66266
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
rowio/get.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <grass/rowio.h>
3 
4 static void *my_select(ROWIO *, int);
5 static void pageout(ROWIO *, int);
6 
7 
31 void *rowio_get(ROWIO * R, int row)
32 {
33  int i;
34  int age;
35  int cur;
36 
37  if (row < 0)
38  return NULL;
39 
40  if (row == R->cur)
41  return R->buf;
42 
43  for (i = 0; i < R->nrows; i++)
44  if (row == R->rcb[i].row)
45  return my_select(R, i);
46 
47  age = 0;
48  cur = 0;
49 
50  for (i = 0; i < R->nrows; i++)
51  if (R->rcb[i].row < 0) { /* free slot ! */
52  cur = i;
53  break;
54  }
55  else if (age < R->rcb[i].age) {
56  cur = i;
57  age = R->rcb[i].age;
58  }
59 
60  pageout(R, cur);
61 
62  i = (*R->getrow) (R->fd, R->rcb[cur].buf, R->rcb[cur].row = row, R->len);
63  R->rcb[cur].dirty = 0;
64  if (!i) {
65  R->rcb[cur].row = -1;
66  if (cur == R->cur)
67  R->cur = -1;
68  return NULL;
69  }
70 
71  return my_select(R, cur);
72 }
73 
74 void rowio_flush(ROWIO * R)
75 {
76  int i;
77 
78  for (i = 0; i < R->nrows; i++)
79  pageout(R, i);
80 }
81 
82 static void pageout(ROWIO * R, int cur)
83 {
84  if (R->rcb[cur].row < 0)
85  return;
86  if (!R->rcb[cur].dirty)
87  return;
88  (*R->putrow) (R->fd, R->rcb[cur].buf, R->rcb[cur].row, R->len);
89  R->rcb[cur].dirty = 0;
90 }
91 
92 static void *my_select(ROWIO * R, int n)
93 {
94  int i;
95 
96  R->rcb[n].age = 0;
97  for (i = 0; i < R->nrows; i++)
98  R->rcb[i].age++;
99  R->cur = R->rcb[n].row;
100  R->buf = R->rcb[n].buf;
101  return R->buf;
102 }
void rowio_flush(ROWIO *R)
Definition: rowio/get.c:74
void * rowio_get(ROWIO *R, int row)
read a row
Definition: rowio/get.c:31
return NULL
Definition: dbfopen.c:1394
int n
Definition: dataquad.c:291